自然语言处理 _AI 文本翻译
- 2023-05-02 重庆
本文字数:6368 字
阅读完需:约 21 分钟
1. 前言
在人工智能技术发展的推动下,机器翻译的水平在不断提高,翻译领域也取得了前所未有的成就。在翻译工作中,可以借助各种翻译系统或软件完成翻译任务,这样可以提高翻译的速度和准确度,提高了翻译工作的效率。有了机器翻译系统,从侧面推动了经济的发展,社会的进步,消除了世界人与人之间的语言障碍,沟通了整个世界,促进了交流,加快了全球化进程。
华为云推出的自然语言处理(Natural Language Processing,简称 NLP)是一款基于人工智能技术,针对各类企业及开发者提供的用于文本分析及挖掘的云服务,可以帮助用户高效的处理文本,常用于智能问答系统、文本分析、内容推荐、翻译等场景。
目前自然语言处理包含了以下相关的服务:
(1)自然语言处理基础(Natural Language Processing Fundamentals),为用户提供包括分词、命名实体识别、关键词提取、短文本相似度等自然语言相关的API,可用于智能问答、对话机器人、内容推荐、电商评价分析等场景中。
(2)语言生成(Language Generation,简称LG),为用户提供包括文本摘要等语言生成相关的API,可用于新闻摘要生成、文献摘要生成、搜索结果片段生成、商品评论摘要等场景中。
(3)语言理解(Language Understanding,简称LU),为用户提供包括文本分类、情感分析等语言理解相关的API,可用于情感分析、内容检测、广告识别等场景中。
(4)机器翻译(Machine Translation,简称MT),为用户提供快速准确的翻译服务,帮助用户跨语言沟通,可用于文档翻译等场景中。
所具备的优势如下:
功能全面
提供多种常用自然语言类的算法模型及解决方案,可覆盖不同行业的各类需求。
高效精准
可快速分析大数据量的文本,深度理解文本语义,更加精准的挖掘出文本中的关键信息。
简单易用
简单易用的API接口。无需下载SDK、购买服务器,支持跨平台调用。丰富的产品种类,可一站式开通、部署。
稳定可靠
故障自动迁移,服务可用性达99.95%,保障业务连续。数据多副本,数据持久性99.99995%,保障数据不丢失。
当前文章主要是介绍华为云自然语言处理里面的机器翻译接口,利用机器翻译开发一款语言翻译小工具,接下来就详细介绍机器翻译的接口详细使用办法。
2. 翻译工具运行效果
下面是利用华为云的文本翻译接口做的翻译工具效果:
实现的功能与其他常见的翻译工具差不多:
3. 文本翻译
官网对于帮助文本翻译接口的介绍链接:
https://support.huaweicloud.com/api-nlp/nlp_03_0024.html
3.1 翻译接口介绍
文本翻译是为了实现语种间的转换,对于用户输入原始语种的文本,转换为目标语种的文本。
当前华为云的文本翻译接口支持的语言列表如下:
zh 中文
en 英文
ja 日文
ru 俄文
ko 韩语
fr 法语
es 西班牙语
de 德语
ar 阿拉伯语
pt 葡萄牙语
auto 自动检测输入语种并翻译成目标语种,需要指定目标语种。
文本翻译的请求接口与请求参数:
POST https://{endpoint}/v1/{project_id}/machine-translation/text-translation
Request Header:
Content-Type:application/json
X-Auth-Token: MIINRwYJKoZIhvcNAQcCoIINODCCDTQCAQExDTALBglghkgBZQMEAgEwgguVBgkqhkiG...
Request Body:
{
"text": "欢迎使用机器翻译服务",
"from": "zh",
"to": "en",
"scene":"common"
}
请求参数的说明:
3.2 在线调试
在线调试接口地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=NLP&api=RunTextTranslation
编写代码前,可以通过在线调试接口体验接口的功能效果,了解参数的传递与返回参数的格式。
请求参数与响应参数格式如下:
请求体:
{
"text": "你好,世界",
"from": "zh",
"to": "en",
"scene": "common"
}
响应体:
{
"src_text": "你好,世界",
"translated_text": "Hello, world",
"from": "zh",
"to": "en"
}
3.3 文本翻译计费说明
文档地址: https://www.huaweicloud.com/pricing.html?tab=detail#/nlp
3.4 文本翻译请求示例代码
(1)Python3 语言请求代码示例
# -*- coding: utf-8 -*-
# 此demo仅供测试使用,建议使用sdk。需提前安装requests,执行pip install requests
import requests
import json
def nlp_demo():
url = 'https://{endpoint}/v1/{project_id}/machine-translation/text-translation' # endpoint和project_id需替换
token = '用户对应region的token'
header = {
'Content-Type': 'application/json',
'X-Auth-Token': token
}
body = {
'text': '欢迎使用机器翻译服务',
'from': 'zh',
'to': 'en',
'scene': 'common'
}
resp = requests.post(url, data=json.dumps(body), headers=header)
print(resp.text)
if __name__ == '__main__':
nlp_demo()
(2)Java 语言请求代码示例
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class NLPDemo {
public void nlpDemo() {
try {
//endpoint和projectId需要替换成实际信息。
URL url = new URL("https://{endpoint}/v1/{project_id}/machine-translation/text-translation");
String token = "对应region的token";
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.addRequestProperty("Content-Type", "application/json");
connection.addRequestProperty("X-Auth-Token", token);
//输入参数
String text = "It is a good day";
String from = "en";
String to = "zh";
String body = "{\"text\":\"" + text + "\" ,\"from\":\"" + from + "\" ,\"to\":\"" + to + "\" ,\"scene\":\"common\"}";
OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
osw.append(body);
osw.flush();
InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
while (br.ready()) {
System.out.println(br.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
NLPDemo nlpDemo = new NLPDemo();
nlpDemo.nlpDemo();
}
}
(3)C++语言(Qt)请求代码示例
//文本翻译
void Widget::on_pushButton_translate_clicked()
{
function_select=0;
QString requestUrl;
QNetworkRequest request;
//设置请求地址
QUrl url;
//一句话识别的请求地址
requestUrl = QString("https://nlp-ext.%1.myhuaweicloud.com/v1/%2/machine-translation/text-translation")
.arg(SERVER_ID)
.arg(PROJECT_ID);
qDebug()<<"requestUrl:"<<requestUrl;
//设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//设置token
request.setRawHeader("X-Auth-Token",Token);
//构造请求
url.setUrl(requestUrl);
request.setUrl(url);
//待翻译的文本
QString src_text=ui->plainTextEdit_old->toPlainText();
//文本为空就不翻译
if(src_text.isEmpty())return;
//翻译的语种
QString src_text_type=ui->comboBox_old->currentText().section(' ',0,0);
QString old_text_type=ui->comboBox_new->currentText().section(' ',0,0);
//设置请求参数
QString post_param=QString
("{"
"\"text\": \"%1\","
"\"from\": \"%2\","
"\"to\": \"%3\","
"\"scene\": \"common\""
"}").arg(src_text).arg(src_text_type).arg(old_text_type);
qDebug()<<"请求URL:"<<post_param;
//发送请求
manager->post(request, post_param.toUtf8());
}
(4)成功响应示例
{
"src_text": "欢迎使用机器翻译服务",
"translated_text": "Welcome to use machine translation services",
"from": "zh",
"to": "en"
}
(5)失败响应示例
{
"error_code": "NLP.0101",
"error_msg": "Authentication failed. Verify the token."
}
4. Qt 代码实现
/*
功能: 获取token
*/
void Widget::GetToken()
{
//表示获取token
function_select=3;
QString requestUrl;
QNetworkRequest request;
//设置请求地址
QUrl url;
//获取token请求地址
requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
.arg(SERVER_ID);
//自己创建的TCP服务器,测试用
//requestUrl="http://10.0.0.6:8080";
//设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
//构造请求
url.setUrl(requestUrl);
request.setUrl(url);
QString text =QString("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":"
"{\"user\":{\"domain\": {"
"\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}},"
"\"scope\":{\"project\":{\"name\":\"%4\"}}}}")
.arg(MAIN_USER)
.arg(IAM_USER)
.arg(IAM_PASSWORD)
.arg(SERVER_ID);
//发送请求
manager->post(request, text.toUtf8());
}
//解析反馈结果
void Widget::replyFinished(QNetworkReply *reply)
{
QString displayInfo;
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//读取所有数据
QByteArray replyData = reply->readAll();
qDebug()<<"状态码:"<<statusCode;
qDebug()<<"反馈的数据:"<<QString(replyData);
//更新token
if(function_select==3)
{
displayInfo="token 更新失败.";
//读取HTTP响应头的数据
QList<QNetworkReply::RawHeaderPair> RawHeader=reply->rawHeaderPairs();
qDebug()<<"HTTP响应头数量:"<<RawHeader.size();
for(int i=0;i<RawHeader.size();i++)
{
QString first=RawHeader.at(i).first;
QString second=RawHeader.at(i).second;
if(first=="X-Subject-Token")
{
Token=second.toUtf8();
displayInfo="token 更新成功.";
//保存到文件
SaveDataToFile(Token);
break;
}
}
qDebug()<<displayInfo;
return;
}
//判断状态码
if(200 != statusCode)
{
//解析数据
QJsonParseError json_error;
QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
//判断是否是对象,然后开始解析数据
if(document.isObject())
{
QString error_str="";
QJsonObject obj = document.object();
QString error_code;
//解析错误代码
if(obj.contains("error_code"))
{
error_code=obj.take("error_code").toString();
error_str+="错误代码:";
error_str+=error_code;
error_str+="\n";
}
if(obj.contains("error_msg"))
{
error_str+="错误消息:";
error_str+=obj.take("error_msg").toString();
error_str+="\n";
}
//显示错误代码
qDebug()<<error_str;
}
}
return;
}
//文本翻译
if(function_select==0)
{
//解析数据
QJsonParseError json_error;
QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
//判断是否是对象,然后开始解析数据
if(document.isObject())
{
QString error_str="";
QJsonObject obj = document.object();
QString error_code;
if(obj.contains("translated_text"))
{
QString text=obj.take("translated_text").toString();
ui->plainTextEdit_new->setPlainText(text);
}
}
}
}
}
//文本翻译
void Widget::on_pushButton_translate_clicked()
{
function_select=0;
QString requestUrl;
QNetworkRequest request;
//设置请求地址
QUrl url;
//一句话识别的请求地址
requestUrl = QString("https://nlp-ext.%1.myhuaweicloud.com/v1/%2/machine-translation/text-translation")
.arg(SERVER_ID)
.arg(PROJECT_ID);
qDebug()<<"requestUrl:"<<requestUrl;
//设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//设置token
request.setRawHeader("X-Auth-Token",Token);
//构造请求
url.setUrl(requestUrl);
request.setUrl(url);
//待翻译的文本
QString src_text=ui->plainTextEdit_old->toPlainText();
//文本为空就不翻译
if(src_text.isEmpty())return;
//翻译的语种
QString src_text_type=ui->comboBox_old->currentText().section(' ',0,0);
QString old_text_type=ui->comboBox_new->currentText().section(' ',0,0);
//设置请求参数
QString post_param=QString
("{"
"\"text\": \"%1\","
"\"from\": \"%2\","
"\"to\": \"%3\","
"\"scene\": \"common\""
"}").arg(src_text).arg(src_text_type).arg(old_text_type);
qDebug()<<"请求URL:"<<post_param;
//发送请求
manager->post(request, post_param.toUtf8());
}
5. 总结
机器翻译的最大的优点就是速度快,输入一段文字,瞬间就能看到结果,特别是查询外文文献资料时,有个快速的翻译工具是非常方便的。目前,华为云除了提供了整段文字翻译接口外,还实现了对整篇文章的翻译,这样的速度是人工所不能比拟的。
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/c254772ca44eea02936eb74da】。文章转载请联系作者。
DS小龙哥
之所以觉得累,是因为说的比做的多。 2022-01-06 加入
熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域
评论