跳转到主要内容

基于Huggingface transformers构建的深度学习翻译库

项目描述

DL Translate

DOI Downloads License

基于Huggingface transformers构建的200种语言的翻译库

💻 GitHub仓库
📚 文档
🐍 PyPi项目
🧪 Colab演示 / Kaggle演示

快速入门

使用pip安装库

pip install dl-translate

翻译一些文本

import dl_translate as dlt

mt = dlt.TranslationModel()  # Slow when you load it for the first time

text_hi = "संयुक्त राष्ट्र के प्रमुख का कहना है कि सीरिया में कोई सैन्य समाधान नहीं है"
mt.translate(text_hi, source=dlt.lang.HINDI, target=dlt.lang.ENGLISH)

上面,你可以看到dlt.lang包含了代表200种可用语言的变量,并支持自动完成。或者,你可以指定语言(例如,“阿拉伯语”)或语言代码(例如,法语为“fr”)

text_ar = "الأمين العام للأمم المتحدة يقول إنه لا يوجد حل عسكري في سوريا."
mt.translate(text_ar, source="Arabic", target="fr")

如果你想验证某个语言是否可用,你可以检查它

print(mt.available_languages())  # All languages that you can use
print(mt.available_codes())  # Code corresponding to each language accepted
print(mt.get_lang_code_map())  # Dictionary of lang -> code

用法

选择设备

当你加载模型时,你可以指定设备

mt = dlt.TranslationModel(device="auto")

默认情况下,值将为device="auto",这意味着如果可能,它将使用GPU。你还可以明确设置device="cpu"device="gpu",或一些其他由torch.device()接受的字符串。 一般来说,如果你想获得合理的处理时间,建议使用GPU。

选择不同的模型

默认情况下,将使用 m2m100 模型。但是,也有一些选项

  • mBART-50 Large:支持50种语言的翻译。
  • m2m100:支持100种语言的翻译。
  • nllb-200(v0.3版新增):支持200种语言的翻译,比m2m100速度快(在RTX A6000上,速度提升3倍)。

这里是一个例子

# The default approval
mt = dlt.TranslationModel("m2m100")  # Shorthand
mt = dlt.TranslationModel("facebook/m2m100_418M")  # Huggingface repo

# If you want to use mBART-50 Large
mt = dlt.TranslationModel("mbart50")
mt = dlt.TranslationModel("facebook/mbart-large-50-many-to-many-mmt")

# Or NLLB-200 (faster and has 200 languages)
mt = dlt.TranslationModel("nllb200")
mt = dlt.TranslationModel("facebook/nllb-200-distilled-600M")

请注意,语言代码会根据模型系列而变化。要查找正确的语言代码,请阅读有关可用语言的文档页面或运行 mt.available_codes()

默认情况下,dlt.TranslationModel 将从 huggingface 仓库下载 mbart50m2m100nllb200 模型并将其缓存。您可以从路径或具有类似格式的模型加载模型,但需要指定 model_family

mt = dlt.TranslationModel("/path/to/model/directory/", model_family="mbart50")
mt = dlt.TranslationModel("facebook/m2m100_1.2B", model_family="m2m100")
mt = dlt.TranslationModel("facebook/nllb-200-distilled-600M", model_family="nllb200")

注意事项

  • 如果您从文件加载,请确保将分词器也存储在相同的目录中。
  • 如果选择不同的模型,可用的语言将发生变化,因此您将无法利用 dlt.langdlt.utils

分割成句子

不建议使用非常长的文本,因为它需要更多时间来处理。相反,您可以使用 nltk 来尝试将其分解成句子。首先使用 pip install nltk 安装库,然后运行

import nltk

nltk.download("punkt")

text = "Mr. Smith went to his favorite cafe. There, he met his friend Dr. Doe."
sents = nltk.tokenize.sent_tokenize(text, "english")  # don't use dlt.lang.ENGLISH
" ".join(mt.translate(sents, source=dlt.lang.ENGLISH, target=dlt.lang.FRENCH))

翻译期间的批大小

