Re:ゼロから始めるML生活

どちらかといえばエミリア派です

自然言語処理について勉強してみた(その1:基本)

StackGAN、HDGANやAttnGANなどのText-to-Image系の勉強をしていると、ある程度自然言語処理の知識が必要になってきます。 今まではその辺度外視して、GANにフォーカスして勉強してみたんですが、このへんで自然言語処理について勉強してみようと思います。

tsunotsuno.hatenablog.com

tsunotsuno.hatenablog.com

tsunotsuno.hatenablog.com

そんなわけで、今回は自然言語処理の基本について勉強してみました。 参考にさせていただいたのはこちら。

ゼロから作るDeep Learning ? ―自然言語処理編

ゼロから作るDeep Learning ? ―自然言語処理編

初学者向けの本で、本当にゼロからやるには最適だと思います。 というわけでゼロからお勉強してみたので、そのメモです。 細かい説明はこちらの本を買って読んでもらうとして、なんとなく私が使いそうなところだけメモっていきます。

自然言語処理とは

自然言語処理の大きな目標としては、人間が慣れ親しんでいる自然文をコンピュータに理解させて、人間の役にたつことをコンピュータにさせるようにしていくことです。 そのために、人間の言葉をコンピュータに理解させることが自然言語処理の分野で取り扱うものになります。

人間の言葉をコンピュータに理解させるということを、もう少しブレークダウンするとこんな感じになっているようです。

大まかに文章の構造を理解させるか、もう少しメタな視点で文章の意味を理解させるかに大きく二分されるようです。 前者はコンパイラなんかが具体例に当たるんでしょうかね。後者が世間一般で言われているいわゆる自然言語処理のような気がしますね。 その中にも細かな技術要素があってそれはこんな感じになっているようです。

この細かな技術要素について、現在も研究開発が進められています。

単語

言語を構成する意味の最小単位は単語です。 単語が持つ意味を組み合わせ・並べ替えを行うことで、自然文が構成されています。

単語の意味を理解するための手法

単語の意味をコンピュータに理解させる手法としては、大体下記の3つが知られているようです。

  • シソーラス
    • 人の手で単語の意味を与えていく(大きな辞書を作るイメージ)
      • (例) 車 = 自動車, Mobility, クルマ、くるま; 乗り物 \in 車、電車、自転車、飛行機
  • カウントベース
    • 着目する単語の周囲の単語の登場頻度をカウントすることで意味を理解(分散仮説に基づいた分析)
  • 推論ベース(Word2Vec)

手作業が多かったり、解釈の精度が思ったほど出なかったりで、最近はもっぱら推論ベース(Word2Vec)を使っていろんなことをやっていくのが主流ですね。 この手の分析の話に登場するキーワードがいくつかありますので紹介していきます。

コーパス

自然言語処理の文脈で結構な頻度で登場するのがコーパスというキーワードです。

コーパス(英: corpus)は、言語学において、自然言語処理の研究に用いるため、自然言語の文章を構造化し大規模に集積したもの。構造化し、言語的な情報(品詞、統語構造など)を付与している。言語学以外では「全集」を意味することもあり、言語学でも日本語を扱う場合には、「言語全集」「名詞全集」「動詞全集」などと呼ぶとよい[1]。コンピュータ利用が進み、電子化データとして提供している[2]。

(出典:Wikipedia)

基本的には普通の文章を大規模に集積したものを表しますが、ポイントは品詞や文の構造を与えられたデータ形式に変換されている点です。 自然言語処理では様々な形でコーパスが使用されるようです。

分散仮説 (distribution hypothesis)

シソーラス以外の手法で単語の意味を理解しようとする手法の前提にある仮説を分散仮説と呼ばれます。 特に難しいことでもなんでもなくて、

単語の意味は、周囲の単語によって形成される

という仮説です。 関連性の強い単語同士が、文中でも近くに登場するだろうという仮説で、直感的には正しい気がしますね。

共起行列

共起行列は簡単に言うと、各単語が多次元空間上でどこに位置しているかを表現した行列です。 例を見たほうが速いので、参考に見てみます。

And I have always wished that for myself. And now, as you graduate to begin anew, I wish that for you. Stay Hungry, Stay Foolish.

(出典:Steve jobs' 2005 stanford speech)

上のめちゃくちゃ有名なスピーチの一説について共起行列を考えます。

共起行列を考える際には、

  1. 文を単語にバラす
  2. 着目する単語の前後に登場する単語をカウントする
  3. 文中すべての単語に対してカウントを集計する

こうしてカウントするとこんな感じの行列が得られるはずです。

f:id:nogawanogawa:20190203071414p:plain

各行が各単語を表すベクトルとなっており、単語と単語との間にある出現しやすさを表しています。

このように表現されたものが共起行列と呼ばれます。

カウントベースによる単語の意味の取得

カウントベースでの単語の意味の取得には、上の共起行列を使用します。

共起行列に含まれる各単語のベクトルの組み合わせに関して、コサイン類似度を計算します。

 similarity(x, y) = \frac{x \cdot y }{|x||y|}

これにより、ある注目する単語について、近傍に登場しやすさを推定できるので、分散仮説によって単語の意味を推定できるようになります。

感想

やっぱり奥が深いですね。 難しいですが、少しずつ勉強していきたいと思います。

ということで、次はWord2Vecについて勉強します。