『入門 自然言語処理』かじり

 今から入門してる時間はない気もするけど、今までの勉強不足がたたって入門することになった。

アニーリング(焼きなまし)法って何…

『入門 自然言語処理』の3.8.2節の終わりに出てくる。温度という上限を更新しながら、ランダムにパラメータを当てはめていって、最適解を探す…みたいなのかな。


 『入門 自然言語処理』はnltkに縛られるのが嫌で放置してたんだけど、pythonの基礎と自然言語処理の基礎が組み合わさって最強に見える。大昔に書いて消したnltkインストール記事を残しておけば良かった。

4.7.1の例4-6のトライ

 4.7.1の例4-6のトライって、フランス語の文字をたどって、英語を引くようになってるのかな。

setまたはlistの要素の探索

 setの要素を探す時と、listの要素を探す時では、setの方がずっと早い。あとdictも早い。自動的にインデックスが作られるかららしい。(4.7.2節から)
 語彙目録みたいな探す対象にする集まりはsetにした方がいいと。listからは探さないほうがい。listをsetに変換するオーバーヘッドを考えても、setの方が速いのかな。
 

4.7.2のtimeitで処理時間計測のところ

 4.7.2のTimerで処理時間を計るところがよく分からなかった。具体的にはTimerとtimeitの挙動。
timeit : http://www.python.jp/doc/release/library/timeit.html
 なんとなく分かった。実行する式を文字列で渡すのか。
 本に載ってる例4-8の下のtimeitのプログラムを実行するとエラーが出る。

Traceback (most recent call last):
  File "setvslist_4_7_2.py", line 9, in <module>
    print Timer(statement, setup_list).timeit(1000)
  File "C:\Python27\lib\timeit.py", line 194, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
NameError: global name 'vocabrandom' is not defined

 global name 'vocabrandom'がない。原因は5行目のここ。

statement = "random.randint(0, %d) in vocab" % vocab_size * 2

 正しくはこう。

statement = "random.randint(0, %d) in vocab" % (vocab_size * 2)


 元の式だと、statementとして与える文字列が * 2されてる形になっていたのだ。

statement = ("random.randint(0, %d) in vocab" % vocab_size) * 2 #こういう形


 timeit()に渡すnumberの意味は、基本の単位(ミリ秒)に対して何分の一した単位を使うかってことなのかな。1000を渡すと単位が秒になる。

直接関係ないけど

 すごいHaskellを真面目にやったおかげで、バグ取りとか関数同士のつながりとかが理解できるようになってきた。