自然言語処理は機械学習の応用技術のひとつで、私たち人間が普段使っている「自然言語」から意味を解析する、といったことを目的としています。
チャットボットの開発や感情分析、文章の自動生成など大変応用範囲が広い分野ですので、身につけておいて損はない技術となっています。

ここでは自然言語処理の最初の一歩となる、カウントベースと推論ベースのふたつの手法について比べていきます。

機械学習ではプログラミング言語のPythonがよく利用されています。
こちらの無料講座でPythonの基礎を学び、未経験からでもプログラミングの基礎を身につけましょう!
過去にプログラミング学習に挫折した方でも続けやすい学習プログラムになっています。
ゼロから始めるPython入門講座(オンライン・無料)+【テックジム】

自然言語処理とは

そもそも自然言語とは私たちが日常生活で使用する言語で、いわゆる普通の言葉や文章のことです。

自然言語以外には、プログラミングに用いるためのプログラミング言語があります。
他にも、コンピュータが処理することのできる0と1の数値の羅列のみで表現された機械言語もあります。

自然言語には曖昧性の特徴があります。
私たちは今まで生きてきた経験や話し方などから様々な情報を得ることで、曖昧な文章であっても意味をくみ取ることができます。
しかし、コンピュータを相手とするプログラミング言語ではそのような中途半端な表現は許されず、厳格な指示が必要となります。

自然言語処理(NLP: Natural Language Processing)は、このような曖昧性のある自然言語をコンピュータによって解析させ、文章に含まれる感情や意味を解析することを目的としています。

これらの技術は翻訳やチャットボット、予測変換、感情分析、文章生成など様々な場面で応用されています。

文章の意味を読み取るためにはまず、コンピュータが単語の意味を理解する必要があります。
単語は、自然言語の中において意味を持った最小単位になります。
しかし、コンピュータが自ら言葉の意味を理解して処理をする、ということは不可能です。
ということで最初の課題は、どのようにして単語に意味を持たせるかということになります。

単語の意味を推測するための手法には様々なものがあり、シソーラスによって意味づけを行う方法やコーパスによって学習を行う方法などがあります。

コーパス

自然言語処理において、コンピュータが処理しやすい形式の文章をまとめたデータベースのことをコーパスといいます。
世の中に存在する文章は必ずしも、すべてがいい文章や正しい文章であるとは限りません。
そういったものを使ってコンピュータに学習をさせてしまうと、いいモデルをつくることができません。

そこで構造化された文章を大量に用意し、必要に応じて意味や構造などの付加情報を与えたコーパスを使用するのです。

シソーラスによる単語の意味解析

これは、人の手によって意味の似ている単語をまとめた辞書であるシソーラスを用いて意味づけを行う手法です。
単語の意味はツリー構造で定義されており、上位概念と下位概念のつながりなどによって単語を表現します。

人の手によって単語の分類を行うので、コンピュータに対して正確に意味を伝えることができます。

最も有名なシソーラスとしてはWordNetというものがあります。
こちらは単語同士の類似度を算出することもでき、非常に多くのアプリケーションに利用されていました。

しかしシソーラスは、人間の手によって作成する都合上、非常に手間がかかります
さらに新しい単語の登場や時代の流れによる単語の意味の変化に柔軟に対応できない、といったデメリットもあります。

そこで人間の手によって単語に意味を与えるのではなく、単語をベクトルとして表現することで意味を推測しようという試みが行われました。
ここでは代表的な例として、カウントベースの手法推論ベースの手法を取り上げていきます。

機械学習エンジニアを目指したいなら、本格的にプログラミングを学べるスクールを利用してみてはいかがでしょうか?
データサイエンス・機械学習に特化したコースでプロのエンジニアにチャットで質問することもできます。
まずは、無料体験・無料カウンセリングから自分にあったコースを探してみましょう!
データサイエンスコース

カウントベースの手法

シソーラスでは人間の手によって単語の意味をひとつずつ定義していましたが、ここで扱うのは単語を疑似的に意味を持った数値として扱う手法になります。

単語をベクトルとして表現することで、単語をある空間上のひとつの点として捉えることができます。
その空間上で近い位置にある点(単語)は似た意味を持っている、ということになります。

