ナード戦隊データマン

機械学習, 自然言語処理, データサイエンスについてのブログ

zipporahにLID+overlapスコアを追加する

機械翻訳のデータの質を大きく下げる要因として、言語の誤り、単語のオーバーラップがあります。

概要

zipporahスコアへの組み込み方

zipporahスコアはロジスティック回帰の決定関数を出力しています。この決定関数の最小値よりも小さな値を、「言語の不一致」または「オーバーラップ」に充てます。(-100とする)

言語検出

言語検出とは、テキストの言語を特定するタスクです。fasttextは言語検出モデルを公開しており、176言語に対応しています。 Language identification · fastText

今回は、言語検出でソース言語またはターゲット言語が間違った言語の場合にスコアを-100にします。

オーバーラップ

オーバーラップとは、ソース文とターゲット文の単語の一致率です。この数値が高いとコーパスの質を下げる要因になります。オーバーラップ率の求め方は以下のSOで回答されています。 python - Percentage Overlap of Two Lists - Stack Overflow

今回は、オーバーラップ率が0.6を超えた場合にスコアを-100にします。

実行

前回の記事でzipporahとbicleanerのwmt19 pcfタスクでの実行方法を説明しました。 WMT19のパラレルコーパスフィルタリングのタスクでzipporahとbicleanerを比較 - ナード戦隊データマン

LIDとoverlapのコードを追加したので、順に実行していきます。

zipporah実行のMakefile

以下のMakefileに実行方法を記述しました。

https://github.com/sugiyamath/wmt19_pcf_experiments/blob/master/baseline/Makefile

make add_lid_score
make add_overlap_score
()

add_lid_score:
    ( test -f out/scores2.txt ) || ( python3 ../scripts/add_lid_score.py ../data/targets/paracrawl-release4.en-ne.dedup.ne ../data/targets/paracrawl-release4.en-ne.dedup.en out/scores.txt out/scores2.txt ../model/lid.176.bin ne en -100 )

add_overlap_score:
    ( test -f out/scores3.txt ) || ( python3 ../scripts/add_overlap_score.py /tmp/baseline/bad.ne-en.ne /tmp/baseline/bad.ne-en.en out/scores2.txt out/scores3.txt -100 0.6 )

それぞれadd_lid_score.pyとadd_overlap_score.pyというスクリプトを作成し、実行しています。

add_lid_score.py

add_lid_score.pyはfasttextのモデルを読み込んで実行します。

  
import os
from tqdm import tqdm
from fasttext import load_model


def main(src_file,
         tgt_file,
         score_file,
         out_file,
         model_file,
         src_lang="ne",
         tgt_lang="en",
         noisy_score="-1"):
    model = load_model(model_file)
    with open(src_file) as fs, \
         open(tgt_file) as ft, \
         open(score_file) as fsc, \
         open(out_file, "w") as fscw:
        for sline, tline, score in tqdm(zip(fs, ft, fsc)):
            is_correct_src = model.predict(sline.strip())[0][0].endswith(src_lang.strip())
            is_correct_tgt = model.predict(tline.strip())[0][0].endswith(tgt_lang.strip())
            if is_correct_src and is_correct_tgt:
                fscw.write(score)
            else:
                fscw.write("{}\n".format(noisy_score))


if __name__ == "__main__":
    import sys
    main(*sys.argv[1:])

add_overlap_score.py

from tqdm import tqdm


def overlap(words1, words2):
    set1 = set(words1)
    set2 = set(words2)
    return len(set1 & set2) / float(len(set1 | set2))


def main(src_file,
         tgt_file,
         score_file,
         out_file,
         noisy_score="-1",
         threshold=0.6):
    with open(src_file) as fs, open(tgt_file) as ft, open(score_file) as fsc:
        with open(out_file, "w") as fw:
            for line_s, line_t, score in tqdm(zip(fs, ft, fsc)):
                words_s = line_s.strip().split()
                words_t = line_t.strip().split()
                score = score.strip()
                ol = overlap(words_s, words_t)
                if ol > float(threshold):
                    fw.write("{}\n".format(noisy_score))
                else:
                    fw.write("{}\n".format(score))


if __name__ == "__main__":
    import sys
    main(*sys.argv[1:])

結果

zipporahにLIDとoverlapスコアを付け加えて固定パラメータのNMTでBLEUを出すと以下のようになりました(ネパール語 対 英語)

[zipporah]
| Generate test with beam=5: BLEU = 3.94 32.2/6.9/1.9/0.6 (BP = 1.000 ratio = 1.043 hyp_len = 53290 ref_len = 51076)

[zipporah2] #LID
| Generate test with beam=5: BLEU = 4.94 31.3/8.0/2.6/0.9 (BP = 1.000 ratio = 1.074 hyp_len = 54848 ref_len = 51088)

[zipporah3] #LID+overlap
| Generate test with beam=5: BLEU = 5.21 32.6/8.4/2.8/1.0 (BP = 1.000 ratio = 1.041 hyp_len = 53183 ref_len = 51088)

以下は、Facebookの論文内でのスコアです:

f:id:mathgeekjp:20191029131051g:plain

完全な再現はできていませんが、LID+overlapは近い数値が出ています。

考察

言語の間違いや、ソース・ターゲットで語が一致しているような事象はノイズの一種として考えられますが、これらのノイズを除去することによってデータの質を高められることがわかります。そして、データの質を上げることでNMTの翻訳の質も改善されます。

一般的に、ソースとターゲットの言語が一致している文があると、NMTの翻訳の質が下がる傾向にあるようです。これは、他の様々な種類のノイズよりも甚大な影響を与えるタイプのノイズとして知られています。以下は、ノイズに関する研究です。

On the Impact of Various Types of Noise on Neural Machine Translation - ACL Anthology

zipporahを使う場合、言語検出モデルやオーバーラップ検出による単純なスコア操作は、低リソースの翻訳タスクにおいても効果があるといえます。これは、zipporahそのものの言語検出力が十分ではないことを示唆しています。

ちなみに、ここで実行したネパール語対英語のタスクのスコアは、フランス語対英語のスコアよりもはるかに低いです。これは、言語リソースの不足に起因していると考えられます。

参考

  1. http://www.statmt.org/wmt19/pdf/54/WMT35.pdf
  2. On the Impact of Various Types of Noise on Neural Machine Translation - ACL Anthology
  3. python - Percentage Overlap of Two Lists - Stack Overflow
  4. Language identification · fastText