吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2367|回复: 5
收起左侧

[会员申请] 申请会员ID:超级老虎漫步【申请通过】

[复制链接]
吾爱游客  发表于 2021-11-8 13:46
1.申请ID:超级老虎漫步
2.个人邮箱:liuhux@163.com
3.原创技术文章:
摒弃在线API,基于python开发一款一键开启的本地化中英互译离线翻译API服务

图片不知道为什么一直上传失败,我直接贴代码命令

话不多说,直接上干货,开发过程非常简单。

离线翻译需要下载对应的翻译模型(深度学习训练的那种),但是普通开发者一般没有接触过这一领域,所以,我们找现成的来用,不需要自己去训练。
本教程离线翻译模型来自Hugging Face,自然语言处理的神,不科普,想了解的仔细百科。

1.安装python环境(废话),建议conda创建一个虚拟的python3.8以上的环境,不要装无关紧要的依赖包,不然后面打包的服务会非常大。

安装好anconda后,DOS界面直接  conda create -n "虚拟环境名称" python=3.8.3     即可    这里我将 虚拟环境名称设置位translate


2.安装transformers依赖包
先激活创建的虚拟环境:activate translate
再安装依赖包  pip install transformers

3.英汉互译功能源码
[Python] 纯文本查看 复制代码
from transformers import pipeline, AutoModelWithLMHead, AutoTokenizer
###下面的是载入汉译英模型#######
model = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-zh-en")  ###括号内参数为模型的地址,默认Helsinki-NLP/opus-mt-en-zh  可以在允许代码时自动下载对应的模型,当然,你也可以下载好了,这里改为你自己的模型地址即可
tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-zh-en")###同上
translation_zh2en = pipeline("translation_zh_to_en", model=model, tokenizer=tokenizer)

###下面的是载入英译汉模型#######
model_en2zh = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
tokenizer_en2zh = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
translation_en2zh = pipeline("translation_en_to_zh", model=model_en2zh, tokenizer=tokenizer_en2zh)

###汉译英翻译###
translated_text = translation_zh2en(text, max_length=500)[0]['translation_text']
print("汉译英翻译结果为:"+translated_text)

##英译汉翻译###
translated_text = translation_en2zh(text, max_length=500)[0]['translation_text']
print("英译汉翻译结果为:"+translated_text)


以上代码即为翻译的和性能代码,非常简单,但是考虑到我们是要做一个API服务,以保证C#、C++、易语言等等等其它语言调用本功能,而不仅仅局限于python,那么
我们就要通过一定的手段将其封装成一个简单的WEB服务,并开放一个可供客户端进行POST的URL接口。

4.封装为WEB服务

python疯转web服务也是异常简单,这里我们使用Flask框架来搞。

先安装Flask框架依赖包  命令:pip install Flask

然后开始WEB封装:
考虑到服务需要兼容并发,所以我们导入了gevent.pywsgi来做这件事
直接贴代码
[Python] 纯文本查看 复制代码
from flask import Flask,request
from gevent import pywsgi 
from transformers import pipeline, AutoModelWithLMHead, AutoTokenizer

###做web服务,务必要提前加载翻译模型,保持翻译模型的后台运行,万万不可做成每来一个请求就调用一次模型,能慢死
print("加载模型,请稍后。。。")
###下面的是载入汉译英模型#######
model = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-zh-en")  ###括号内参数为模型的地址,默认Helsinki-NLP/opus-mt-en-zh  可以在允许代码时自动下载对应的模型,当然,你也可以下载好了,这里改为你自己的模型地址即可
tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-zh-en")###同上
translation_zh2en = pipeline("translation_zh_to_en", model=model, tokenizer=tokenizer)

###下面的是载入英译汉模型#######
model_en2zh = AutoModelWithLMHead.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
tokenizer_en2zh = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
translation_en2zh = pipeline("translation_en_to_zh", model=model_en2zh, tokenizer=tokenizer_en2zh)

