构建自己 AI 翻译帮手取代谷歌翻译

本文共享一种方式通过运用 Hugging Face LLM 和 Python 不受约束地翻译长文档。

在全球化的今天,与来自不同国家和文明的人交流变得越来越重要,而关于技术人员来说,阅读英文资料是常见的需求。通常言语障碍往往会下降学习英文资料的效率。尽管谷歌翻译成为弥补这一缺乏的盛行东西,但它有其局限性,特别是在精确翻译较长的文本时。

真的很烦把一小部分文本仿制/张贴到谷歌翻译中,等候成果,仿制到文件中,重复的仿制、张贴,所以为什么不运用现在最盛行的方式 AI 助理来解决问题?

有人或许忧虑运用第三方服务翻译灵敏信息的隐私和安全问题。在本文中,将探究运用 Hugging Face 构建自己的人工智能翻译应用程序的代替解决方案。通过构建自己的翻译应用程序,保证数据的隐私和安全,同时还可以实现较长文本的体面精确翻译。

终究应用的成果是这样的:

构建自己 AI 翻译助手取代谷歌翻译

装置依赖项

需求的包并不多,访问 Hugging Face 模型、创立大块的长文本和图形界面。但首要,作为杰出实践,为新的 Python 项目创立一个虚拟环境。创立一个全新的目录 AI_Translator 并运行 venv 创立指令:

python3 -m venv venv

激活虚拟环境:

source venv/bin/activate #for mac
venv\Scripts\activate  #for windows users

激活 venv 后装置下面依赖性:

pip  install mkl mkl-include   # Mac 用户的 CPU 运用率需求
pip install torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0  # 中心
pip install transformers
pip install langchain==0.0.173
pip install streamlit
pip install streamlit-extras

假如要运用的模型运用 Tensorflow 来创立权重,则还必须装置 Tensorflow

pip install tensorflow

下载言语模型

应用程序的中心是言语翻译模型,这里的目标言语(中文)和原始文本言语(English),翻译模型是按照特定次序练习的:

构建自己 AI 翻译助手取代谷歌翻译

上面是一个翻译的模型:从英文到中文。 在Hugging Face Hub 翻译模型中,通常只要一对和一对的翻译,而这是个特定的次序。从英文到中文(en-to-zh) 。

可以在 Helsinki 言语技术研究组的 Hugging Face 库中找到一组合适的翻译模型。

这里有 1440 个言语模型,想要一个从英文到中文的翻译模型:所以需求查找到以 en-to-zh 结尾的模型。

正如图中所看到的,这个模型卡片告知咱们在 PyTorch 和 Tensorflow 中都有可用的权重。

  1. 创立子文件夹 model_zh
  2. 转到模型卡的文件选项卡并下载下面列出的一切文件:关于目录 model_zh 中的中文模型下载,需求下载如下:
README.md
config.json
generation_config.json
pytorch_model.bin
source.spm
target.spm
tokenizer_config.json
vocab.json

一旦一切文件都下载到它们的相关子文件夹中,预备工作就完结了。

测验模型

假如模型的权重为 .h5 格局,则需求装置 tensorflow(如上例所示)

pip install tensorflow

调用模型时需求指定 tensorflow 框架,运用参数 from_tf=True,如下:

repo_id = "Helsinki-NLP/opus-mt-en-zh"
model_tt0zh = AutoModelForSeq2SeqLM.from_pretrained(repo_id, from_tf=True)

创立一个名为 test-en-zh.py 的新文件:在开端创立用户界面之前,将运用它来测验带有 pytorch 模型的翻译管道的功能。该文件的代码如下(随后将进行解说)

