自然语言处理_AI文本翻译【玩转华为云】

举报
DS小龙哥 发表于 2022/07/31 22:46:44 2022/07/31
【摘要】 机器翻译的最大的优点就是速度快,输入一段文字,瞬间就能看到结果,特别是查询外文文献资料时,有个快速的翻译工具是非常方便的。目前,华为云除了提供了整段文字翻译接口外,还实现了对整篇文章的翻译,这样的速度是人工所不能比拟的。

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. 翻译工具运行效果

下面是利用华为云的文本翻译接口做的翻译工具效果:

image-20220731221346330

image-20220731221542597

image-20220731221559974

image-20220731221634168

image-20220731221656893

实现的功能与其他常见的翻译工具差不多:

image-20220731221827548

image-20220731221922805

image-20220731222000526

3. 文本翻译

官网对于帮助文本翻译接口的介绍链接:

https://support.huaweicloud.com/api-nlp/nlp_03_0024.html

image-20220731213941298

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"
    }  

请求参数的说明:

参数名 参数类型 必选 说明
text String 仅支持utf-8编码,长度不超过2000字符。一个汉字、英文字母、标点符号等,均计为一个字符。
from String 翻译原语言
to String 翻译目标语言
scene String 默认为"common",当前只有通用场景。

3.2 在线调试

在线调试接口地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=NLP&api=RunTextTranslation

编写代码前,可以通过在线调试接口体验接口的功能效果,了解参数的传递与返回参数的格式。

image-20220731214336368

请求参数与响应参数格式如下:

请求体:
{
 "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

image-20220731214948996

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代码实现

image-20220731221323323

/*
功能: 获取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. 总结

机器翻译的最大的优点就是速度快,输入一段文字,瞬间就能看到结果,特别是查询外文文献资料时,有个快速的翻译工具是非常方便的。目前,华为云除了提供了整段文字翻译接口外,还实现了对整篇文章的翻译,这样的速度是人工所不能比拟的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。