【愚公系列】2022年12月 .NET CORE工具案例-多语言离线翻译系统

举报
愚公搬代码 发表于 2022/12/30 23:15:44 2022/12/30
【摘要】 前言 1.在线翻译在线翻译,一般是指在线翻译工具,如百度翻译、阿里翻译1688或Google翻译等。这类翻译工具的作用是利用计算机程序将一种自然语言(源语言)转换为另一种自然语言(目标语言)。其原理是依托海量的互联网数据资源和自然语言处理技术,在数百万篇文档中查找各种模式,以求解最佳翻译。这种在大量文本中查找各种范例的过程称为“统计机器翻译”。由于译文是由机器生成的,因此并不是所有的译文都...

前言

1.在线翻译

在线翻译,一般是指在线翻译工具,如百度翻译、阿里翻译1688或Google翻译等。这类翻译工具的作用是利用计算机程序将一种自然语言(源语言)转换为另一种自然语言(目标语言)。其原理是依托海量的互联网数据资源和自然语言处理技术,在数百万篇文档中查找各种模式,以求解最佳翻译。

这种在大量文本中查找各种范例的过程称为“统计机器翻译”。由于译文是由机器生成的,因此并不是所有的译文都是完美的。这就是为什么翻译的准确性有时会因语言的不同而有所差异。

2.离线翻译

离线翻译是指在没有联网的情况下仍然可以运行翻译功能,这就需要你的本地电脑中有离线翻译包!只有有了离线翻译包,离线翻译功能才能正常使用。

一、多语言离线翻译系统

1.开发环境

  • 系统环境:WIN11
  • 开发环境:VS2022
  • 开发语言环境:Python3.9 + .NET 7

2.准备离线翻译包

离线翻译包网站:https://huggingface.co/Helsinki-NLP

在这里插入图片描述
Models里面有上千个语言模型,根据自己需要进行下载
在这里插入图片描述

此处,我选了二个模型,分别是英汉/汉英的翻译模型。
在这里插入图片描述

3.准备python代码

# 离线翻译服务代码
import os
from flask import Flask, request
from gevent import pywsgi
from transformers import pipeline, AutoModelWithLMHead, AutoTokenizer
import warnings, requests
warnings.filterwarnings('ignore')

try:
    print('\n\n 翻译服务 Designed by:yg \n\n\n')
    print('正在加载【汉语-英语】翻译模型... ...')
    
    # 英文翻译成中文
    # AutoModelForSeq2SeqLM.from_pretrained
    model = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
    tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
    translation = pipeline("translation_en_to_zh", model=model, tokenizer=tokenizer)
    
    #text = "Student accommodation centres, resorts"
    #translated_text = translation(text, max_length=40)[0]['translation_text']

    print('正在加载【英语-汉语】翻译模型... ...')
    # 中文翻译成英文
    model_zh2de = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-zh-en")
    tokenizer_zh2de = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-zh-en")
    translation_en2zh = pipeline("translation_zh_to_en", model=model_zh2de, tokenizer=tokenizer_zh2de)
    
    app = Flask(__name__)

    @app.route('/yg-translater', methods=['POST'])
    def translate():
        mod = request.form['mod']
        text = request.form['text']

        if mod == 'en2zh':
            result = translation(text, max_length=10240)[0]['translation_text']
            return result
        if mod == 'zh2en':
            result = translation_en2zh(text, max_length=10240)[0]['translation_text']
            return result

    print('翻译服务已启动,请通过api形式访问该服务地址:http://127.0.0.1:16888/yg-translater')
    server = pywsgi.WSGIServer(('0.0.0.0', 16888), app)
    server.serve_forever()

except:
    print('翻译服务存在异常... ...')


注意必须需要多安装下面包,不然会报错

pip install sentencepiece

在这里插入图片描述
启动程序会自动加载模型
在这里插入图片描述
下载的模型,会自动下载到当前用户文件夹下,具体效果如下图所示。所以如果某个服务器没有外网,也可以直接拷贝该.cache文件夹到指定服务器下面的某用户下,也可以被识别
在这里插入图片描述

4.调试翻译结果

打开Apifox做个接口测试,对应工具还有postman等等大家可以根据自己的喜欢选择。

1、英文译中文
在这里插入图片描述
Sharp tools make good work(工欲善其事,必先利其器)似乎有点不尽人意

2、中文译英文

在这里插入图片描述
工欲善其事,必先利其器(If you want to work well, you’ll be able to use it first.)

5.Python翻译服务对接到.NET Core

Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
//注入HttpClient
builder.Services.AddHttpClient();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();


app.MapControllers();

app.Run();

在这里插入图片描述

.NET Core 注入IHttpClientFactory。然后写个简单的测试功能,直接看以下代码:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Diagnostics;

namespace Translate.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TranslationController : ControllerBase
    {
        IHttpClientFactory _httpClientFactory;

        public TranslationController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        /// <summary>
        /// 测试翻译
        /// </summary>
        /// <param name="mod">模式  zh2en   en2zh  de2zh  zh2de</param>
        /// <param name="text"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Test(string url,string mod,string text)
        {
            string result = string.Empty;
            using (HttpClient client = _httpClientFactory.CreateClient())
            {
                try
                {
                    client.Timeout = new TimeSpan(0, 0, 100);
                    client.DefaultRequestHeaders.Add("User-Agent", @"Mozilla/5.0 (compatible; Baiduspider/2.0)");
                    client.DefaultRequestHeaders.Add("Accept", @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
                    FormUrlEncodedContent data = new FormUrlEncodedContent(new Dictionary<string, string>() {
                        { "mod",mod},
                        { "text",text}
                    });
                    HttpResponseMessage res = client.PostAsync(url, data).Result;
                    if (res.IsSuccessStatusCode && res.StatusCode == System.Net.HttpStatusCode.OK)
                    {
                        result = res.Content.ReadAsStringAsync().Result;
                    }
                    else
                    {
                        result = $"访问翻译服务错误:Error";
                    }
                }
                catch (Exception ex)
                {
                    result = "访问翻译服务错误:"+ ex.Message;
                }
            }
            return Ok(result);
        }
    }
}

在这里插入图片描述
通过自带的swagger测试效果
在这里插入图片描述
得到结果
在这里插入图片描述

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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