Week 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

文字列xyに変更するのに必要な最小手順を求めたい。 ただし、加えられる変更と、その変更のコストは以下の通りとする

  • 1文字削除 コスト1
  • 1文字挿入 コスト1
  • 1文字置換 コスト2

x,yの長さをm,nとしたとき、

D00=0Dij=min(Di1,j+1,Di,j1+1,Di1,j1+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[:i1]y[:j]に変更する
    • x[:i]y[:j1]に変更して、y[j]を最後に挿入する
    • x[:i1]y[:j1]に変更して、必要なら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[sT1,sT]B[sT,yT]

これが最大化したい値である。ここで、上の式において次の2つがポイントになる

  • 最後のA[sT1,sT]B[sT,yT]以外はsT,yTに依存しない
  • そこに出てくるA[sT1,sT]B[sT,yT]で、他に出てくる変数はsT1だけ

したがって、sT1=1,..,Sの場合の最大尤度だけを覚えておけば、そこから全体の最大尤度が計算できる。

以上を念頭に置いてアルゴリズムを設計すれば、自然にviterbiアルゴリズムになるはず。

week 3

nltk

natural language tool kit.

開始単語と終了単語

n-gramモデルを作る時に、最初のn-1単語は、十分な文脈を持たない。そこで、n-1個の特別な開始単語を文章に付ける。

任意の長さの文章を生成したり確率を評価するためには、文がどこで終わるかを識別する必要がある。そのために、1個の特別な終了単語を文末に付ける。

perplexity

文章Wに対して、Pr(W)1mperplexityと呼ぶ。ただし、mは文章の長さである。 対数を取ると

1mlog2Pr(W)

となる。言葉で意味を言うと、一単語あたりの平均情報量、ということになる。この値が低いほど良いモデルとみなされる。

モデルの評価は、テスト用コーパスの全文章を連結した文章の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)。