Skip to main content

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

项目描述

子词神经机器翻译

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

安装

通过 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-gram,请执行以下操作:

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 中字节对编码的最佳实践建议

我们发现,对于共享字母表的语言,在(两种或多种)所涉及语言的连接上学习 BPE 可以提高分割的一致性,并减少复制/音译名称时插入/删除字符的问题。

但是,这会引入不希望的边缘情况,因为单词可能会以仅在其他语言中观察到的方式被分割,因此在测试时是未知的。为了防止这种情况,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

高级功能

在基本 BPE 实现之上,此存储库支持:

  • BPE 退出(Provilkov、Emelianenko 和 Voita,2019 年):https ://arxiv.org/abs/1910.13267 使用参数--dropout 0.1forsubword-nmt apply-bpe随机退出可能的合并。在训练语料上这样做可以提高最终系统的质量;在测试时,使用 BPE 而不会丢失。为了获得可重现的结果,--seed可以使用参数来设置随机种子。

    注意:在原始论文中,作者分别在每个新批次上使用了 BPE-Dropout。您可以多次复制训练语料以获得相似的行为,从而为同一个句子获得多个切分。

  • 支持词汇表:使用参数--glossariesforsubword-nmt apply-bpe提供单词和/或正则表达式的列表,这些单词和/或正则表达式应始终传递到输出而不进行子词分割

出版物

分割方法描述于:

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

Sennrich 等人的实施方式有何不同。(2016)

该存储库实现了 Sennrich 等人所述的子词分割。(2016),但从 0.2 版开始,存在一个与词尾标记相关的核心差异。

在 Sennrich 等人。(2016),词尾标记</w>最初表示为一个单独的标记,随着时间的推移可以与其他子词合并:

u n d </w>
f u n d </w>

从 0.2 开始,词尾标记最初与词尾字符连接:

u n d</w>
f u n d</w>

新的表示方法确保当从上述示例中学习 BPE 代码然后将其应用于新文本时,很明显一个子词单元und是明确的最终词,并且un明确地是词内部的,从而防止产生多达两个不同的子词每个 BPE 合并操作的单元。

apply_bpe.py向后兼容并继续接受旧式 BPE 文件。新式 BPE 文件由以下第一行标识:#version: 0.2

致谢

该项目已获得三星电子 Polska sp. 的资助。z oo - 波兰三星研发研究所,来自欧盟的 Horizo​​n 2020 研究和创新计划,资助协议 645452 (QT21)。

变更日志

v0.3.8:

  • 多处理支持(get_vocab 和 apply_bpe)
  • learn_bpe 的进度条
  • 确定性 BPE dropout 的种子参数
  • 忽略一些会导致 subword-nmt 崩溃的 unicode 行分隔符

v0.3.7:

v0.3.6:

  • 修复 subword-bpe 命令编码

v0.3.5:

  • 修复 Python 2 下的 subword-bpe 命令
  • 更广泛地支持 --total-symbols 参数

v0.3.4:

v0.3:

  • 库现在可以通过 pip 安装
  • 修复 UTF-8 空格和 learn_bpe 和 apply_bpe 中的新行偶尔出现的问题。
    • 不要默默地将 UTF-8 换行符转换为 "\n"
    • 不要默默地将 UTF-8 空白字符转换为“”
    • UTF-8 空格和换行符现在被视为单词的一部分,并由 BPE 分段

v0.2:

  • 对词尾标记的不同、更一致的处理(提交 a749a7)(https://github.com/rsennrich/subword-nmt/issues/19
  • 允许将词汇和频率阈值传递给 apply_bpe.py,防止产生 OOV(或稀有)子词单元(提交 a00db)
  • 使 learn_bpe.py 具有确定性(提交 4c54e)
  • 各种更改以使 Python 版本之间的 UTF 处理更加一致
  • apply_bpe.py 的新命令行参数:
    • '--glossaries' 防止给定字符串受 BPE 影响
    • '--merges' 应用学习 BPE 操作的子集
  • learn_bpe.py 的新命令行参数:
    • '--dict-input':而不是原始文本文件,将输入解释为频率字典(由 get_vocab.py 创建)。

v0.1:

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

项目详情


下载文件

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

源分布

subword_nmt-0.3.8.tar.gz (22.1 kB 查看哈希

已上传 source

内置分布

subword_nmt-0.3.8-py3-none-any.whl (27.3 kB 查看哈希

已上传 py3