目次
はじめに
てくますプロジェクトでは、てくますゼミと呼ばれる輪読会を隔週で開催しています。
少人数であーだこーだ議論しながら、考える楽しさを分かち合う、ゼミのようなコミュニティです。主に、AIなどの「IT × 数学」領域について学習しています。
現在は「ゼロから作るDeep Learning② 自然言語処理編」という本を読み進めています。
今回は本書第2回の輪読会ということで、2章を読み進めました!
本記事では、今回の勉強会で学んだことをざっくりと紹介していきます。
学習内容
自然言語処理とは
自然言語処理とは分かりやすくいうと、私たちが普段使っている自然言語をコンピュータに理解させるための技術のことをいいます。
自然言語を理解させるためには、単語の意味を理解させなければなりません。単語の意味を理解させるためには、単語の意味をうまく捉えた表現方法を探す必要があるでしょう。
単語をうまく表現するため、この本では、以下のような手法を考えていきます。
- シソーラスによる手法(今回学ぶ)
- カウントベースの手法(今回学ぶ)
- 推論ベースの手法(次回以降学ぶ)
シソーラスによる手法
シソーラスとは類語辞典のようなものです。上位下位などの単語同士の関係をグラフで表現することで、単語間の繋がりを定義します。この単語ネットワークを利用することで、コンピュータに間接的に単語の意味を授けます。
単語間の繋がりの具体例(多分こんな感じ)
動物の下位には、哺乳類、鳥類、微生物など。
鳥類の下位には、スズメ、カラス、飛ぶなど。
単語の意味を与えるのではなく、単語同士の関連性を与えることで、間接的に単語の意味を授けようとするのは、すごいアイデアですね。ただ、上手くいくのだろうかと思ってしまいます。実際、シソーラスによる手法には以下のような課題があります。
- 時代の変化に対応するのが困難
言葉の意味は時代によって変わります。 - 人の作業コストが高い
シソーラスを人手で作るのは、それはもう大変でコストがかかるでしょう。繋がりを人が定義するわけですからね……。 - 単語の細かなニュアンスが表現できない
関係性だけでは、単語の細かなニュアンスの差異を表せないということです。
中々難しいですね。
カウントベースの手法
続いてカウントベースの手法です。先ほどのシソーラスは、人手で単語の繋がりを定義しようとしていましたが、カウントベースの手法では自動的に効率よく計算することを目指します。
そのために利用するのが、コーパスと呼ばれる大量のテキストデータです。
カウントベースの手法では「単語の意味は、周囲の単語によって形成される」といったアイデア(分布仮説)を使います。コーパスを用いて、各単語の周囲にはどのような単語が並んでいるかを調べ、各単語の登場回数によってベクトルを作ります。
例えば、「coffeeという単語の周囲には、makeが○回、blackが□回、breakが△回登場した」といった回数の情報を抽出してベクトルを作ります。そのベクトルをもって、coffeeという単語を表現するということです。
このように、単語をベクトルで表すことを、単語の分散表現といいます。
さて、ベクトル同士の類似度はコサインを用いて調べることができます。これで単語同士の類似関係も分かります。
カウントベースの手法は、コーパスを準備する必要がありますが、その後は人手の作業を不要としているのがすごいですね。しかし、この手法にもまだ以下のような改善点があります。
- 回数情報だと、コーパスによく登場する言葉とそうでない言葉で不平等が生じる
単なる回数の代わりに、相互情報量という概念を用いましょう。よく登場する言葉は出現した際のscoreを低減するといったアイデアです。 - ベクトルの次元数は大きいが、その要素の多くは0である
ベクトルの次元数はコーパス内の単語の数だけあるので非常に大きいです。しかし、そのうちのほとんどは0であり、無駄な情報です。特異値分解(SVD)を用いて、ベクトルの次元削減を行いましょう。
実際に、改良したカウントベースの手法を実装し、試してみました。今回は、PTBと呼ばれるコーパスを用いています。
下記は you や year などの単語の類似単語を調べた実行結果。
おーー、すごい。
無事、類似度を調べることができました。
最後に
いよいよ自然言語処理の学習が始まりました。
今回は、人手で頑張る「シソーラスによる手法」と、コーパスを用いた「カウントベースの手法」を学びました。
次回からいよいよディープラーニングによる自然言語処理です。いやー、次回も楽しみです。
では、また!