mallet CRF の確率出力

状態の番号がよくわからんかったという話。
参考は http://mallet.cs.umass.edu/fst.php

// 各クラスの import や crfの宣言は済んでいるということにして...
CRFTrainerByLabelLikelihood trainer = new CRFTrainerByLabelLikelihood(crf);
trainer.setGaussianPriorVariance(10.0);
trainer.train(trainingData);

// transducer は何か便利なwrapperらしい
transducer = trainer.getTransducer();

// SumLattice は確率出力用のクラス(?)
// input はデータの系列、本例ではinput末尾のラベルが予測したいとする
// もちろん番号を弄れば好きな位置の予測分布が得られます
SumLattice latt = new SumLatticeDefault(transducer, input);
Sequence result = transducer.transduce(input);

// stnum は状態数(候補となるラベルの数)
int stnum = transducer.numStates();
String names[] = new String[stnum];
double probs[] = new double[stnum];
for (int i = 0; i < stnum; i++) {
    names[i] = transducer.getState(i).getName();
    // 次に予想される周辺確率の出力(resultの末尾で予測される各ラベルの確率)
    // result.size() の位置を知ればinput末尾の予測分布を知ることができる、のが大事
    probs[i] = latt.getGammaProbability(result.size(), transducer.getState(i));
}

// input末尾における各ラベルの予測確率
System.out.println("[Labels]" + Arrays.toString(names));
System.out.println("[Probs]" + Arrays.toString(probs));

// input末尾について予測されるラベル
System.out.println("[Predict]" + result.get(result.size()-1).toString());

めでたしめでたし。

pythonのword2vecがインストールできなかった

でも唸っていたらできたのでメモ
環境はOSX(10.10)でgccは(homebrew gcc47)です

$ pip install word2vec
すると
ValueError: 'word2vec/word2vec_noop.pyx' doesn't match any files
Command "python setup.py egg_info" failed with error code 1 in ...
などと言われる。

よくわからないから手動で入れる:
GitHub - danielfrg/word2vec: Python interface to Google word2vec
を好きなフォルダでgit cloneする

$ python setup.py install
すると
('Compilation command:', 'gcc [...]word2vec.c -o bin/word2vec -lm -pthread -O3 -Wall -march=native -funroll-loops -Wno-unused-result -I /usr/include/malloc')
no such instruction: `vzeroupper'
から始まる「命令ないよ」エラーがたくさん出てくる
エラーメッセージで検索すると
 -march=native
を削ればできるんじゃねみたいなのが出てくる(最適化のオプションらしい)
gcc - Erroring on "no such instruction" while assembling project on Mac OS X Lion - Stack Overflow
ということでsetup.pyの中をいじってみたらうまくできました。

Java, jar, javac

ジャバのジャーをクラスファイルから再錬成して実行したいときの話。
さっぱり知らなかったけど関連のコマンドが複数あって「(全部javaコマンドに適切なオプションつけて投げたらOK、ってわけじゃないのか……)」という気持ちになった。

# class ファイルをつくる (hogehoge.classができる)
$ javac hogehoge.java

# jar ファイルを作る(すでにmanifestファイルがあって、全部突っ込みたいとき)
$ jar cvfm hoge.jar MANIFEST.MF *

# jar ファイルを実行する
$ java -jar hoge.jar

python, json, unicode

なんでうまくいったのかよくわからないけど、unicodeでいろいろ書いてあるjsonファイルを読み込んでまた書き込みたいときの処理。

import json, codecs

## 読み込み
fin = codecs.open(fin_name,'r','utf-8')
jdata = json.load(fin)
fin.close()

## jdata の処理

## 書き込み
fout = codecs.open(fout_name, 'w', 'utf-8')
json.dump(jdata, fout, indent=5, ensure_ascii=False) #indentを設定すると整形される
fout.close()

scikit-learn の RandomForest

肝心な部分だけ

from sklearn.ensemble import RandomForestClassifier

# n_estimatorsはtreeの数, random_stateはseed
model = RandomForestClassifier(n_estimators=10, random_state=17)

# がくしう
model.fit(train_data, train_label)

# 出来上がったtreeたちの深さやnodeの数を知りたい
print [(est.tree_.max_depth, est.tree_.node_count) for est in model.estimators_]

# そもそもどうやって知るか、documentacion見たくなかったらdirを使って見ればよい
#(それが普通? あまり習慣になってなかった)
# 追記: help() というのもある(ページャが呼ばれる)
print dir(model.estimators_[0].tree_)

# documentation見たいなら (もちろんdir()や__doc__は上のオブジェクトにも使える)
print model.estimators_[0].tree_.__doc__

# prediction
pred_label = model.predict(test_data)

# あとは自由に

思考停止pandoc

導入は
OSX - MarkdownからWordやPDF生成ができるようにする (またはPandoc環境の構築方法) (2014/09版) - Qiita
などを参考にしました。tex環境が整っている場合は飛ばしてpandocのコマンドだけ見ればいいのだと思います。

実際に出力してみると、デフォルトでは余白が広かったりするので、

pandoc test.md -o test.pdf -V documentclass=ltjarticle -V header-includes="\usepackage[top=30truemm,bottom=30truemm,left=25truemm,right=25truemm]{geometry}" --latex-engine=lualatex

などとするとちょうどよくなるみたいです。レポートやそこまでかっちりしていないメモをmarkdownで書いていきなりpdfで送りつけたいときなどに便利。
きちんと知りたいなら
Pandoc - Demos
を見るべきです。あとmanを読めって言われた(正しい指摘)。

Stanford Parser について

Home: http://nlp.stanford.edu/software/lex-parser.shtml
FAQ: http://nlp.stanford.edu/software/parser-faq.shtml
Tag and Bracket: http://web.mit.edu/6.863/www/PennTreebankTags.html
More details: https://catalog.ldc.upenn.edu/docs/LDC99T42/
Dependencies: http://universaldependencies.github.io/docs/u/dep/index.html
or http://universaldependencies.github.io/docs/en/dep/index.html (for subtypes of nmod etc.)
タグ、係り受け関係の一覧が書いてあるページはメモっておかないとすぐ忘れるなと思ったので……。