Skip to content
This repository has been archived by the owner on Feb 22, 2024. It is now read-only.

情報共有

s10018 edited this page Feb 6, 2014 · 34 revisions

POS Taggingの結果 (2/6)

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)

としています.

trainの実行

実行例

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 結果の出力先ファイル

decodeの実行

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##"(ダブルクオーテーションは含まない)

trainの出力例

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 ..."

でできます

pull request 参考

http://d.hatena.ne.jp/hnw/20110528 を参考にしたい

HMMで学習するパラメータ

P(k)(k=1,..,K): 状態の初期確率
P(k1|k2)(k1,k2=1,..,K): 状態の遷移確率
P(w|k)(k=1,..,K, w in V): tokenの出力確率
の3種類

実行のさせかた (1/27)

試行錯誤しているので実行できなければ聞くこと

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は引数で切り替えてくれない?らしい)