####下面翻译请求封装为POST
app = Flask(__name__)
@app.route('/report',methods=['POST'])
def translate():
    text = request.form['text']
    lan = request.form['lan']
    if(lan=="ch"): ##中译英
        translated_text = translation(text, max_length=500)[0]['translation_text']
        return translated_text
    elif(lan=="en"):#英译中
        translated_text = translation_en2zh(text, max_length=500)[0]['translation_text']
        return translated_text
###然后开启服务####
print("服务开启成功,[url=http://0.0.0.0:5690/report]http://0.0.0.0:5690/report[/url]")
server = pywsgi.WSGIServer(('0.0.0.0', 5690), app) ##套上pywsgi,来异步处理请求,不加这个 会在两个以上请求同时发来时,程序直接崩
server.serve_forever()


如果你的环境全部配置好了,那么上面的代码就可以直接开启成功了,模型会全自动下载
开启后,你可以对开启的URL做一个post请求,参数为'lan'指定语言,'text'指定被翻译的内容

贴一个调用实例:
[Asm] 纯文本查看 复制代码
import requests
import base64
import time
url = 'http://127.0.0.1:5690/report'

text = "Even as the continent is seeing a significant decline in new cases and deaths recently, the Africa Centers for Disease Control, or CDC, has called on the world to enable Africa to access adequate COVID-19 vaccines."
data = {'text':text,'lan':'en'}
a= time.time()
r = requests.post(url,data)
print(time.time()-a)
print(r.text)


实际调用的输出结果:即使在非洲大陆最近新病例和死亡人数大幅减少的同时,非洲疾病控制中心(疾控中心)也呼吁世界使非洲能够获得足够的COVID-19疫苗。
效果还是可以的。

5.封装一键开启服务
如何将python的程序集成到其它语言中?如果一个软件成品还需要客户去安装所有的运行环境,这显然是不太合适的。
所以有两种方式,1.将python程序封装为dll 2.就是web服务  第2种也是本贴使用的
显然 我们实现了web服务,我们如何避免安装繁琐的python运行环境?
这就需要借助pyinstaller这个python的依赖包了,通过它可以将python程序打包成一个exe程序,直接双击即可运行。当然,对于本帖的离线翻译服务,它的打包过程并不是一行简单的命令可以完成。

首先我们需要安装这一依赖包   命令:pip install pyinstaller

然后我们通过代码,查询离线服务需要的所有依赖包:
[Python] 纯文本查看 复制代码
from transformers.dependency_versions_check import pkgs_to_check_at_runtime
print(pkgs_to_check_at_runtime)


新建文件hook-ctypes.macholib.py,将上述查到的依赖包写入,内容如下:
[Asm] 纯文本查看 复制代码
from PyInstaller.utils.hooks import collect_data_files, copy_metadata
datas = copy_metadata('tqdm')
datas += copy_metadata('torch')
datas += copy_metadata('regex')
datas += copy_metadata('sacremoses')
datas += copy_metadata('requests')
datas += copy_metadata('packaging')
datas += copy_metadata('filelock')
datas += copy_metadata('numpy')
datas += copy_metadata('tokenizers')


将hook-ctypes.macholib.py放到我们的服务程序同目录下,在dos输入cd命令进入这一目录后运行命令:
pyinstaller -F yourfile.py --additional-hooks-dir=.  (yourfile.py替换成你自己的文件名,别漏下.)
回车,等待打包完成你就获得了一个可以一键开启本服务的exe文件。








发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2021-11-9 12:43
I D:超级老虎漫步
邮箱:liuhux@163.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

ps:登陆报道后可以把文章重新编辑发布到编程区。
吾爱游客  发表于 2021-11-9 15:00
超级老虎漫步 发表于 2021-11-9 15:22
奔放的汉子 发表于 2021-11-9 16:23

欢迎大佬的加入
超级老虎漫步 发表于 2021-11-9 16:48

感谢感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-6 04:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表