December 31, 2009

PythonでLDAを実装してみる

Latent Dirichlet Allocationはテキストのような不連続データのための生成的確率モデル。入力はドキュメント。出力はドキュメントを特徴づける何か(tf-idfみたいなもん)。

基本的なアイディアは、あるドキュメントは潜在的ないくつかのトピックが混合していて、それぞれのトピックは語の分布で特徴づけられている、ということ。

論文[1]ではαとβというパラメータを用いてドキュメントが以下のように生成されると仮定している。
  1. ドキュメントのトピックの分布θがディリクレ分布Dir(α)に基づいて選ばれる。
  2. ドキュメントの語数N個になるまで以下を繰り返す。
    1. トピックznが多項分布Mult(θ)に基づいて選ばれる。
    2. 単語wnが確率p(wn|zn,β)で選ばれる。
ただし、トピックzの数をk個、単語wの種類をV個とすると、パラメータαはk次元のベクトル、βはk x V次元の行列でβij=p(wj|zi)。


Fig.1 LDAのグラフィカルモデル。Mはコーパス内のドキュメントの数。Nは各ドキュメントの語の数。αによって分布θが決まり、分布θに従ってzが選ばれ、zとβに従ってwが選ばれる。


ここで、ドキュメントにおけるαとβの値がわかれば、トピックがどんな割合であって(α)、そのトピックに関する語がどんな割合で存在するか(β)がわかる。つまり、ドキュメントが上のようなプロセスで生成されているとしてαとβの値はいくつかということを推定するのがLDAの目的。

αとβを推定する方法は変分ベイズEMアルゴリズムを利用するものやGibbs Samplerを利用するものなどが提案されています。また、いくつもの派生的なモデルも提案されています。

本稿では、論文[1]と
lda, a Latent Dirichlet Allocation package
http://chasen.org/~daiti-m/dist/lda/
のmatlabの方をパクっ参考にして、変分ベイズEMをPythonで実装してみました。

実行方法

要Numpy、SciPy。
python lda.py [-Nclasses] [-Iemmax] [-Ddemmax] [-Eepsilon] 入力ファイル名 出力ファイル名
classesはクラスの数。emmaxはEMの最大反復回数。demmaxは一つのドキュメントのEM最大反復回数。epsilonは収束条件。
たとえば、トピックの数が10個、「train」が入力で「model」に出力する場合は、
python lda.py -N10 train model

入力

テキストファイル。
1:1 2:4 5:2
1:2 3:3 5:1 6:1 7:1
2:4 5:1 7:1
ってな具合のフォーマット。行がドキュメント、<語のID>:<カウント>。SVMのライブラリでつかうフォーマットと似ている。上記の参考にしたサイトの上から1/3あたりのDownloadからcかmatlabバージョンをダウンロードして解凍するとtrainというファイルがありそのまま使える。

出力

<出力ファイル名>.alpha
<出力ファイル名>.beta
の二つ。alphaは長さがトピック数のリスト。betaはトピックの数×語の数の二次元リストになっている。はず。

References

[1] Blei et al., Latent Dirichlet Allocation, The Journal of Machine Learning Research, 2003.

ソース

lda.py


雑感

すごく…遅いです…

December 28, 2009

Pythonで順列や組み合わせを手に入れる

from itertools import ...

IteratorArguments
product()p, q, ... [repeat=1]
permutations()p[, r]
combinations()p, r

product('ABCD', repeat=2)AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
permutations('ABCD', 2)AB AC AD BA BC BD CA CB CD DA DB DC
combinations('ABCD', 2)AB AC AD BC BD CD

10.7. itertools — Functions creating iterators for efficient looping — Python v2.6.4 documentation

December 26, 2009

Chironで実行可能なSilverlightアプリをつくるときのコマンド

構成が
app/app.py
app/app.xaml
index.html
で、index.html内で
<param name="source" value="app.xap"/>
としたら
Chiron /d:app /z:app.xap

Google App Engineでテンプレートを使おうとしたらUnicodeDecodeError

Google App Engineでテンプレートを使おうとしたらエラーが出る。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 116: ordinal not in range(128)

どうやらテンプレートで日本語を使おうとしたときのunicodeのエンコード・デコードのエラーっぽい。

…
sentence = 'すもももももももものうち。'
template_values = {'sentence':sentence}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path,template_values))
…

これのtemplate.render()に

.decode('utf-8')

をつけて

…
sentence = 'すもももももももものうち。'
template_values = {'sentence':sentence}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path,template_values).decode('utf-8'))
…

となおしたら、大丈夫だった。テンプレートはutf-8で。

December 25, 2009

MacでLaTeXはDrag & Drop pTeXがいい

Snow Leopardになっても小川版pTeXがすごくいい。

Drag & Drop pTeX - JIS X0212 for pTeX
http://www2.kumagaku.ac.jp/teacher/herogw/

ghostscriptのインストールも忘れずに!

  1. 古いものを削除。アンインストールツールが付いている。


  2. pTeX.appをアプリケーションフォルダにドラッグアンドドロップ。


  3. TeXShopのPath設定で(pdf)TeXを

    /Applications/pTeX.app/teTeX/bin

    に。TeX + dvips + distllerの設定も

    Xtexshop

    に。dvipdfmxでフォントを埋め込む。なお埋め込まない場合はXtexshop-ryu。文字コードの認識しない場合は

    Shift_JIS/ヒラギノフォント埋め込みの場合は“dotexshop”、同/フォント非埋め込みの場合は“dotexshop-ryu”
    EUC/ヒラギノフォント埋め込みの場合は“dotexshop-euc”、同/フォント非埋め込みの場合は“dotexshop-euc-ryu”
    UTF-8/ヒラギノフォント埋め込みの場合は“dotexshop-utf8”、同/フォント非埋め込みの場合は“dotexshop-utf8-ryu”


  4. ついでに文字コードもUTF-8に。


  5. あとは Typesetting の Default Script を Tex + DVI にして、Misc の BibTeX を jbibtexにする。