また、単語がベクトルとして表されているため、単語同士で演算することも可能です。
有名なものでは以下のような面白い計算があります。

"king" - "man" + "woman" = "queen"

このように分散表現を使えば、単語同士の関係性まで計算で得られるようになります。
一方で単語の意味が一意に固定されてしまい、曖昧性が考慮されないという問題もあります。

分布仮説

ここからは単語の意味を捉えたベクトル表現を生成するのですが、そこで分布仮説というものが非常に重要になります。

分布仮説とは、「単語の意味はその周辺に現れる単語によって形成される」という仮説です。
この仮説を元に、ある単語の前後にでてくる単語を調査することでその単語の意味を予測するということを行います。
言い換えると、前後に同じような単語が出てくる場合は意味が似ている、という考え方になりますね。

例えば以下の文章の場合を考えてみます。

I drink water.

“water”という単語の意味が分からないとしても、その前の”drink”の意味がわかっていれば”water”は「飲み物」なのだということがわかります。
このことからも”water”という単語の意味が”drink”という周辺の単語によって形成されていることがわかりました。

共起行列

分布仮説を元に、ある単語の周囲の単語の登場回数をカウントし行列として並べたもの共起行列といいます。
このように回数を数えることによって表現を得るものを、カウントベースの手法といいます。

以下のモハメド・アリの名言を元に共起行列を作成してみます。

The man who has no imagination has no wings.

登場した単語を並べた行列を作成し、各行に前後の単語の登場回数をカウントします。
hasやnoのように2回登場した単語はひとつにまとめます。

themanwhohasnoimaginationwings
the0100000
man1010000
who0101000
has0010210
no0002011
imagination0001100
wings0000100

\begin{bmatrix}
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
1 & 0 & 1 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 2 & 1 & 0 \\
0 & 0 & 0 & 2 & 0 & 1 & 1 \\
0 & 0 & 0 & 1 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
\end{bmatrix}

これで単語をベクトル化することができました。
このベクトルは、前後に登場する単語によってその単語が発現する様子を表しています。
例えば、”has”という単語を表すベクトルは$[0010210]$となります。

PMI、PPMI

前述した共起行列には、Iやtheといった頻繁に出てくる単語の共起回数(カウント数)が大きくなってしまうという問題点があります。
こういった単語の影響で、そこまで関係性のないはずの単語と強い相関を示すようになってしまいます。

そこで、コーパス内での単語の登場回数を考慮した共起回数を考えます。
これが自己相互情報量(PMI:Pointwise Mutual Information)で、以下の式のように表します。

\begin{eqnarray}
PMI(X, Y) = \log_2 \frac{P(X, Y)}{P(X) P(Y)}
\end{eqnarray}

PMIでは2つの単語が前後に現れる確率を、それぞれの単語の登場確率で割っています。
つまり2つの単語が前後に現れる回数がどれだけ多くても、それぞれの単語の出現回数が多いときはPMIを抑えることができます。

しかしPMIでは共起回数が0回の時に値が$-∞$となり発散してしまいます。
そこで、値が必ず正となるような相互情報量を考え、PPMI(Positive PMI)として以下のように定義します。

\begin{eqnarray}
PPMI(X, Y) = \max(0, PMI(X, Y))
\end{eqnarray}

共起行列の各要素に、登場回数の代わりにPPMIを適用したものをPPMI行列といいます。

次元削減

共起行列の問題点を解決したPPMI行列にもまだ問題点があります。
それは、共起行列やPPMI行列の行列としての大きさは、コーパス内に存在する単語数に依存するということです。

コーパスが大きくなると出現する単語の種類が増えて巨大で疎な行列になってしまう、つまり殆どの要素が0で埋まった情報の薄い行列ができてしまうわけです。

そこでできる限り情報を損なわないように、次元削減によってこの行列の次元数を圧縮します。
例えば$1000×1000$という大きな要素数の行列を、次元削減によって$1000×20$に変換する、といったことをします。
次元削減の方法は様々なものがありますが、ここではSVD(特異値分解)などがよく用いられます。

コサイン類似度

