データナード

機械学習と自然言語処理についての備忘録 (旧ナード戦隊データマン)

WMT19のパラレルコーパスフィルタリングのタスクでzipporahとbicleanerを比較

WMT19では、リソースの少ない言語に対するパラレルコーパスフィルタリングを共有タスクとして公開しています。

概要

WMT19では、Paracrawlプロジェクトの一部としてWebクロールされたノイジーコーパス(ネパール語対英語, シンハラ語対英語)を提供しています。

参加者は、各々の文ペアに対してスコアを与えます。このスコアを用いて指定の方法でサブサンプリングされた文ペアは、それぞれ500万語,100万語だけ選ばれます。このサブサンプリングによって生成されたデータの質によってSMT(moses)とNMT(fairseq)の結果が決定されます。

機械翻訳の質は、サブサンプリングされたデータを訓練データとし、予め決められたパラメータが設定された訓練スクリプトによってモデルを作成し、そのモデルを使って決められたデータに対して翻訳し、それに対するBLEU(sacrebleu)によって測定されます。

WMT19では、(フィルタリングモデルのための)訓練データが提供されています。

zipprahとbicleanerの比較

zipporahはベースラインとして利用されています。今回は、このベースラインのスコアに対して、自前で訓練したzipporahとbicleanerを比較します。

実行方法

事前準備

プロジェクトのダウンロード

私が作成したプロジェクトがあるので、それをダウンロードします。

2020-04-22: 現在、このプロジェクトはprivateに設定しています。

git clone https://github.com/sugiyamath/wmt19_pcf_experiments
cd wmt19_pcf_experiments

プロジェクト内のほとんどの実行フローはMakefileとして実装されています。ROOT_DIRなどの変数は自分の環境に合わせて変更してください。

必要なツールのインストール

apt remove mawk
apt install gawk
pip3 install tqdm
make install_libs_for_moses
make download_tools
make install_ft
make build_mgiza
make build_kenlm
make download_and_build_cmph
make build_fast_align
make build_moses
make download_devpack

データの準備

make download_clean
make download_paracrawl
make prepare_data
make prepare_zipporah

baselineの実行

make sub_baseline
make run_nmt_baseline

結果はout/baseline/result_nmt/result.txtに格納されます。

自前でzipporahの実行

zipporahによるフィルタリング

pushd baseline
make build
make set_config
make train
make cp_score
popd

Note: いくつか依存関係のあるモジュール等をインストールしておく必要があります。

フィルタリングの評価

make sub_zipporah
make run_nmt_zipporah

bicleanerの実行

bicleanerによるフィルタリング

pushd bicleaner
make install
make merge_s_t
make prepare_target
make create_pdic
make train
make classify
make split_classify
popd

フィルタリングの評価

make sub_bicleaner
make run_nmt_bicleaner

結果の抽出

make extract_bleu

結果

[baseline]
| Generate test with beam=5: BLEU = 4.93 29.8/7.8/2.6/1.0 (BP = 1.000 ratio = 1.211 hyp_len = 61856 ref_len = 51094)
 
[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)
 
[bicleaner]
| Generate test with beam=5: BLEU = 5.14 34.4/8.4/2.7/1.0 (BP = 0.978 ratio = 0.978 hyp_len = 49968 ref_len = 51076)

考察

ベースラインのスコアはzipporahで実行しているはずですが、自前のzipporahのスコアを上回っているようです。一方、bicleanerはベースラインのスコアを上回っています。ネパール語のリソースが少ないため、BLEUスコア自体は英語とフランス語のペアなどよりは低く出ているらしい、ということがわかります。

スコアに基づいてサブサンプリングして抽出された一定数のデータを固定のパラメータのNMTで訓練する、というフェーズが必要な理由は、条件を一定にしてフィルタリングの精度のみを評価するためだと考えられます。

Facebookの論文のスコアテーブルを見ると、MicrosoftがWMT18において高い精度を出していた手法であるDual X-Entは、低リソースの状況ではあまりうまく機能しない場合があるようです。

また、言語検出モデルのスコアを追加したり、オーバーラップ率を考慮したりすることによってフィルタリングの精度が上がる場合があるようですが、実用的には、このような処理は膨大なデータに対して適用することになるので、実行速度面で高速な言語検出モデルを使うのが理にかなっています。

個人的な課題として、Dual X-Entをちゃんと実装することと、LASERモデルを検証することです。

参考

  1. Parallel Corpus Filtering for Low-Resource Conditions Task - ACL 2019 Fourth Conference on Machine Translation
  2. http://www.statmt.org/wmt19/pdf/54/WMT35.pdf