前回は、形態素解析には二つの段階があることと、
その前半のラティス構造について解説した。
後半として、コストを推定し、
その最小経路を探す部分が残っている。
今回は、そのコストを推定する部分について
解説していこう。
このあたりは前回も書いた通り、
実際にはツールで行ってくれる。
しかし、その中で何が行われているかも
把握しておきたい、ということだった。
なお、本講座は以下の本を参考に進めている。
もしよかったら、中身を覗いてみて欲しい。
単語N-gramモデル
これを説明する前に、
単語N-gramというものを解説しておこう。
単語N-gram
単語N-gramとは、
文中に連続して出現する\(N\)個の単語の組のことだ。
本記事では、断りがない限り、
単語N-gramと言ったら、\(w_1, w_2, …, w_N\)で表すとしよう。
例えば、「ラーメンを食べる」という文に対する
単語N-gramを見てみよう。
これを、1-gramから3-gramまで並べてみる。
- 1-gram : (ラーメン), (を), (食べる)
- 2-gram : (ラーメン, を), (を, 食べる)
- 3-gram : (ラーメン, を, 食べる)
こんな感じだ。
単語N-gram確率
次に、これと確率を関連付けてみよう。
また新しく、単語N-gram確率という言葉を定義する。
これは、N-1個の単語\(w_1, w_2, …, w_{N-1}\)が
この順で出現するという条件で、
その次に単語\(w_N\)が来る確率だ。
そう、これも条件付き確率となる。
記号としては、\(P(w_N | w_1, w_2, …, w_{N-1})\)としておこう。
条件付き確率については、
以前別記事の中で紹介している。
よかったら、そちらも参照してほしい。
ナイーブベイズ分類器を理解するための数学「確率」 | Shino’s Mind Archive
もう一つ、コーパスという言葉を説明しておこう。
コーパスとは、実際に書かれた、あるいは
話された言葉を集めた言語データのこと。
機械学習で言うところの学習データのようなものだと
思ってもらっていいだろう。
では、単語N-gram確率を求めていこう。
とはいえ、そんなに難しくない。
コーパス中に含まれる、
単語列\((w_1, w_2, …, w_k)\)の出現回数を、
\(count(w_1, w_2, …, w_k)\)と表現する。
このとき、単語N-gram確率は、
$$P(w_N | w_1, w_2, …, w_{N-1}) = \frac{count(w_1, w_2, …, w_{N-1}, w_N)}{count(w_1, w_2, …, w_{N-1})}$$
で求めることができる。
要するに、最後の1文字以外が出てきた回数を分母に、
それも含めた回数を分子に置いているだけだ。
ただ、これはNが2以上のものの場合だ。
Nが1の場合は、単にコーパス全体の単語量で、
その単語の出現回数を割ってあげればいい。
さっきのラーメンの例で、
具体的に計算をしてみよう。
あるコーパスに、1万の単語が含まれていたとしよう。
その中で、注目する単語N-gramが
以下の出現回数だったとする。
単語N-gram | 出現回数 |
---|---|
(ラーメン) | 20 |
(を) | 400 |
(食べる) | 25 |
(ラーメン, を) | 10 |
(を, 食べる) | 20 |
このとき、単語1-gram確率は、
単に1万で割ればよかった。
- ラーメン : 0.002
- を : 0.04
- 食べる : 0.0025
次に単語2-gram確率、
これはちょっと丁寧に計算してみよう。
まず、(ラーメン, を)というものについて。
式をそのまま書き換えると、
$$P(を | ラーメン) = \frac{count(ラーメン, を)}{count(ラーメン)}$$
こうなる。
表から、分子は10、分母は20と分かるので…
$$P(を | ラーメン) = \frac{10}{20} = 0.5$$
となる。
同じように計算すると、
(を, 食べる)については0.05と分かる。
これが、単語N-gram確率だ。
そして、ようやく章タイトルの
単語N-gramモデルというものの説明に入る。
単語N-gramモデル
単語N-gramモデルとは、
上で説明したような内容を使う確率のモデルだ。
「文中の各単語の出現確率は、
直前のN-1個の単語の組み合わせに依存する」
という考え方に基づいている。
この考え方を、N-1マルコフ過程と呼ぶ。
例えば、Nが1の場合は、直前の単語に依存しない。
そのため、\(k\)個の単語列について、
その順番で出現する確率を求めると…
$$
\begin{eqnarray}
P(w_1, w_2, …, w_k) & = & P(w_1) \times P(w_2) \times … \times P(w_k) \\
& = & \Pi_{i=1}^kP(w_i)
\end{eqnarray}
$$
となる。
それに対し、Nが2の場合は、
直前の1個が関連しているという考え方なので…
$$
\begin{eqnarray}
P(w_1, w_2, …, w_k) & = & P(w_1) \times P(w_2 | w_1) \times P(w_3 | w_2) \times … \times P(w_k | w_{k – 1}) \\
& = & P(w_1) \times \Pi_{i=1}^{k-1}P(w_{i + 1} | w_i)
\end{eqnarray}
$$
このように、一個前の条件を考えた条件付き確率で
求めることができる。
これで、先ほどのラーメンの文を見てみよう。
まず、1-gramモデルの場合は…
$$0.002 \times 0.04 \times 0.0025 = 2.0 \times 10^{-7}$$
となり、2-gramモデルの場合は…
$$0.002 \times 0.5 \times 0.05 = 5.0 \times 10^{-5}$$
と求められる。
このNが大きくなればなるほど精度が高くなるが、
同時にコーパス中に出てくる数も減ってくるので、
信頼性が低くなってしまう。
そのため、通常は2か3で行われることが多い。
これを使って、マルコフモデルというものを考える。
マルコフモデルとは、
解析結果候補となる単語列の中から、
単語N-gram確率が最大となる候補を選ぶ方法のことだ。
さて、前回の記事で、形態素解析を行う際には、
単語コストと接続コストを考えると紹介した。
ちょっと、前回の記事も貼っておこう。
自然言語処理勉強結果「形態素解析の詳細」 | Shino’s Mind Archive
そのうち、単語コストにあたるのが、
この単語N-gram確率となる。
例えば、Nが2の場合は、上で紹介した
以下式が最大となるものが選ばれるのだ。
$$
\begin{eqnarray}
P(w_1, w_2, …, w_k) & = & P(w_1) \times P(w_2 | w_1) \times P(w_3 | w_2) \times … \times P(w_k | w_{k – 1}) \\
& = & P(w_1) \times \Pi_{i=1}^{k-1}P(w_{i + 1} | w_i)
\end{eqnarray}
$$
では、接続コストを考えよう。
これも、単語2-gram確率を使って考えることになる。
二つの単語\(w\), \(w’\)における
接続コスト\(cost(w, w’)\)は、
$$cost(w, w’) = -\log P(w’ | w)$$
と設定する。
こうすることで、
確率が高いほど小さい値を取るようになり、
このコストが最小となるものを選べばいいことになる。
これを使って、
k個の単語列\(w_1, w_2, …, w_k\)の接続コストの和を求めると…
$$
\begin{eqnarray}
\sum_{i = 1}^{k – 1}cost(w_i, w_{i + 1}) & = & cost(w_1, w_2) + cost(w_2, w_3) + … + cost(w_{k-1}, w_k) \\
& = & -\log P(w_2 | w_1) -\log P(w_3 | w_2) – … – \log P(w_k | w_{k-1}) \\
& = & -\log(P_(w_2 | w_1) \times P(w_3 | w_2) \times … \times P(w_k | w_{k-1})) \\
& = & -\log(\Pi_{i=1}^{k-1}P(w_{i+1} | w_i))
\end{eqnarray}
$$
こうなる。
これが、単語N-gramモデルを使ったマルコフモデルの考え方だ。
おわりに
コストを決定する考え方としてはもう一つ、
隠れマルコフモデルというものがある。
こちらは、品詞などの単語の分類から、
どのように遷移するかをモデル化し、
その確率によってコストを決定するもの。
こちらの説明もしたかったのだが…
ちょっと長くなるので、一旦割愛しよう。
まずは一通り最後まで形態素解析しようと思うので、
次回は求めたコストを最小にする経路を探索する
ビタビアルゴリズムを紹介しよう。
ここまでできれば、一旦形態素解析が可能となる。
かなり長くなっているが、ゆっくり理解していこう。
コメント