各単語ベクトル間の類似度を表す指標としてコサイン類似度がよく用いられます。
コサイン類似度が大きいほど単語ベクトルが同じ方向を向いている、つまり単語同士が似ているということになります。

コサイン類似度はベクトル同士の内積で求めることができます。

\begin{eqnarray}
similarity(X, Y) = \frac{\boldsymbol{X} \cdot \boldsymbol{Y}}{\| \boldsymbol{X} \| \| \boldsymbol{Y} \|}
\end{eqnarray}

推論ベースの手法

カウントベースの手法では、語彙数の増加に応じて行列が肥大化し、疎なベクトル表現になってしまうといった問題がありました。
次元削減によって密な表現に変換することはできますが、ここでは最初から密なベクトルを得るための推論ベースの手法を紹介します。

推論ベースの手法で得られる密な単語のベクトルのことを単語の分散表現といいます。

Word2Vec

Word2Vecは、ある単語(コンテキスト)からその周辺の単語(ターゲット)として適切な単語を推論する学習モデルです。
ニューラルネットワークをベースとしたモデルとなっています。
例えば先ほど用いた例文のうち、imaginationという単語だけを隠しておきます。

The man who has no [ ] has no wings.

この隠された単語をコンピュータに推測させることで学習を行います。

Word2Vecには、後程紹介するCBOWモデルとskip-gramモデルの2種類があります。

one-hotベクトル

one-hotベクトルは単語を表すためのベクトルで抽出したい単語を1、それ以外を0としてベクトルを表現します。
単語の意味を表すことはなく、ただ単語をIDのようにして扱います。

先ほどの例文であれば、以下のようにベクトルを考えます。

\begin{bmatrix}
the & man & who & has & no & imagination & wings
\end{bmatrix}

ここからimaginationという単語を取り出すためには以下のようなone-hotベクトルは以下のようになります。

\begin{bmatrix}
0 & 0 & 0 & 0 & 0 & 1 & 0
\end{bmatrix}

one-hotベクトルは入力した文章の単語の語彙数と同じ長さの固定長ベクトルとなります。

Embeddingレイヤ

one-hotベクトルは、行列においてその要素がどの単語に対応しているのかを表しています。
しかしこれは単語の意味を表すのではなく、ただ単語に対してIDをつけているだけになります。

そこで、one-hotベクトルに対して重みを掛け合わせる部分をEmbeddingレイヤといいます。
つまりEmbeddingレイヤは入力の一番前段階で、単語とベクトルの仲介を行う役割を担っているのです。
このレイヤを通過した後、実際にその単語の意味を持ったマッピング済みのベクトルが得られます。

CBOWモデル

The man who has no [ ] has no wings.

CBOWモデルでは、ある単語をターゲットとして、その前後のコンテキストから予測を行います。
コンテキストを2つのone-hotベクトルで入力し、出力はターゲットの出現確率を表すベクトルです。
単語の出現確率が最も高いものが隠された単語として有力なものと予想されており、実際に正解となる単語にこの確率分布が対応するように$W_{in}$や$W_{out}$を最適化していきます。

skip-gramモデル

The man who has [] imagination [] no wings.

skip-gramモデルでは、ある単語からその単語の前後のコンテキストを予測する、CBOWとは逆のモデルになります。
コンテキストの範囲が前後1単語ずつのものをユニグラム、2単語ずつのものをバイグラムと呼びます。

まとめ

自然言語処理における、カウントベースの手法と推論ベースの手法について解説してきました。
また、現在主流となっている推論ベースの手法の中でも最も基本的なモデルであるWord2Vecについても見てきました。

コンピュータには理解できない自然言語の意味を推論させるために様々な工夫がされてきたことがわかったかと思います。

今回紹介した以外にも非常に多くの手法が存在していますので、興味がある方は関連記事もぜひご一読ください!

AIエンジニアやデータサイエンティストへのキャリアチェンジを目指すなら、3カ月間の集中プログラムで徹底的に学習しましょう!
業務課題をAIを用いて解決したい方、教養としてAIを学習したい方にもおすすめです。
オンラインでPythonの基礎知識からしっかり学べるコンテンツを利用できます。
AIを学ぶならアイデミープレミアムプラン

関連記事

この記事のタグ