前回は、Mosesを使い始めて真っ先に感じた疑問を晴らすために日本語と格闘した際の結果についてお話をしました。今回は、パラレル・コーパスからおかしなセンテンスを取り除くことで品質が向上するか検証した際のお話です。
あれっ?
前々回と前回では、日本語コーパスの分かち書きの単位について書きましたが、手持ちのパラレル・コーパスを使って分かち書きした結果を観察していくうちに、いろんな種類のおかしな日本語に遭遇しました。いくつか例を挙げると、こんな感じです。
いきなり「を」「は」「で」「では」「での」などで始まる。
英語 | After an installation, you can configure it according to you requirements. |
---|---|
日本語 | をインストールした後、要件に従って構成できます。 |
英語 | is intended for system administrators who perform the following tasks: |
---|---|
日本語 | は、次の作業を行うシステム管理者を対象としています。 |
「、を」「、は」「、で」「、では」「、での」などのように何かが抜けている。
英語 | For Strings, is Unicode UCS2 code point order. |
---|---|
日本語 | 文字列に対して、はUnicode ICS2コード・ポイントの順序です。 |
英語 | The UnderAge rule contains a single pattern for to match, and the rule includes a test that is applied to the pattern. |
---|---|
日本語 | UnderAgeルールには、が照合する単一のパターンと、そのパターンに適用されるテストが指定されます。 |
「」のように括弧だけで何かが抜けている。
英語 | Appendix, "" |
---|---|
日本語 | 付録「」 |
ご覧のように、何かが抜け落ちてる状態で、日本語コーパスだけではなく、対応する英語コーパスもおかしな状態でした。某I社の翻訳資産の素となるファイルは、HTML、XML、Word、FrameMakerなど様々な形式がありますが、おそらく、DTP系のファイルに入っていたセンテンスで、ページ番号や製品名などが動的に入るようになっていたのに、プレーンテキストに加工する際、その部分がごっそりと抜け落ちてしまったのではないかと推測されます。この例以外にも、おかしなセンテンスは何種類かありました。
筆者は、プレーンテキストに加工する前の状態を全く把握できていないこともあり、手持ちのパラレル・コーパスの中身に、少量とは言え、おかしなセンテンスが含まれているとは思ってもいませんでした。
でも、違う見方をすれば、これらのおかしなセンテンスを取り除いて言語モデルと翻訳モデルを作れば、必ずデコード結果の品質は向上するはずです。BLEUスコアを使った検証の、最初のテーマが決まりました。
悩ましい結果
比較する条件は、以下のとおりです。
改善前 | 手持ちのパラレル・コーパスを、そのまま使う。 | 103,835センテンス |
---|---|---|
改善後 | 手持ちのパラレル・コーパスから、おかしなセンテンスを取り除いて使う。 | 99,793センテンス (-3.9%) |
主な共通の条件は、以下のとおりです。
- デコード対象のセンテンスは、文章の類を手持ちのパラレル・コーパスから抽出。つまり、再現性の確認。
- 分かち書きは素の状態から手を加えない。(明らかにおかしな分かち書きもそのまま。)
- デコード時のパラメータのチューニングはしない。(当時はチューニング方法がわからなかったため。)
そして、肝心なデコード結果のBLEUスコアですが、以下のように非常に悩ましいものに。。
改善前 | 0.6602 |
---|---|
改善後 | 0.6477 (-1.9%) |
誤差の範囲かもしれませんが、改善したつもりが逆に下がってしまいました。んー、何なんでしょう、この結果。今思えば、僅か10万センテンスのパラレル・コーパスで検証しようということに無理があったのかもしれませんが、この結果を踏まえ、当時はこんな推測をしました。
- もしかしたら、翻訳モデルは数の勝負で、一部、おかしな文章があっても、フレーズ単位での対訳を作るという意味で、とにかく対象として入れたほうがいいのかもと思う。
- 翻訳モデルにおけるBLEUスコアへの影響度は、以下の式が成り立つのではないだろうか。
「センテンス単位での日本語や英語の文法的な的確さ」 < 「フレーズ単位での対訳の量」 - しかし、言語モデルは絶対に正しい日本語だけにしておかないと、例えば「を」で始まる文章を容認することになり、デコード結果の品質が落ちる要因となるはず。
- 翻訳モデルで使うコーパスと、言語モデルで使うコーパスは、切り離して考えたほうがよさそう。
不本意な結果になってしまいましたが、やはり、おかしなセンテンスを含んだままのパラレル・コーパスがいいはずないので、この検証結果だけで結論を決め付けず、いつかリベンジしようと頭の片隅に入れておくことにしました。
次回はユーザー辞書を使うとです。
[注] この回顧録は、かつて勤めていた会社で書いた連載を復元したもので、某I社の現在の状況を反映している訳ではありません。