Coursera NLP specialization Course 2
courseraWeek 1
auto correct
元ネタはこれらしい。 Peter NorvigというGoogleの研究部門を率いた人の記事。
単語に分割するのに、re.split(r"\s+", seltence)
を使うか、re.findall(r"\w+", sentence)
を使うか。
結論から言うと、findall, r"\w+"
を使った方が良い。r"\s+"
でsplitすると、”print,”みたいな単語も含まれてしまう。
minimum edit distance
文字列xをyに変更するのに必要な最小手順を求めたい。 ただし、加えられる変更と、その変更のコストは以下の通りとする
- 1文字削除 コスト1
- 1文字挿入 コスト1
- 1文字置換 コスト2
x,yの長さをm,nとしたとき、
D00=0Dij=min(Di−1,j+1,Di,j−1+1,Di−1,j−1+Rij)i=0,1,…,mj=0,1,…,nという漸化式を計算すれば良い。ただし、Rijは、xi==yjなら0、そうでないなら2である。
ここで、Dijは、x[:i]をy[:j]に変更する最小コストを表している。
- D00は空文字を空文字に変更するコストなので0
- x[:i]をy[:j]に変換するには、
- x[:i]の末尾を削除して、x[:i−1]をy[:j]に変更する
- x[:i]をy[:j−1]に変更して、y[j]を最後に挿入する
- x[:i−1]をy[:j−1]に変更して、必要なら1文字入れ替える
のどれかで得られる。
ということ
Week 2
programming assignment
Viterviアルゴリズムを実装する。
用意するもの
- トレーニング用データ
- 文章の各単語にPOSを付与したもの
- 生のコーパスから未知語の処理を行う。生コーパスに1回しか現れなかったものは未知語とみなされる
- 未知語も、単に未知語とラベルを付けるだけではなくて、「動詞っぽい」「形容詞っぽい」などカテゴリに分けてラベルを付ける(語尾で判断する)
- これにより、2回以上現れる単語とラベル付与された未知語の集合が語彙となる
- テストデータ
- 文章の各単語にPOSを付与したもの
- transition matrix: あるタグが与えられた時のタグの確率分布 タグの数 x タグの数の確率行列(要素が非負で行和が1)
- emission matrix: あるタグが与えられた時の単語の確率分布 タグの数 x 語彙サイズの確率行列
確率の計算の際には、ラプラススムージングを行う。 分子にカウント数+αを使い、その分、分母を補正する方法。αは適当に小さな値に決める。
viterbi アルゴリズムの一般的な説明
まず、隠れマルコフモデルを以下で定義する。
- 隠れ状態 si,i=1,…,T,si∈{1,..,S}
- 観測変数 yi,i=1,…,T,yi∈{1,..,Y}
- 初期状態の確率分布 pi,i∈{1,..,S}
- 状態遷移行列 Aij,i,j∈{1,..,Y}
- 観測行列 Bij,i∈{1,..,S},j∈{1,..,Y}
viterbiアルゴリズムは、y1,..,yTが与えられた元でのs1,..,sTを最尤推定するアルゴリズムである。
y1を観測した時、s1の尤度は、
f(s1)=p[s1]B[s1,y1]で与えられる。
次に、y1,y2を観測した時のs1,s2の尤度を考えると
f(s1,s2)=p[s1]B[s1,y1]A[s1,s2]B[s2,y2]で与えられることが分かる。以下、同様に考えればy1,..,yTを観測した時の s1,..,sTの尤度は
f(s1,s2,..,sT)=p[s1]B[s1,y1]A[s1,s2]B[s2,y2]..A[sT−1,sT]B[sT,yT]これが最大化したい値である。ここで、上の式において次の2つがポイントになる
- 最後のA[sT−1,sT]B[sT,yT]以外はsT,yTに依存しない
- そこに出てくるA[sT−1,sT]B[sT,yT]で、他に出てくる変数はsT−1だけ
したがって、sT−1=1,..,Sの場合の最大尤度だけを覚えておけば、そこから全体の最大尤度が計算できる。
以上を念頭に置いてアルゴリズムを設計すれば、自然にviterbiアルゴリズムになるはず。
week 3
nltk
natural language tool kit.
開始単語と終了単語
n-gramモデルを作る時に、最初のn-1単語は、十分な文脈を持たない。そこで、n-1個の特別な開始単語を文章に付ける。
任意の長さの文章を生成したり確率を評価するためには、文がどこで終わるかを識別する必要がある。そのために、1個の特別な終了単語を文末に付ける。
perplexity
文章Wに対して、Pr(W)−1mをperplexity
と呼ぶ。ただし、mは文章の長さである。
対数を取ると
となる。言葉で意味を言うと、一単語あたりの平均情報量、ということになる。この値が低いほど良いモデルとみなされる。
モデルの評価は、テスト用コーパスの全文章を連結した文章のperplexityを見る。 目安としてperplexityが20〜60くらいなら、良いモデルと思えるらしい。log perplexistyでいうと、4.3 ~ 5.9くらい perplexityが20ということは、直前までを知ると次の単語の候補が大体20個くらい、ということに対応する。 まぁ大体そんなもんか、という気持ちになる。
backoff
n-gramモデルにおいて、特定のn-tupleがコーパスの中になかった場合に(n-1)-gramの確率を使う場合がある。 これをbackoffと呼ぶ。backoffは確率分布を歪ませるので調整が必要。コーパスが大きい場合には、あまり深く考えずに 単純に定数を掛けるだけで済ませる場合がある。これをstupid backoffと呼ぶ。定数は0.4が良いらしい(magic number)。