This repository has been archived by the owner on Feb 22, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
情報共有
s10018 edited this page Feb 6, 2014
·
34 revisions
CRF++ 0.58を使ってPOSタギングをした結果です.
I-HMM特徴なし
I-HMM $ java -classpath target/scala-2.10/I-HMM.jar scala.tools.MakeScore test100_nohmm_result.txt
Accuracy: 0.8983756768013328
I-HMM特徴あり
I-HMM $ java -classpath target/scala-2.10/I-HMM.jar scala.tools.MakeScore ../test100_hmm_result.txt
Accuracy: 0.9354435651811746
某10サーバの/work/mai-om/pos_test
に以下のデータをおいています.
- 結果データ
- test100_nohmm_result.txt
- test100_hmm_result.txt
- テンプレートデータ
- template_nohmm
- template_hmm
- モデルデータ
- model_nohmm
- model_hmm
- 特徴データ (CRF++に使う訓練 or テストデータ)
- train5000_hmm_features.txt
- train5000_nohmm_features.txt
- test100_nohmm_features.txt
- test100_hmm_features.txt
特にオプションは指定せず
crf_learn テンプレート 特徴データ(train) モデルデータ
crf_test -m モデルデータ 特徴データ(test)
としています.
実行例
sbt "run train -train train.txt -layer 3 -state 8 -c 3 -dump model.txt"
か
java -jar target/scala-2.10/I-HMM.jar train -train train.txt -layer 3 -state 8 -c 3 -dump model.txt
- -train 訓練ファイル(一行に1文、トークンはスペースで区切られている)
- -layer レイヤーの数
- -state 状態数
- -c 出現回数がここで指定された数、以下の語は未知語扱いになる
- -dump 結果の出力先ファイル
sbt "run decode test.txt -p model.txt"
か
java -jar target/scala-2.10/I-HMM.jar decode test.txt model.txt
- test.txt : デコードしたいファイル
- model.txt : trainの出力ファイル
CoNLLフォーマットであるfile
に対して
java -classpath target/scala-2.10/I-HMM.jar scala.tools.makeFeatures file
で出力されるがいろいろ出力がおかしいことになっているので
java -classpath target/scala-2.10/I-HMM.jar scala.tools.makeFeatures file > feature.txt
sed -e 's/^ $//g' feature.txt | head -n $(expr $(cat feature.txt| wc -l) - 2)
で(2/5現在)
2/5
trainデータはwsj_00〜wsj02の先頭から5000文,testデータはwsj_23の先頭から100文使用 データの再現の仕方は以下のとおり(なにかあったときの記録用)
cat ../pos_test/wsj_02.conll | head -n 27382 > tmp
cat ../pos_test/wsj_00.conll ../pos_test/wsj_01.conll tmp > ../pos_test/train5000_origin.txt
cat ../pos_test/wsj_23.conll | head -n 2401 > ../pos_test/test100_origin.txt
https://code.google.com/p/java-statistical-analysis-tool/ をベース
使い方は
val n = 4 # サイズ
val alpha = 0.4 # アルファの値
val v = DirRand.random(n, alpha) # => List[Double]
"##UNKNOWN##"(ダブルクオーテーションは含まない)
T が 遷移,Eが生成,Iが初期値を表す
2列目はIMMの数字
レイヤーの数 状態数
を一行目に書く
2行目には語彙リスト(スペース区切り?)で書く
3 2
me you and I .
T 0 0 0 0.8
T 0 0 1 0.2
T 0 1 0 0.4
T 0 1 1 0.6
T 1 0 0 0.5
T 1 0 1 0.5
T 1 1 0 0.2
T 1 1 1 0.8
T 2 0 0 0.1
T 2 0 1 0.9
T 2 1 0 0.7
T 2 1 1 0.3
E 0 0 I 0.3
E 0 0 and 0.2
E 0 0 me 0.2
E 0 0 you 0.1
E 0 0 . 0.2
E 0 1 I 0.1
E 0 1 and 0.2
E 0 1 me 0.3
E 0 1 you 0.1
E 0 1 . 0.3
E 1 0 I 0.1
E 1 0 and 0.1
E 1 0 me 0.2
E 1 0 you 0.3
E 1 0 . 0.3
E 1 1 I 0.1
E 1 1 and 0.7
E 1 1 me 0.1
E 1 1 you 0.1
E 1 1 . 0.1
E 2 0 I 0.2
E 2 0 and 0.0
E 2 0 me 0.2
E 2 0 you 0.1
E 2 0 . 0.5
E 2 1 I 0.4
E 2 1 and 0.1
E 2 1 me 0.2
E 2 1 you 0.1
E 2 1 . 0.2
I 0 0 0.3
I 0 1 0.7
I 1 0 0.5
I 1 1 0.5
I 2 0 0.6
I 2 1 0.4
/work/mai-om/pos_test
にあるディレクトリのデータを使いたいと思います.(別になんでもいいですが
CoNLL形式から普通の1行1文のトークナイズ済みのデータにするには
sbt "run conll テキストファイル1 テキストファイル2 ..."
でできます
http://d.hatena.ne.jp/hnw/20110528 を参考にしたい
P(k)(k=1,..,K): 状態の初期確率
P(k1|k2)(k1,k2=1,..,K): 状態の遷移確率
P(w|k)(k=1,..,K, w in V): tokenの出力確率
の3種類
試行錯誤しているので実行できなければ聞くこと
sbt update # fetch後とかに一回ぐらい?
sbt compile # ソースコード変えたら1回
sbt "run [train|decode] inputfile"
- build.sbt : いろいろプロジェクトの設定
- project/ : プラグインの設定を適当にいれてる
- lib/ : 必要なjarファイルを入れている
- src/main/scala
- ihmm : I-HMMに関するScalaプログラムをいれる場所
- tools : なくてもいいけどあったほうがいいScalaプログラムをいれる場所
- src/test : テストコードを入れる場所(
sbt test
で実行するとここにいれたテストが実行される)
- Breeze (breeze)
CRF package- JSAT
- scopt (オプションパーサー)
- sbt-assembly : jarファイル作ってくれる
- sbt-start-script : 複数のメイン関数を引数で切り替えてくれる (
sbt run
は引数で切り替えてくれない?らしい)