2文章の類似度の計算〜Bag-of-wordsとcos類似度のしくみ〜
翻訳システムやチャットボットなど、文章の内容を理解する(ように振る舞う)AIが日常の様々なシーンに登場するようになりました。
翻訳サイトで和文・英文の翻訳をした事のある方は多いと思います。
・・・が、その翻訳結果を見ると、どうも変な文章だな…と思われた事も多いのではないでしょうか。
日進月歩で性能は上昇しているのですが、「言葉」というのは我々が思っているよりも複雑です。
人間が不自然さを覚えないような翻訳が完璧出来るようになるのはまだまだ先に思えます。
それにしても、そもそもAIに文章を理解させるためにはまず何を行えば良いのでしょうか?
それには、「自然言語処理」と呼ばれる技術を用いるのですが、今回はその基本理論として、2つの文章がどれだけ近いものかを数値で測るプロセスを紹介します。
今回の例題
例題として、以下の2つの文書を数値化し、その類似度を計算してみます。
文章A:私は犬が欲しい
文章B:僕は犬を飼いたい
数値化や類似度計算の方法もひとつではありませんが、今回はシンプルなBag-of-wordsという手法を使ってみます。
大きな手順は以下となります。
①形態素解析⇒②文書のベクトル化⇒③類似度計算
1つ1つ説明していきます。
手順1:形態素解析
形態素解析とは、「文書を単語ごとに分解する作業」のことです。
文章Aなら、
「私」・・・名詞
「は」・・・助詞
「犬」・・・名詞
「が」・・・助詞
「欲しい」・・・形容詞
文章Bなら、
「僕」・・・名詞
「は」・・・助詞
「犬」・・・名詞
「を」・・・助詞
「飼い」・・・動詞
「たい」・・・助動詞
となります。英語ならば元々単語と単語の間にスペースが入っているのでこの作業は不要なのですが、日本語だとまずこの単語ごとに区切る作業が必要です。
この作業は基本的に人が行う必要はなく、「MeCab」や「Janome」といった、文章を入力するだけで単語ごとに分解してくれるパッケージが公開されていますので、基本的にはそれらを活用します。
手順2:文章のベクトル化
文章を単語ごとに区切ると、文章を数値のベクトルで表現することができます。
その為には、文章AとBに出てきた要素をタテに書き並べます。
そして、用いられている単語は1、用いられていない単語は0とすると、文章AとBは以下のように表現できます。
これにより、「国語」の世界が「数学」の世界に移り変わりました。
手順3:類似度計算
文章が数値ベクトル化されたことによって、類似度が計算できます。
ベクトルの近さをそのまま2文章の近さとすれば良いわけですね。
その方法も多々ありますが、今回はその中でも特に広く用いられるコサイン類似度についてご説明します。
コサイン類似度
コサイン類似度というのは、2つのベクトルのなす角度のコサインです。
2つのベクトルが全く同じ方向を向いていればcos(0°)=1となり、全く逆方向を向いていればcos(180°)=-1となります。
つまり、ベクトルの向きが近ければ近いほど、この値は大きくなると言えます。
ちなみに、別にコサインなんかしないで角度をそのまま使えば良いのでは?と思われるかもしれませんが、実はコンピュータにとっては角度を計算するより、そのコサインを計算する方が楽なんです。
コンピュータは人間と違って分度器を持っていないので、角度を求めるのは大変です。
しかしコサインというのはコンピュータの得意な足し算・掛け算だけで計算できます。
それは以下の内積の公式を見ると分かります。
左辺はaとbの内積です。
これはaの1つ目の要素とbの1つ目の要素を掛けたもの、aの2つ目の要素とbの2つ目の要素を掛けたもの・・・という計算を最後の要素まで行って、それをすべて足し合わせた値です。
右辺は、aの長さとbの長さです。これはそれぞれ三平方の定理(を拡張したもの)で計算できます。
aの長さは、aの1つ目の要素の2乗、2つ目の要素の2乗、・・・をすべて足し合わせ、最後に平方根を取ったものです。
bの長さについても同様。
これらが分かれば、内積の定義より、コサインの値が計算されます。
以上を整理すると、下図のようになります。
これで、2つの文書がどれだけ近いのか、数値で表す事ができました。
今回の例文で言えば、2つの文章の類似度は2÷(√5×√6)=約0.365と計算されるようです。
まとめ
今回お話した手法は自然言語処理の中でも基本中の基本となる処理です。
ここから、例えばこの2文章の類似度はもっと近いはずだと見て、例えば重要な単語のウェイトを重くする、不要な単語は考慮に入れない、など様々な調整を加え、場面場面において適切な類似度計算方法を考えてゆくことが大切です。
さらに自然言語処理について知りたい方は、以下の書籍もオススメです。
非常に高度な内容を、非常に分かりやすく解説してくれています。
以上、自然言語処理の基本操作についてでした。