可以为 mt.translate 设置批大小(即一次处理的数据元素数量),并选择是否显示进度条。

# ...
mt = dlt.TranslationModel()
mt.translate(text, source, target, batch_size=32, verbose=True)

如果将 batch_size=None 设置,它将一次性计算整个 text,而不是分割成“块”。如果您没有很多RAM或VRAM并且遇到CUDA内存错误,我们建议降低 batch_size。如果您使用高端GPU且VRAM未充分利用,请设置更高的值。

dlt.utils 模块

除了 mt.available_languages(),还有 dlt.utils 模块。您可以使用它来查找可用的语言和代码。

print(dlt.utils.available_languages('mbart50'))  # All languages that you can use
print(dlt.utils.available_codes('m2m100'))  # Code corresponding to each language accepted
print(dlt.utils.get_lang_code_map('nllb200'))  # Dictionary of lang -> code

离线使用

与 Google 翻译或 MSFT 翻译器 API 不同,此库可以完全离线使用。但是,您需要首先下载软件包和模型,并将它们移动到您的离线环境以在 venv 中安装和加载。

首先,在终端中运行

mkdir dlt
cd dlt
mkdir libraries
pip download -d libraries/ dl-translate

一旦所有必需的软件包都已下载,您需要使用 huggingface hub 下载文件。使用 pip install huggingface-hub 安装它。然后,在 Python 中运行

import shutil
import huggingface_hub as hub

dirname = hub.snapshot_download("facebook/m2m100_418M")
shutil.copytree(dirname, "cached_model_m2m100")  # Copy to a permanent folder

现在,将 dlt 目录中的所有内容移动到您的离线环境。创建一个虚拟环境,并在终端中运行以下命令

pip install --no-index --find-links libraries/ dl-translate

现在,在 Python 中运行

import dl_translate as dlt

mt = dlt.TranslationModel("cached_model_m2m100", model_family="m2m100")

高级

如果您了解 PyTorch 和 Huggingface Transformers,您可以访问库的更高级功能以进行更多自定义。

  • 保存和加载:如果您想加快翻译模型的加载时间,可以使用 save_obj 并稍后使用 load_obj 重新加载。此方法仅建议您熟悉 huggingfacetorch;请阅读文档以获取更多信息。
  • 与底层模型和分词器交互:在初始化 model 时,您可以使用 model_optionstokenizer_options 分别传递底层 BART 模型和分词器的参数。您还可以使用 mt.get_transformers_model() 访问底层 transformers
  • generate() 方法的关键字参数:在运行 mt.translate 时,您还可以提供传递给底层转换器模型 generate() 方法的 generation_options

更多信息,请访问用户指南的高级部分:https://xhluca.github.io/dl-translate/#advanced

致谢

