記録帳

クラウド、データ分析、ウイスキーなど。

自然言語と単語の分散表現

ゼロから作るDeepLearning2(自然言語処理編)を読んでいる。

第2章「自然言語と単語の分散表現」を読み終えたので、内容をメモする。

 

・本章でのゴール

単語を、意味を捉えたベクトル(これを分散表現と呼ぶ)として表すこと。
これができれば、単語同士の類似度も計算によって算出できる。

本書では、手法1、2、3と改善を行いながら、最終的に単語を2次元のベクトルとして表している。

 

・それぞれの手法について

「単語の意味は、周囲の単語によって形成される」という仮説が出発点。
(ex.)車を運転する、自転車を運転する、一輪車を運転するの3つの文から、「車」「自転車」「一輪車」は似た意味だということだわかる。

手法1.カウントベース

「周囲の単語によって」ということから、ある単語の前後で使われている単語をカウントして、その単語の意味とする手法。p.71の表がわかりやすい。
ただ、この方法はカウントするだけなので、theやaなど頻繁に使われる単語は、カウント数が多くなる=関連が高いと見なされる。theとcarとdriveという3つの単語があったとき、意味的に近いのはcarとdriveだが、the carという使われ方が多くなるためtheとcarの方が近いと判断されてしまう。

手法2.PPMI

そこで用いられるのがPPMIという手法。カウントではなく、その単語が出てくる回数を分母において計算する。つまりは、カウントではなく割合で出す手法である。
これで、theのように頻繁に使われる数は分母が大きくなるため、単純に大きな数にはならない。
ただ、この方法だとベクトルの次元数は単語の数と等しくなる。先ほどの例文ほどの短さなら良いが、単語数が増えると計算が困難になる。

手法3.次元削減(SVD)

PPMIで出したベクトルをみると、ほとんどが0である。つまり、ベクトルが高次元であっても、ほとんどが意味のない情報となっている。ここに目をつけ、SVDという計算方法を用いて(sklearnでライブラリが提供されている)次元削減をする。テキストでは、2次元に圧縮していた。

 

・途中で苦労したところ

p.72のcreate_co_matrixで引っかかった。
word_idごとにco_matrixを考えているところに注意する。(idxごとではない。なぜなら、idxはcorpusのインデックスであるため、同じ単語でも別単語としてカウントしてしまうから)

 

最終的には、アイドルのブログを学習データとしてモデルを作成し、アイドルブログ記事自動生成をしてみたい。