import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
import datetime
#LOCAL MODEL EN-IT
#---------------------------------
#  Helsinki-NLP/opus-mt-en-zh
Model_ZH = './model_zh/'   #torch
#---------------------------------
English = "Imagine a world where AI-driven technologies enable us to communicate more effectively, analyze enormous amounts of textual data, and make informed decisions in just seconds. A world where chatbots comprehend our intentions and respond with human-like clarity. This world is no longer a far-off dream, but an approaching reality, due to the remarkable advancements in AI technologies such as ChatGPT and LangChain. In this article, we will dive into the groundbreaking innovations of ChatGPT and LangChain, examine their potential applications, and uncover how they are transforming the AI landscape."
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM     
tokenizer_tt0zh = AutoTokenizer.from_pretrained(Model_ZH)  
print('===>初始化AI言语模型...')
#repo_id = "Helsinki-NLP/opus-mt-en-zh"
#model_tt0zh = AutoModelForSeq2SeqLM.from_pretrained(repo_id, from_tf=True)
model_tt0zh = AutoModelForSeq2SeqLM.from_pretrained(Model_ZH)  #Helsinki-NLP/opus-mt-en-zh
print("===>pipeline")
TToZH = pipeline("translation", model=model_tt0zh, tokenizer=tokenizer_tt0zh)
print("===>翻译正在进行中")
start = datetime.datetime.now() 
finaltext = TToZH(English)
stop = datetime.datetime.now() 
elapsed = stop - start
print(f'===>翻译完结于: {elapsed}...\n')
print(finaltext[0]['translation_text'])
print(f"\n===>翻译内容包括单词 {len(English.split(' '))} 个")

导入模型交互的中心:pytorchtransformers 库。然后为本地下载的模型设置查看点,存储它的途径 Model_ZH = './model_zh/'

要翻译的字符串存储在变量 English 中。然后,为分词器、模型和要履行的管道初始化对转换器库的调用:请注意,为分词器和模型传递了途径(Model_ZH 变量)。管道实例化为:

TToZH = pipeline("translation", model=model_tt0zh, tokenizer=tokenizer_tt0zh)

假如运行代码,将看到如下内容:

构建自己 AI 翻译助手取代谷歌翻译

创立前端界面

创立一个名为 translationer.py 的新文件,在这里将运用 Streamlit 库来创立 Web 界面。

Streamlit 是一个无需了解任何前端技术(如 HTML 和 CSS)即可构建 Web 应用程序的库。假如想了解更多信息,请在此处查看清晰的文档。

import streamlit as st
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
from langchain.text_splitter import CharacterTextSplitter
import datetime
############# 在前端显示图画 #################
st.set_page_config(page_title="私家AI翻译助理",
                   page_icon='♾️',
                   layout="centered",  #or wide
                   initial_sidebar_state="expanded",
                   menu_items={
                        'Get Help': 'https://docs.streamlit.io/library/api-reference',
                        'Report a bug': "https://www.extremelycoolapp.com/bug",
                        'About': "一个懂你的AI翻译助理"
                                },
                   )
# 
#LOCAL MODEL EN-ZH
#---------------------------------
#  Helsinki-NLP/opus-mt-en-zh
Model_ZH = './model_zh/'   #torch
#---------------------------------

上述代码主要导入库、模型和 streamlit 页面的一般设置。假如模型是 .h5 模型,请记住导入 tensorflow

### HEADER section
st.header("私家AI翻译助理:帮你把英文翻译成中文")
English = st.text_area("", height=240, key="original",placeholder="请输入或许黏贴英文内容...")
col1, col2, col3 = st.columns([2,5,2])
btn_translate = col2.button("✅ 开端翻译", use_container_width=True, type="primary", key='start')

根本结构在这里完结,创立了 3 列并指定了 3 的比率。

col1, col2, col3 = st.columns([2,5,2])
btn_translate = col2.button("✅ 开端翻译", use_container_width=True, type="primary", key='start')

只要在按下名为 btn_translate 的按钮时才会调用翻译管道。

if btn_translate:
    if English:
    else:
        st.warning("请输入您需求翻译的文本内容!", icon="⚠️")

2 个嵌套的 if 语句查看单击的按钮(假如 btn_translate)以及英文文本是否为空,即变量 English 是否为空。后面运用 text-splitter 将长文本分成更小的部分,这样就不会溢出最大数量的标记。

