文の類似度を計算する方法
機械翻訳の翻訳性能を示す指標として、BLEU(bilingual evaluation understudy)スコアをはじめ、いくつかの指標が提案されています。その多くは、機械翻訳で翻訳された訳文が、人間が翻訳した「正しい」訳文とどれだけ似ているか(あるいはどれだけ異なっているか)を表しています。
機械の訳文が人間の訳文に似ていればいるほど、機械翻訳の性能がよいと考えられます。そこで、文の類似度を自動的に計算できれば、翻訳の品質を自動的に評価することが可能になります。
人間が訳した参照訳を用意できない場合でも、原文を機械翻訳にかけたのち、訳文を機械翻訳で原語に戻し、元の原文との類似度を計算することが考えられます。原文と逆翻訳文が似ていればいるほど、訳文の品質がよい可能性が高いでしょう。
では、2つの文の類似度を計算するには、どうすればよいでしょうか。いくつかの計算方法がありますが、この記事では、比較的よく用いられる2つの方法を紹介します。
目次[非表示]
- 1.レーベンシュタイン距離に基づく類似度
- 1.1.レーベンシュタイン距離とは
- 1.2.類似度の計算
- 2.文字nグラム特徴ベクトルに基づく類似度
- 3.おわりに
- 4.川村インターナショナルの翻訳サービス
レーベンシュタイン距離に基づく類似度
レーベンシュタイン距離とは
ある文を別の文に変換するときに、1文字の挿入、1文字の削除、1文字の置換のいずれかを1手順として、最小の手順で変換することを考えます。
たとえば「こんにちは」を「こんばんは」に変換する場合、3文字目の「に」を「ば」に置換し、4文字目の「ち」を「ん」に置換すればよいので、最小の手順数は2になります。
こ |
ん |
に |
ち |
は |
↓
こ |
ん |
ば |
ち |
は |
↓
こ |
ん |
ば |
ん |
は |
この手順の数を「レーベンシュタイン距離」(Levenshtein distance)と呼びます。つまり、「こんにちは」と「こんばんは」のあいだのレーベンシュタイン距離は2です。
では、「おはよう」と「さようなら」のレーベンシュタイン距離はいくつになるでしょう。
まず、最初の「お」を削除して1手順、次の「は」を「さ」に置換して1手順、末尾に「な」と「ら」を追加して2手順、合計4手順ですから、レーベンシュタイン距離は4となります。
お |
は |
よ |
う |
_ |
↓
は |
よ |
う |
_ |
_ |
↓
さ |
よ |
う |
_ |
_ |
↓
さ |
よ |
う |
な |
_ |
↓
さ |
よ |
う |
な |
ら |
類似度の計算
レーベンシュタイン距離は、文が異なっているほど数値が大きくなり、文が似ているほど数値が小さくなります。そこで、レーベンシュタイン距離を使って、文の類似度を数値で表すことができます。
ただ、レーベンシュタイン距離は、2つの文が似ていても、文が長くなれば値が大きくなります。これでは不都合なので、最小値が0、最大値が1になるように、レーベンシュタイン距離を正規化してみましょう。
レーベンシュタイン距離の最小値は、2つの文が同一で何の操作も必要ない場合ですから、0です。一方、レーベンシュタイン距離の最大値は、長い方の文の文字をすべて削除または置換する場合なので、長い方の文の文字数になります。
したがって、レーベンシュタイン距離を長い方の文の文字数で割れば、0から1までの値に正規化できます。
さて、レーベンシュタイン距離は、2つの文が似ているほど値が小さく(0に近く)、異なっているほど値が大きく(1に近く)なります。
類似度の指標とするなら、その逆に、似ているほど値が大きく、異なっているほど値が小さいほうがわかりやすいでしょう。そのためには、正規化したレーベンシュタイン距離を1から引けばよいでしょう。
以上を数式で書けば、次のようになります。
類似度=1-レーベンシュタイン距離÷長い方の文の文字数 |
それを100倍すれば、パーセントになって、さらにわかりやすくなります。つまり、2つの文がまったく同じときに100%、まるで異なっているときに0%となります。
「こんにちは」と「こんばんは」であれば、レーベンシュタイン距離が2、文の文字数はどちらも5ですから、(1-2÷5)×100で類似度は60%となります。同様に、「おはよう」と「さようなら」なら、レーベンシュタイン距離が4、長い方の文の文字数が5なので、(1-4÷5)×100で類似度は20%となります。
文字nグラム特徴ベクトルに基づく類似度
レーベンシュタイン距離に基づく類似度は十分実用的ですが、うまくいかない場合もあります。
「ヘビをカエルが食べた。」という文を翻訳して逆翻訳したときに、「カエルがヘビを食べた。」となったとしましょう。「ヘビを」と「カエルが」の順序が入れ替わっただけで、文の意味はほとんど変わりません。
そのため、翻訳の評価という観点からは、これらの文はよく似ていると判断したいところです。ところが、レーベンシュタイン距離を使ってこれらの文の類似度を計算すると、45.5%となって、あまり似ていないことになってしまいます。
文字nグラム
では、2つの文に共通して使われている文字が多いほど似ていると判定してはどうでしょう。でも、そうすると、これらの2つの文はまったく同じ文字を使っているので、100%似ている、つまり同一の文ということになってしまいます。それでは困ります。
そこで、それぞれの文を3文字の並びに分割してみましょう。「ヘビをカエルが食べた。」なら、「ヘビを」「ビをカ」「をカエ」「カエル」「エルが」「ルが食」「が食べ」「食べた」「べた。」とします。
同様に、「カエルがヘビを食べた。」なら、「カエル」「エルが」「ルがヘ」「がヘビ」「ヘビを」「ビを食」「を食べ」「食べた」「べた。」となります。
一般に、文字列をn文字の並びに分割したものを「文字nグラム」(character n-gram)といいます。この場合は、3文字の並びに分けたので、文字3グラムです(3グラムは「トリグラム」(trigram)ともいいます)。
すると、どちらの文にも9つのトリグラムがあり、共通しているトリグラムは「ヘビを」「カエル」「エルが」「食べた」「べた。」の5つ、残り8個のトリグラムはどちらか片方の文にしか出現しないということになります。
合計13個のトリグラムがあって、そのうち共通するトリグラムが5つ、共通しないトリグラムが8つとなると、あまり似ていないということになりそうです。
でも、1文字ごとに分割した場合、すなわち文字1グラム(ユニグラム:unigram)で比べた場合は、100%似ていることになって困ります。トライグラムで離れすぎるのなら、2グラム(バイグラム:bigram)でちょうどいいかもしません。
いっそのこと、ユニグラム、バイグラム、トリグラムを全部使ったらどうでしょう。つまり、「ヘ」「ビ」「を」「ヘビ」「ビを」「をカ」「ヘビを」「ビをカ」「をカエ」等々をすべて列挙して、これらの文字1,2,3グラムがどれだけ共通しているかで類似度を測ることができないでしょうか。
特徴ベクトル
単純に共通するnグラムと共通しないnグラムの数を数えるのはうまくありません。というのも、同じnグラムが1文に何度か出現することがあるからです。
たとえば「こねこ」と「ねこ」をそれぞれユニグラムに分割して比較するとき、「こ」「ね」「こ」と「ね」「こ」に分けると、共通するユニグラムが「こ」と「ね」の2つ、共通していないユニグラムはないということになります。
でも、「こねこ」に2回出現する「こ」と1回しか出現しない「ね」を同じ1つとして数えるのは、いい考えではないでしょう。
そこで、同じn文字の並びが複数回出現したときは、それぞれ別のnグラムだと考えましょう。言い換えると、n文字の並びに番号を付けたものをnグラムとみなします。
たとえば「こねこ」と「ねこ」をユニグラムに分割するとき、「こ1」「ね1」「こ2」と「ね1」「こ1」のように分けます。
そのうえで、各nグラムの出現回数を並べて数字の組を作ります。たとえば、「こねこ」には「こ1」「ね1」「こ2」がそれぞれ1回ずつ出現しますが、これを (1, 1, 1) と書くことにします。「ねこ」は「こ1」「ね1」が1回ずつ出現し、「こ2」は出現しないので (1, 1, 0) となります。
こ1 |
ね1 |
こ2 |
||
こねこ |
1 |
1 |
1 |
(1, 1, 1) |
ねこ |
1 |
1 |
0 |
(1, 1, 0) |
このような数字の組を、数学ではベクトルと呼びます。これらのベクトルは、それぞれの文の特徴を数値化したベクトルという意味で「特徴ベクトル」(feature vector)と呼ばれます。
文字1,2,3グラムを使うとすると、ユニグラムが「こ1」「ね1」「こ2」、バイグラムが「こね1」「ねこ1」、トリグラムが「こねこ1」で合計6つですから、特徴ベクトルは6次元ベクトルになります。
こ1 |
ね1 |
こ2 |
こね1 |
ねこ1 |
こねこ1 |
||
こねこ |
1 |
1 |
1 |
1 |
1 |
1 |
(1, 1, 1, 1, 1, 1) |
ねこ |
1 |
1 |
0 |
1 |
0 |
0 |
(1, 1, 0, 0, 1, 0) |
先ほどと同じように各nグラムの出現回数を並べると、「こねこ」は (1, 1, 1, 1, 1, 1)、「ねこ」は (1, 1, 0, 0, 1, 0) となります。
類似度の計算
さて、残った課題は、ベクトルとベクトルの「類似度」を計算することです。
これについてもいろいろな方法がありますが、ここでは、2つのベクトルのあいだの角度に注目しましょう。
ベクトルは、図形的には矢印だと考えることができます。2本の矢印があるとき、それらを平行移動して始点が重なるようにすると、2本の矢印のあいだの角度を測ることができます。
2つの文が似ていれば、2つのベクトルが似た方向を向くので、角度は小さくなります。2つの文が同一であれば、ベクトルも同じ向きで、角度は0になります。
逆に、2つの文が異なっていれば、2つのベクトルは異なった方向を向くので、角度が大きくなります。上記の方法で作った特徴ベクトルは、幾何的には超立方体の1つの頂点からもう1つの頂点に向かう矢印であり、角度の最大値は90度(直角)です。
実際には、角度を求めるより、角度の余弦(コサイン)の値を求めるほうが簡単です。さらに都合のよいことに、余弦の値は、角度0のときに1、直角のときに0となり、角度が大きいほど値が小さくなります。
そのため、2つの特徴ベクトルがなす角度の余弦の値を、そのまま類似度とすることができます。
一般に、2つのベクトルがなす角度の余弦は次の式で求められます。
角度の余弦=ベクトルの内積÷ベクトルの長さの積 |
ところが、前述の方法で特徴ベクトルを作った場合、ベクトルの内積は、2つの文に共通するnグラムの数に一致します。また、ベクトルの長さは、各文のnグラムの数の平方根に一致します。
したがって、nグラムの数を数えるだけで、簡単に類似度を計算できます。
「こねこ」と「ねこ」なら、「こねこ」の1,2,3グラムが「こ1」「ね1」「こ2」 「こね1」「ねこ1」「こねこ1」の6つ、「ねこ」の1,2,3グラムが「ね1」「こ1」「ねこ1」の3つ,共通する1,2,3グラムが「こ1」「ね1」「ねこ1」の3つですから、類似度は3÷(√6×√3)≒0.707となります。
これも100倍してパーセントにすればわかりやすいでしょう。すると、「こねこ」と「ねこ」の類似度は70.7%になります。また、「ヘビをカエルが食べた。」と「カエルがヘビを食べた。」について同様に計算すると、類似度は80%です。
おわりに
レーベンシュタイン距離も文字nグラムも、文を文字単位で処理するので、言語に依存しないという利点があります。特に、日本語のように文を単語に分けるのが難しい言語でも使うことができます。
また、どちらも簡単なアルゴリズムで計算できるので、コンピューターを使えばあっという間に類似度を求められます。
計算が容易な反面、文法や意味を考慮していないので、訳文としての品質が低くても類似度が高くなったり、ほとんど同じ意味なのに類似度が低くなったりする場合があります。
たとえば、「ヘビをカエルが食べた。」と「ヘビがカエルを食べた。」では意味が正反対ですが、レーベンシュタイン距離に基づく類似度は90.9%です。
また、「た。ヘビをカエルが食べ」は日本語として成立していませんが、文字1,2,3グラム特徴ベクトルに基づくと、「ヘビをカエルが食べた。」との類似度は90%となります。
一方、「ヘビをカエルが食べた。」と「蛇を蛙が食べた。」では、意味が同じであるにもかかわらず、類似度はレーベンシュタイン距離に基づくと54.5%、文字1,2,3グラム特徴ベクトルに基づくと51.8%となります。
どちらの類似度も、翻訳の品質評価という観点からは、あくまで目安として用いるべきでしょう。訳文を適切に評価するには、プロの翻訳者に依頼する必要があります。
川村インターナショナルの翻訳サービス
機械翻訳を最大限に活かして翻訳を行う「ポストエディット(PE)」による翻訳サービスの需要が高まっています。ポストエディット (Post Editing) とは、スピードとコスト重視の機械翻訳だけでは品質が不十分なケースで、人手による後編集を適用して、お客様が求める翻訳に仕上げるサービスです。
すべてのコンテンツ、文書に対してポストエディットが適しているわけではありませんが、ローカリゼーションを中心にマーケティング翻訳、マスメディア翻訳などはポストエディットに向いている文書と言えます。
川村インターナショナルでは、英語と日本語のペアに限定せず、英語から欧州言語など、ネイティブの言語を話すポストエディターを確保できるのも弊社の強みです。お客様が抱えるあらゆる問題について、多様なご提案をさせていただきます。お気軽にお問い合わせください。
関連記事