輪読会「ゼロから作るDeep Learning② 自然言語処理編」第2回

はじめに

てくますプロジェクトでは、てくますゼミと呼ばれる輪読会を隔週で開催しています。

少人数であーだこーだ議論しながら、考える楽しさを分かち合う、ゼミのようなコミュニティです。主に、AIなどの「IT × 数学」領域について学習しています。

てくますゼミ(Connpass)

てくますゼミの風景

現在は「ゼロから作るDeep Learning② 自然言語処理編」という本を読み進めています。

今回は本書第2回の輪読会ということで、2章を読み進めました!

本記事では、今回の勉強会で学んだことをざっくりと紹介していきます。

学習内容

自然言語処理とは

自然言語処理とは分かりやすくいうと、私たちが普段使っている自然言語をコンピュータに理解させるための技術のことをいいます。

自然言語を理解させるためには、単語の意味を理解させなければなりません。単語の意味を理解させるためには、単語の意味をうまく捉えた表現方法を探す必要があるでしょう。

単語をうまく表現するため、この本では、以下のような手法を考えていきます。

  1. シソーラスによる手法(今回学ぶ)
  2. カウントベースの手法(今回学ぶ)
  3. 推論ベースの手法(次回以降学ぶ)

シソーラスによる手法

シソーラスとは類語辞典のようなものです。上位下位などの単語同士の関係をグラフで表現することで、単語間の繋がりを定義します。この単語ネットワークを利用することで、コンピュータに間接的に単語の意味を授けます。

単語間の繋がりの具体例(多分こんな感じ)
動物の下位には、哺乳類、鳥類、微生物など。
鳥類の下位には、スズメ、カラス、飛ぶなど。

単語の意味を与えるのではなく、単語同士の関連性を与えることで、間接的に単語の意味を授けようとするのは、すごいアイデアですね。ただ、上手くいくのだろうかと思ってしまいます。実際、シソーラスによる手法には以下のような課題があります。

  1. 時代の変化に対応するのが困難
    言葉の意味は時代によって変わります。
  2. 人の作業コストが高い
    シソーラスを人手で作るのは、それはもう大変でコストがかかるでしょう。繋がりを人が定義するわけですからね……。
  3. 単語の細かなニュアンスが表現できない
    関係性だけでは、単語の細かなニュアンスの差異を表せないということです。

中々難しいですね。

カウントベースの手法

続いてカウントベースの手法です。先ほどのシソーラスは、人手で単語の繋がりを定義しようとしていましたが、カウントベースの手法では自動的に効率よく計算することを目指します。

そのために利用するのが、コーパスと呼ばれる大量のテキストデータです。

カウントベースの手法では「単語の意味は、周囲の単語によって形成される」といったアイデア(分布仮説)を使います。コーパスを用いて、各単語の周囲にはどのような単語が並んでいるかを調べ、各単語の登場回数によってベクトルを作ります。

例えば、「coffeeという単語の周囲には、makeが○回、blackが□回、breakが△回登場した」といった回数の情報を抽出してベクトルを作ります。そのベクトルをもって、coffeeという単語を表現するということです。

このように、単語をベクトルで表すことを、単語の分散表現といいます。

さて、ベクトル同士の類似度はコサインを用いて調べることができます。これで単語同士の類似関係も分かります。

カウントベースの手法は、コーパスを準備する必要がありますが、その後は人手の作業を不要としているのがすごいですね。しかし、この手法にもまだ以下のような改善点があります。

  1. 回数情報だと、コーパスによく登場する言葉とそうでない言葉で不平等が生じる
    単なる回数の代わりに、相互情報量という概念を用いましょう。よく登場する言葉は出現した際のscoreを低減するといったアイデアです。
  2. ベクトルの次元数は大きいが、その要素の多くは0である
    ベクトルの次元数はコーパス内の単語の数だけあるので非常に大きいです。しかし、そのうちのほとんどは0であり、無駄な情報です。特異値分解(SVD)を用いて、ベクトルの次元削減を行いましょう。

実際に、改良したカウントベースの手法を実装し、試してみました。今回は、PTBと呼ばれるコーパスを用いています。

下記は you や year などの単語の類似単語を調べた実行結果。

おーー、すごい。

無事、類似度を調べることができました。

最後に

いよいよ自然言語処理の学習が始まりました。

今回は、人手で頑張る「シソーラスによる手法」と、コーパスを用いた「カウントベースの手法」を学びました。

次回からいよいよディープラーニングによる自然言語処理です。いやー、次回も楽しみです。

では、また!

本シリーズの記事はこちら

各ゼミの第1回記事はこちら