はじめに
単語の表現方法について勉強したことをまとめます。
想定する読者はプログラム上で単語をどのように扱っているのか知りたい人です。コードなどは記載していないので、どうやって実装するかに興味がある人は違う記事を参照してください。
単語の意味をコンピュータに理解させるモチベーション
自然言語処理(NLP)は人間の言葉を理解させ、処理させる技術、タスクのことです。そのNLPで扱う、人間の言葉において、単語は意味の最小単位です。
そのため、コンピュータが理解できる、単語の意味の表現方法を考えると、人間の言葉が理解できそうだと考えられます。
単語の表現方法
ここでは2つの表現方法を紹介します。
シソーラス(thesaurus)
シソーラスとは、類語辞書のことです。同じ意味の単語や、意味の似た単語によって単語の意味を表現します。
加えて、単語の間で上位と下位といった、関連性が定義されている場合もあります。
問題点
シソーラスは人手によって定義されているため、以下のような問題があります。
- 作業コストが高い
- 単語の誕生や消滅、意味の変化についていくのが大変
カウントベースの手法
問題点を解決するための1つの手法がカウントベースの手法です。カウントベースの手法では、コーパス(テキストデータ)から自動的に、人間の言葉のエッセンスを抽出することが目標です。
この手法では、単語をベクトルで表します(分散表現と呼ばれます)。イメージは色の表現方法である、RGBです。(R,G,B)=(2, 3, 255)だとしたら、青が大変強い色だということがわかります。これと同じことを単語でも行います。
しかし、分散表現における要素の値(RGBの 2, 3, 255という数値)はどのように決めるのでしょうか?
分布仮説
要素の値を決める理論の根底は分布仮説にあります。分布仮説とは、単語の意味は、周囲の単語によって形成されるというものです。ある単語の周囲にはどのような単語が存在するのか、それを数えてベクトルの要素とします。
例えば、Hello world. Goodbye world. から得られる、helloとgoodbyeのベクトルを求めてみます。helloの周囲にはworldが存在します。goodbyeの周囲にもworldが存在します。ベクトルを[helloの数, worldの数, goodbyeの数]で表すとすると、helloの分散表現は[0, 1, 0]で、goodbyeの分散表現は[0, 1, 0]です。
問題点
先ほどの例からわかる通り、コーパスが小さすぎると単語の正確な意味を表現することができません。(helloとgoodbyeが同じ分散表現で表されている)
しかし、コーパスを大きくすることにも問題があります。それはデータサイズが大きくなりすぎることです。コーパスが大きくなると語彙数が増えます。つまり、数を数える対象が増えてしまいます。10万の語彙が仮にあったとしたら、ある語彙の分散表現の長さは10万で、それを10万の語彙分持つことになります。
参考文献
ゼロから作るDeep Learning ❷ ―自然言語処理編