pipeline 的调用和上一节测验代码一样,只是需求迭代。将文本分块,因而必须为每个块获取翻译管道的成果,然后将它们拼接起来:

# 遍历块并衔接翻译
finaltext = ''
start = datetime.datetime.now() #not used now but useful
print('[bold yellow] 翻译进行中...')
for item in texts:
   line = TToIT(item.page_content)[0]['translation_text']
   finaltext = finaltext+line+'\n'

终究,可以在 text_area 部件中显示翻译的终究文本:

st.text_area(label="中文翻译:", value=finaltext, height=350)

完整的代码如下:

import streamlit as st
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
from langchain.text_splitter import CharacterTextSplitter
import datetime
############# 在前端显示图画 #################
st.set_page_config(page_title="私家AI翻译助理",
                   page_icon='♾️',
                   layout="centered",  #or wide
                   initial_sidebar_state="expanded",
                   menu_items={
                        'Get Help': 'https://docs.streamlit.io/library/api-reference',
                        'Report a bug': "https://www.extremelycoolapp.com/bug",
                        'About': "一个懂你的AI翻译助理"
                                },
                   )
# 
#LOCAL MODEL EN-ZH
#---------------------------------
#  Helsinki-NLP/opus-mt-en-zh
Model_ZH = './model_zh/'   #torch
#---------------------------------
### HEADER section
st.header("私家AI翻译助理:帮你把英文翻译成中文")
English = st.text_area("", height=240, key="original",placeholder="请输入或许黏贴英文内容...")
col1, col2, col3 = st.columns([2,5,2])
btn_translate = col2.button("✅ 开端翻译", use_container_width=True, type="primary", key='start')
if btn_translate:
    if English:
        Model_ZH = './model_zh/'   #torch
        with st.spinner('AI翻译助理预备中...'):
            st.success(' AI翻译助理开端翻译', icon="")
            # 用于分块的文本分离器函数
            text_splitter = CharacterTextSplitter(        
                separator = "\n\n",
                chunk_size = 300,
                chunk_overlap  = 0,
                length_function = len,
            )
            # 将文档分块
            st.success(' 文档块文本...', icon="")
            texts = text_splitter.create_documents([English])
            from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
            # 初始化翻译从英文到中文
            tokenizer_tt0zh = AutoTokenizer.from_pretrained(Model_ZH)
            st.success(' 初始AI言语模型...', icon="")
            model_tt0zh = AutoModelForSeq2SeqLM.from_pretrained(Model_ZH)  #Helsinki-NLP/opus-mt-en-zh  or #Helsinki-NLP/opus-mt-it-zh
            TToZH = pipeline("translation", model=model_tt0zh, tokenizer=tokenizer_tt0zh)
            # 遍历块并衔接翻译
            finaltext = ''
            start = datetime.datetime.now()
            print('[bold yellow]翻译进行中...')
            for item in texts:
                line = TToZH(item.page_content)[0]['translation_text']
                finaltext = finaltext+line+'\n'
            stop = datetime.datetime.now() 
            elapsed = stop - start
            st.success(f'翻译完结于 {elapsed}', icon="")
            print(f'[bold underline green1] Translation generated in [reverse dodger_blue2]{elapsed}[/reverse dodger_blue2]...')
            st.text_area(label="中文翻译:", value=finaltext, height=350)
            st.markdown(f'翻译完结于: **{elapsed}**')
            st.markdown(f"翻译内容包括单词 {len(English.split(' '))} 个")
    else:
        st.warning("请输入您需求翻译的文本内容!", icon="⚠️")

接下来履行命令:

streamlit run translationer.py

打开浏览器就可以体验自己构建的 AI 翻译助理了。

构建自己 AI 翻译助手取代谷歌翻译

构建自己 AI 翻译助手取代谷歌翻译

构建自己 AI 翻译助手取代谷歌翻译