当前位置 : 主页 > 网络编程 > net编程 >

#yyds干货盘点#【愚公系列】2023年04月 .NET CORE工具案例-多语言离线翻译系统

来源:互联网 收集:自由互联 发布时间:2023-09-03
前言 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测试效果 在这里插入图片描述 得到结果 在这里插入图片描述

网友评论