dl-translate 基于 Facebook AI Research 创建的两个模型的 Huggingface 实现。

  1. 多语言 BART 在超过 50 种语言的许多到许多翻译上进行微调,相关文档在此:https://hugging-face.cn/transformers/master/model_doc/mbart.html。原始论文由 Facebook AI Research 的 Tang 等人撰写;您可以在这里找到它,并使用以下方式引用:

    @article{tang2020multilingual,
        title={Multilingual translation with extensible multilingual pretraining and finetuning},
        author={Tang, Yuqing and Tran, Chau and Li, Xian and Chen, Peng-Jen and Goyal, Naman and Chaudhary, Vishrav and Gu, Jiatao and Fan, Angela},
        journal={arXiv preprint arXiv:2008.00401},
        year={2020}
    }
    
  2. 由 Fan 等人在 Beyond English-Centric Multilingual Machine Translation 中发布的转换器模型,支持超过 100 种语言。您可以在这里引用它

    @misc{fan2020englishcentric,
         title={Beyond English-Centric Multilingual Machine Translation}, 
         author={Angela Fan and Shruti Bhosale and Holger Schwenk and Zhiyi Ma and Ahmed El-Kishky and Siddharth Goyal and Mandeep Baines and Onur Celebi and Guillaume Wenzek and Vishrav Chaudhary and Naman Goyal and Tom Birch and Vitaliy Liptchinsky and Sergey Edunov and Edouard Grave and Michael Auli and Armand Joulin},
         year={2020},
         eprint={2010.11125},
         archivePrefix={arXiv},
         primaryClass={cs.CL}
     }
    
  3. no language left behind 模型,它将 NMT 扩展到 200 多种语言。您可以在这里引用它

    @misc{nllbteam2022language,
        title={No Language Left Behind: Scaling Human-Centered Machine Translation}, 
        author={NLLB Team and Marta R. Costa-jussà and James Cross and Onur Çelebi and Maha Elbayad and Kenneth Heafield and Kevin Heffernan and Elahe Kalbassi and Janice Lam and Daniel Licht and Jean Maillard and Anna Sun and Skyler Wang and Guillaume Wenzek and Al Youngblood and Bapi Akula and Loic Barrault and Gabriel Mejia Gonzalez and Prangthip Hansanti and John Hoffman and Semarley Jarrett and Kaushik Ram Sadagopan and Dirk Rowe and Shannon Spruit and Chau Tran and Pierre Andrews and Necip Fazil Ayan and Shruti Bhosale and Sergey Edunov and Angela Fan and Cynthia Gao and Vedanuj Goswami and Francisco Guzmán and Philipp Koehn and Alexandre Mourachko and Christophe Ropers and Safiyyah Saleem and Holger Schwenk and Jeff Wang},
        year={2022},
        eprint={2207.04672},
        archivePrefix={arXiv},
        primaryClass={cs.CL}
    }
    

dlt 是一个包装器,带有有用的 utils,可以为您节省时间。以下是一个使用 Huggingface 的 transformers 的示例

from transformers import MBartForConditionalGeneration, MBart50TokenizerFast

article_hi = "संयुक्त राष्ट्र के प्रमुख का कहना है कि सीरिया में कोई सैन्य समाधान नहीं है"
article_ar = "الأمين العام للأمم المتحدة يقول إنه لا يوجد حل عسكري في سوريا."

model = MBartForConditionalGeneration.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
tokenizer = MBart50TokenizerFast.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")

# translate Hindi to French
tokenizer.src_lang = "hi_IN"
encoded_hi = tokenizer(article_hi, return_tensors="pt")
generated_tokens = model.generate(**encoded_hi, forced_bos_token_id=tokenizer.lang_code_to_id["fr_XX"])
tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
# => "Le chef de l 'ONU affirme qu 'il n 'y a pas de solution militaire en Syria."

# translate Arabic to English
tokenizer.src_lang = "ar_AR"
encoded_ar = tokenizer(article_ar, return_tensors="pt")
generated_tokens = model.generate(**encoded_ar, forced_bos_token_id=tokenizer.lang_code_to_id["en_XX"])
tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
# => "The Secretary-General of the United Nations says there is no military solution in Syria."

使用 dlt,您可以运行

import dl_translate as dlt

article_hi = "संयुक्त राष्ट्र के प्रमुख का कहना है कि सीरिया में कोई सैन्य समाधान नहीं है"
article_ar = "الأمين العام للأمم المتحدة يقول إنه لا يوجد حل عسكري في سوريا."

mt = dlt.TranslationModel()
translated_fr = mt.translate(article_hi, source=dlt.lang.HINDI, target=dlt.lang.FRENCH)
translated_en = mt.translate(article_ar, source=dlt.lang.ARABIC, target=dlt.lang.ENGLISH)

请注意,您无需考虑分词器、条件生成、预训练模型和区域代码;您只需告诉模型要翻译的内容即可!

如果您熟悉 huggingface 的生态系统,那么您应该足够熟悉上面的示例,以至于不需要这个库。但是,如果您从未听说过 huggingface 或 mBART,那么我希望使用这个库能够给您足够的学习动机了解它们 :)

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源代码分发

dl-translate-0.3.1.tar.gz (23.3 kB 查看哈希值)

上传时间: 源代码

构建分发

dl_translate-0.3.1-py3-none-any.whl (20.0 kB 查看哈希值)

上传时间: Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面