自然言語処理勉強結果「形態素解析の詳細」

自然言語処理学習結果

前回は、自然言語処理のうち、
解析の部分に焦点を当てていた。

その中でも、特に構造的な解析を行う
二つの解析を紹介した。

  • 形態素解析
  • 構文解析

今回は、このうち、形態素解析を具体的に
どうやっているのかというお話をしよう。

実際にはツールでやってくれるのだが、
その原理を知っておきたい。

なお、本講座は以下の本を参考に進めている。

もしよかったら、中身を覗いてみて欲しい。

Javaで学ぶ自然言語処理と機械学習 | 徹, 杉本, 志乃, 岩下 |本 | 通販 | Amazon
Amazonで徹, 杉本, 志乃, 岩下のJavaで学ぶ自然言語処理と機械学習。アマゾンならポイント還元本が多数。徹, 杉本, 志乃, 岩下作品ほか、お急ぎ便対象商品は当日お届けも可能。またJavaで学ぶ自然言語処理と機械学習もアマゾン配送商品なら通常配送無料。
スポンサーリンク

本編の前に

前回解説した形態素解析構文解析を行う
プログラムを作ってみた。

以下ページになるので、
よかったら色々な文を入力して試してみて欲しい。

形態素解析・構文解析

使い方は簡単、
解析したい文を入力欄に入れ、
「解析」ボタンを押すだけ。

そうすると、入力した文を
形態素解析係り受け解析してくれる。

ただ、今のところ一度に入力できるのは1文のみ
かつ最後に句点「。」が必要となる。

仕様としては、Yahooで用意されている
日本語形態素解析日本語係り受け解析の二つを
やってくれるAPIに入力文をそのまま投げ、
結果を表示しているだけだ。

今後、余力があれば複数文にも対応しようと思う。

形態素解析の詳細

では、ここから本題だ。

形態素解析には、大きく二つの段階がある。

  • ラティス構造の作成
  • 経路の選択

それぞれ、詳細を見ていこう。

ラティス構造の作成

まず、入力された文について、
考えられる単語の列全てを含むようなグラフ構造を作る。

この構造のことを、ラティス構造と呼ぶ。

先に、グラフの説明をしておこう。

ある集合を頂点集合
その二つの組を辺とし、
その集合である辺集合を考える。

この二つの集合からなる構造を、
グラフ構造と呼ぶ。

なお、今回の辺には
向きを考える有向辺を用いる。

このように、通常使う棒グラフのようなグラフとは
完全に違うもの
なので注意してほしい。

で、ラティス構造なのだが…
具体例を見てもらった方が早そうだ。

というわけで、
入力を「日本を出発する。」としたときの
ラティス構造の例を出そう。

まず、最初にいきなり分岐する。

「日本」という単語か、「日」という単語だ。

「日」に分岐した後は、「本」が次に来るが、
その品詞によってさらに分岐する。

といった形で、
考えられるパターンを全て分けていくのだ。

これで、いずれかの矢印を文頭から文末まで辿ると、
その経路が形態素解析の結果となる。

となると、次にどういった経路を辿るか
という問題になる。

経路の決定方法

これも大きく二つの考え方がある。

  • 経験的な手法
  • 統計的な手法

経験的な手法

これは最長一致法分割数最小法などがある。

最長一致法とは、
分岐時に単語が最長となるものを選んで進む方法。

分割数最小法は、
経路の長さ(=辿る単語の数)が最小になるよう進む方法。

これらでも、ある程度正しい結果が得られるが、
常に正しいとは言いづらい

そこで、統計的に見てみよう、というお話になる。

統計的な手法

参考となるデータをもとに、
どのようなものが正しいかを計算するのが、
この統計的な手法だ。

代表的なものに、コスト最小法がある。

単語自体や、それらの間にある矢印コストを付与し、
それが最小となるルートを辿るという考え方だ。

単語コスト\(cost(w)\)は、
単語\(w\)の出現頻度が小さいほど大きくなるように、
接続コスト\(cost(w, w’)\)は、
単語\(w\)と\(w’\)が繋がりにくくなるほど
大きくなる
ように設定される。

このとき、文\(S=w_1 w_2 … w_n\)の
総コスト\(cost(w_1, w_2, …, w_n)\)は、
以下のように求めることができる。

$$
\begin{eqnarray}
cost(w_1, w_2, …, w_n) & = & cost(w_1) + cost(w_2) + … + cost(w_n) \\
& + & cost(w_1, w_2) + cost(w_2, w_3) + … + cost(w_{n-1}, w_n) \\
& = & \sum_{i=1}^n cost(w_i) + \sum_{i = 1}^{n – 1} cost(w_i, w_{i + 1})
\end{eqnarray}$$

やっていることは非常に単純で、
各単語と、単語間それぞれのコストを
全部足しているだけだ。

で、単語コスト接続コストが分かればいいのだが、
そこが問題だ。

というわけで、これらを導出する方法として、
以下のようなものがある。

  • 単語N-gram
  • 隠れマルコフモデル

さらに、これらのコストを求めた後に、
コストが最小となる経路を求めるアルゴリズムの例として、
ビタビアルゴリズムがある。

これらの詳細に進んでもいいのだが…
ちょっと長くなりそうなので、一旦ここで切ろう。

おわりに

今回は、形態素解析具体的にどのように行われるかを見てきた。

とはいえ、まだ概要レベルだ。

最初に、考えられる可能性全てを持つ
ラティス構造というグラフを作る。

その後、各単語や関係のコストを求め、
その最小となる経路を出す
、という流れになる。

というわけで、次回はちょっと名前を出した、
具体的な考え方を見ていこう。

色々と解説しているので、
全体像のうち、今どこにいて何をしているのか
を意識しておくようにしよう。

コメント

タイトルとURLをコピーしました