ツイート分類器 2
提供:ANPI_NLP
目次 |
評価セット
3/17 18:30頃のファイル(≒9800事例)を8:1:1に分割
(@Yucchiiro 2011/03/17 21:50)
元ファイル:データ用サイトの分類器2のTweet03.17.tsv.gz
train: 同じフォルダのTrain.tsv.gz
dev: 同じフォルダのDev.tsv.gz
test:同じフォルダのTest.tsv.gz
アプローチ1:I,L,M,P,R vs. O,S,Uで二値分類→I,L,M,P,Rを多値分類
(@mmiwa, @Yucchiiro 2011/03/17 21:50)
目的
最初の処理のアウトプットをNERの学習に使えば精度向上が期待できるので、 NERの素性無しで出来るところまでやる。 (@mmiwa, @Yucchiiro 2011/03/17 21:50)
ソフトウェア(二値分類部分)
学習器は岡崎さんのClassias http://www.chokkan.org/software/classias/
素性抽出スクリプト(ruby):ファイル:AnpiFeatures-binary-2.rb.gz
コマンド:ruby -Ku ./anpiFeatures-binar-y2.rb < tweet.tsv > tweets-binary.feat
学習のコマンド: classias-train -tb -a lbfgs.logistic -p c2=10 -m model-binary-c10.model tweets-binary.feat.gz > log-model-binary-c10.txt
タグ付けのコマンド:zcat test-binary.feat.gz | classias-tag -m model-binary-c10.model -w > result-test-binary.txt (@Yucchiiro 2011/03/17 22:17)
開発方法(訓練と評価の方法)
訓練:
上記素性抽出スクリプトでtrain.tsv, dev.tsv, test.tsvからtrain.feature, dev.feature, test.featureを作った後、gzipで固め、
次のコマンドで、訓練セットで学習し、開発セットで評価します。学習アルゴリズムと正則化パラメタは自由に決めてください。
classias-train -tb -a lbfgs.logistic -p c2=10 -m model_file_name.model -e2 train.feature.gz dev.feature.gz > log-model_name.txt
評価:
上記タグ付けのコマンドにならってtest.feature.gzからタグ付け結果result.test.feature.txtを得た後、
次の評価用スクリプトを走らせます。
評価用スクリプト:ファイル:CheckAccuracy.rb.gz
zcat test.feature.gz | ruby checkAccuracy.rb result.test.feature.txt
眠いので、バグがないことを祈ります。。誰か簡単なテストを。 (@Yucchiiro 2011/03/17 23:47)
状況
二値分類のみモデル1
素性:3-gramのみ 素性抽出スクリプト(ruby):ファイル:AnpiFeatures-binary-2.rb.gz モデルファイル:ファイル:Model-binary-c10.model.gz
精度:acc. 93.18%, (I,L,M,P,Rグループの)F1値 80.46%, Precision 90.20%, Recall: 72.63%
コメント:小規模学習ファイルで95%程度出たのでうまくいくかと思ったが、Recallが低いのでしきい値を下げてRecallを上げたほうがよいか。 (@mmiwa, @Yucchiiro 2011/03/17 21:50)
二値分類のみモデル2
素性:1-gram, 2-gram, 3-gram (ただし、重複は発火させず) 素性抽出スクリプト(ruby):ファイル:AnpiFeatures-binary3.rb.gz モデルファイル:ファイル:Model-binary3-c10.model.gz
精度:acc. 94.09%, (I,L,M,P,Rグループの)F1値 83.89%, Precision 92.64%, Recall: 76.65%
コメント:素性の作り方について、@Yucchiiroが解釈を間違えていました。F1, Precision, Recallともに向上。 (@mmiwa, @Yucchiiro 2011/03/18 14:00)
アプローチ2:直接、多値分類
目的
NERがある程度できたら、こっちを直接やるほうが精度高いはず。 (@Yucchiiro 2011/03/17 21:50)
ソフトウェア
アプローチ1と同じソフトウェア、スクリプトをベースに拡張。
学習器は岡崎さんのClassias http://www.chokkan.org/software/classias/
素性抽出スクリプト(ruby):ファイル:AnpiFeatures.rb.gz
コマンド:ruby -Ku ./anpiFeatures.rb < tweet.tsv > tweets.feat
学習のコマンド: classias-train -tb -a lbfgs.logistic -p c2=10 -m model-c10.model tweets-binary.feat.gz > log-model-c10.txt
タグ付けのコマンド:zcat test.feat.gz | classias-tag -m model-c10.model -w > result-test.txt
開発方法(訓練と評価の方法)
訓練:
上記素性抽出スクリプトでtrain.tsv, dev.tsv, test.tsvからtrain.feature, dev.feature, test.featureを作った後、gzipで固め、
次のコマンドで、訓練セットで学習し、開発セットで評価します。学習アルゴリズムと正則化パラメタは自由に決めてください。
classias-train -tm -a lbfgs.logistic -p c2=10 -m model_file_name.model -e2 train.feature.gz dev.feature.gz > log-model_name.txt
評価:
上記タグ付けのコマンドにならってtest.feature.gzからタグ付け結果result.test.feature.txtを得た後、
次の評価用スクリプトを走らせます。
評価用スクリプト:ファイル:Accuracy-multi.rb.gz
zcat test.feature.gz | ruby accuracy-multi.rb result.test.feature.txt
(@Yucchiiro 2011/03/18 9:50)
状況
stub 実験中(回す前。素性抽出スクリプトは上のやつでコメントアウトになっているところを外せば使えます。)
現在用いている素性:1-gram, 2-gram, 3-gram, 各NEタイプの出現数, NE各タイプの組み合わせ出現(バイナリ値), ハッシュタグ(@Yucchiiro 2011/03/17 23:00)
アプローチ3:多値分類、マルチラベル版
(@mmiwa, @Yucchiiro 2011/03/20 11:40)
同時に複数ラベルを出力するモデル
ソフトウェア
liblinearをマルチラベル出力用に改良したプログラム:ファイル:Liblinear-1.7-multilabel.zip (@mmiwa, 2011/03/19 11:40)
素性抽出スクリプト(ruby):ファイル:AnpiFeatures-multilabel.rb.gz, ファイル:Classias2liblinear-multilabel.rb.gz (@Yucchiiro, 2011/03/19 11:40)
コマンド:
入力するtweet.tsvはKyTeaでNERをタグ付けしておいてください。
rm features.map ruby -Ku anpiFeatures-multi.rb < tweet.tsv | ruby -Ku classias2liblinear-multilabel.rb features.map > tweets.feat&
学習のコマンド:
java -cp liblinear-1.7-multilabel.jar liblinear.Train -c 0.001 -B 1 train.feat > log-train-c0.001.txt
タグ付けのコマンド:
tはラベル出力のしきい値で、値を上げればprecisionを、下げればrecallを重視します。
java -cp liblinear-1.7-multilabel.jar liblinear.Predict -t 0.45 tweets.feat train.feat.model tweets-c0.001-t0.45.out > log-tweets-c0.001-t0.45.txt
(@Yucchiiro 2011/03/20 11:47)
モデル
モデル1
素性:
- 1gram 2gram 3gram (重複カウントせず)、
- person location organizationのそれぞれの数、
- personとlocationの同時出現があるかないか、
- ハッシュタグ#anpiが出現しているかどうか
- #anpi以外のハッシュタグがいくつ出ているか
- personの出現+3gramの組み合わせ素性
- 文字列"http", "https"がそれぞれ存在するか
- "http", "https"とNE出現の組み合わせ
素性抽出スクリプト(ruby):ファイル:AnpiFeatures-multilabel.rb.gz
モデルファイル:
train.tsvでのモデル=ファイル:Train18.feat.0.001.model.gz , 素性IDマップファイル:ファイル:Features18.map.gz
3/19時点のコーパス全体で学習したモデル= http://www-al.nii.ac.jp/~y-matsu/tweets18-0319.feat.model.gz, 素性IDマップファイル:ファイル:Features18-0319.map.gz
(@Yucchiiro 2011/03/20 13:40)
精度:
(t=0.45, test.tsvでの値):
label:O Score [tp=707, tn=170, fp=93, fn=12, precision=0.88375, recall=0.9833101529902643, fscore=0.9308755760368663] label:R Score [tp=10, tn=947, fp=3, fn=22, precision=0.7692307692307693, recall=0.3125, fscore=0.4444444444444445] label:U Score [tp=0, tn=960, fp=0, fn=22, precision=0.0, recall=0.0, fscore=0.0] label:S Score [tp=29, tn=920, fp=11, fn=22, precision=0.725, recall=0.5686274509803921, fscore=0.6373626373626374] label:L Score [tp=5, tn=932, fp=5, fn=40, precision=0.5, recall=0.1111111111111111, fscore=0.1818181818181818] label:M Score [tp=125, tn=836, fp=12, fn=9, precision=0.9124087591240876, recall=0.9328358208955224, fscore=0.922509225092251] label:H Score [tp=3, tn=976, fp=0, fn=3, precision=1.0, recall=0.5, fscore=0.6666666666666666] label:P Score [tp=0, tn=978, fp=0, fn=4, precision=0.0, recall=0.0, fscore=0.0] label:I Score [tp=7, tn=963, fp=7, fn=5, precision=0.5, recall=0.5833333333333334, fscore=0.5384615384615384] Accuracy: 0.9694501018329938
t=0.45, 3/20時点のコーパス(≒19000事例)を利用した値:
label:L Score [tp=24, tn=1984, fp=14, fn=65, precision=0.631578947368421, recall=0.2696629213483146, fscore=0.3779527559055118] label:P Score [tp=0, tn=2082, fp=0, fn=5, precision=0.0, recall=0.0, fscore=0.0] label:R Score [tp=9, tn=2039, fp=5, fn=34, precision=0.6428571428571429, recall=0.20930232558139536, fscore=0.31578947368421056] label:O Score [tp=1456, tn=398, fp=210, fn=23, precision=0.8739495798319328, recall=0.9844489519945909, fscore=0.9259141494435612] label:S Score [tp=86, tn=1913, fp=30, fn=58, precision=0.7413793103448276, recall=0.5972222222222222, fscore=0.6615384615384615] label:U Score [tp=3, tn=1999, fp=5, fn=80, precision=0.375, recall=0.03614457831325301, fscore=0.06593406593406592] label:null Score [tp=0, tn=2087, fp=0, fn=0, precision=0.0, recall=0.0, fscore=0.0] label:M Score [tp=250, tn=1782, fp=32, fn=23, precision=0.8865248226950354, recall=0.9157509157509157, fscore=0.9009009009009009] label:H Score [tp=9, tn=2067, fp=2, fn=9, precision=0.8181818181818182, recall=0.5, fscore=0.6206896551724137] label:I Score [tp=20, tn=2044, fp=10, fn=13, precision=0.6666666666666666, recall=0.6060606060606061, fscore=0.6349206349206349] label:N Score [tp=0, tn=2087, fp=0, fn=0, precision=0.0, recall=0.0, fscore=0.0] Accuracy: 0.9730801062856645
コメント:Recall重視ならt=0.4で実行するとよい。 (@Yucchiiro 2011/03/20 11:50)