用于神经机器翻译和文本生成的无监督分词

subword-nmt的Python项目详细描述


H1>子词神经机器翻译< /H1>

此存储库包含将文本分割为子单词的预处理脚本 单位。主要目的是促进我们实验的复制 用子字单位进行神经机器翻译(见下文以供参考)。

安装

通过pip安装(来自pypi):

pip install subword-nmt

通过pip(从github)安装:

pip install https://github.com/rsennrich/subword-nmt/archive/master.zip

或者,克隆此存储库;脚本是独立可执行的。

使用说明

检查各个文件的使用说明。

要将字节对编码应用于分词,请调用以下命令:

subword-nmt learn-bpe -s {num_operations} < {train_file} > {codes_file}
subword-nmt apply-bpe -c {codes_file} < {test_file} > {out_file}

要将稀有单词分割成字符n-grams,请执行以下操作:

subword-nmt get-vocab --train_file {train_file} --vocab_file {vocab_file}
subword-nmt segment-char-ngrams --vocab {vocab_file} -n {order} --shortlist {size} < {test_file} > {out_file}

可以通过简单的替换恢复原始分段:

sed -r 's/(@@ )|(@@ ?$)//g'

如果克隆了存储库但未安装软件包,也可以将各个命令作为脚本运行:

./subword_nmt/learn_bpe.py -s {num_operations} < {train_file} > {codes_file}

NMT字节对编码的最佳实践建议

我们发现对于共享字母表的语言,在 所涉及的(两种或两种以上)语言的连接增加了一致性 并减少了在 复制/音译名称。

但是,这会引入不希望出现的边缘情况,因为一个单词可能会被分割 以一种只有在另一种语言中才能观察到的方式,因此是未知的 在测试时间。为了防止这种情况,apply_bpe.py接受--vocabulary--vocabulary-threshold选项,以便脚本只生成符号 也出现在词汇表中(至少有一些频率)。

要使用此功能,我们建议使用以下方法(假设l1和l2 两种语言:

在训练文本的连接上学习字节对编码,并获取每个字节对的结果词汇表:

cat {train_file}.L1 {train_file}.L2 | subword-nmt learn-bpe -s {num_operations} -o {codes_file}
subword-nmt apply-bpe -c {codes_file} < {train_file}.L1 | subword-nmt get-vocab > {vocab_file}.L1
subword-nmt apply-bpe -c {codes_file} < {train_file}.L2 | subword-nmt get-vocab > {vocab_file}.L2

更方便的是,您可以使用此命令执行相同的操作:

subword-nmt learn-joint-bpe-and-vocab --input {train_file}.L1 {train_file}.L2 -s {num_operations} -o {codes_file} --write-vocabulary {vocab_file}.L1 {vocab_file}.L2

使用词汇过滤器重新应用字节对编码:

subword-nmt apply-bpe -c {codes_file} --vocabulary {vocab_file}.L1 --vocabulary-threshold 50 < {train_file}.L1 > {train_file}.BPE.L1
subword-nmt apply-bpe -c {codes_file} --vocabulary {vocab_file}.L2 --vocabulary-threshold 50 < {train_file}.L2 > {train_file}.BPE.L2

最后一步,提取神经网络要使用的词汇。Nematus示例:

nematus/data/build_dictionary.py {train_file}.BPE.L1 {train_file}.BPE.L2

[您可能希望使用所有词汇表的联合来支持多语言系统]

对于测试/开发数据,重复使用相同的一致性选项:

subword-nmt apply-bpe -c {codes_file} --vocabulary {vocab_file}.L1 --vocabulary-threshold 50 < {test_file}.L1 > {test_file}.BPE.L1

出版物

分割方法在:

Rico Sennrich、Barry Haddow和Alexandra Birch(2016年): 具有子词单位的罕见词的神经机器翻译 计算语言学协会第54届年会论文集(ACL 2016)。德国柏林。

致谢

该项目获得了三星电子波兰研发中心(Samsung Electronics Polska SP.Z O.O.-Samsung R&D Institute Poland)和欧盟《地平线2020研究与创新计划》(Horizon 2020 Research and Innovation Program)645452(Qt21)的资助。

更改日志

V0.3.6:

  • 修正子词bpe命令编码

V0.3.5:

  • 修复python 2下的子单词bpe命令
  • 更广泛地支持--total symbols参数

V0.3.4:

第0.3版:

  • 库现在可以通过pip安装
  • 修正学习bpe和应用bpe中utf-8空白和新行的偶发问题。
    • 不要自动将UTF-8换行符转换为“\n”
    • 不要自动将utf-8空白字符转换为“
    • utf-8空格和换行符现在被视为单词的一部分,并由bpe分段

第0.2版:

  • 对词尾标记(commit a749a7)的不同、更一致的处理(https://github.com/rsennrich/subword-nmt/issues/19
  • 一个允许通过词汇和频率阈值来应用bpe.py,防止生成oov(或稀有)子词单元(commit a00db)
  • 使learn_bpe.py确定性(提交4C54E)
  • 在python版本之间进行各种更改以使utf的处理更加一致
  • apply\u bpe.py的新命令行参数:
    • “--glossaries”以防止给定字符串受到bpe的影响
    • '--merges'应用学习的bpe操作的子集
  • learn_bpe.py的新命令行参数:
    • “--dict input”:将输入解释为频率字典(由get-vocab.py创建),而不是原始文本文件。

v0.1:

  • 一致的跨版本Unicode处理
  • 所有脚本现在都是确定性的

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用spring并在CXF中生成服务器和客户端   重载是否可以重载抽象Java类中的抽象方法,但只实现子类中的一个重载方法?   javawhy系统。currentTimeMillis()是否生成不正确的长值?   java使用Apache POI API将xlsx转换为csv   资源Java找不到文件?   java APDU命令验证返回6a88   JAVAlang.ExceptionInInitializerError是在交换机中构造对象时创建的   java使用嵌套while循环打印星形金字塔   sql Java ResultSet获取返回的字段名   java无法将字符串更改为整数,因为负号跟在数字后面   为什么番石榴/爪哇使用“可能”。isPresent()与可选项相反。是否显示(可能)?   JavaJUnit4看不到bean   JavaJBoss以错误的顺序启动servlet   java无法下载Maven依赖项AnypointStudio   安卓如何在java中存储持久数据   java SQL Server JDBC的驱动程序类名是什么   java中针对大输入的性能优化BufferedReader   java eclipse自动完成内容助理