Tuesday 22 June 2010

如何训练一个中文的Berkeley Parser

Berkeley Parser - 短语结构的句法分析器

网站:http://code.google.com/p/berkeleyparser/
版本: V1.1

任务目的:中文树库(Penn Chinese Treebank 4.0/5.1)上训练模型。并且不想更改任何Parser内部代码。

=Section 1 数据处理=
可采用如下步骤:
1. 数据文件命名
问题:程序里面是按照英文WSJ树库来的。导致加载树失败。
方案:命名更改为chtb_xxx.fid ==>wsj_xxx.mrg。改完名的文件放在一个目录下(比如NewCTBData)。

2. 数据内容
问题:中文多了一些 SGML的格式。导致加载树失败。
方案:去掉这些标记。

3. 少数数据格式问题
问题1:包含"(IP"这样开头的句子。导致split失败。
方案:在这类句子前后加入 "("和")"

问题2:文件1031.fid
ID=12409
----------------------------------------
..........
(NP (NN 政府
)))
..........
----------------------------------------
方案:应该修改为 “(NP (NN 政府)))”

问题3:文件1117.fid
ID=16046
----------------------------------------
..........
(NP-PN (NR Ken Madsen)))
..........
----------------------------------------
方案:可以改成 “(NR Ken_Madsen)”.

4. 数据集的分割
问题:程序里面按照文件ID使用固定分割。Train: 1-25, 26-270, 400-1151;Dev: 301-325;Test: 271-300
方案: 根据自己需要可以把对应的文件进行替换,但是记住每个分段都至少要有一个文件。比如1-25必须至少有一个文件,26-270也至少有一个文件。

5.残留问题
--2010.6.25
在5.1上得到的model,在分析测试句子的时候会出现大量零输出的现象。
可能方案:去掉文件1022.fid-1029.fid,这个是http://ldd2000.blogspot.com/2008/11/berkeley-parser.html提供的方法,理由不详。应该去监测各个句子,到底是哪个句子出错了。

--2010.6.25
如果使用1-270+400-999作为train set, 271-300作为test set。在分析第339句的时候会出现零输出。
目前无解。WS的把这个句子去掉。:-)



经过如上处理,可以训练和测试Model

=Section 2 命令=
使用命令:
Training $java -cp berkeleyParser.jar edu.berkeley.nlp.PCFGLA.GrammarTrainer -path NewCTBData -out chinese.ctb4.gr -treebank CHINESE
Testing $java -cp berkeleyParser.jar edu.berkeley.nlp.PCFGLA.GrammarTester -path -in -treebank CHINESE -section final -maxL 1000

=Section 3 实验结果=

==3.1 使用系统提供的训练好的Model
据Paper: Slav Petrov and Dan Klein, Improved inference for unlexicalized parsing, NAACL2007
-数据切分:
Train=1-270+400-1151; Dev=301-325; Test=271-300
-报告的结果:
ALL: LP/LR=84.8/81.9; <=40: LP/LR=86.9/85.7

===3.1.1 结果
-command: java -jar berkeleyParser.jar -gr TrainedGrammars/chn_sm5.gr -chinese < mysegmented_sents_list
-Output
ALL : LP/LR/F1=81.02/80.81/80.91
<=40: LP/LR/F1=82.33/83.64/82.98

===3.1.2 结果
-command: java -cp berkeleyParser.jar edu.berkeley.nlp.PCFGLA.GrammarTester -path ~/pcfgParsing/dataCN/train3/ -in TrainedGrammars/chn_sm5.gr -treebank CHINESE -section final -maxL 1000
-Output
ALL : LP/LR/F1= 84.30/80.73/82.48
<=40: LP/LR/F1= 86.68/83.50/85.06

问题:用同一个trained model得到2个差距为2%的结果,为啥?并且较好的结果和报告的结果有大约1%的差距,为啥?设置错了?

==3.2 重新训练Model (去掉1022.fid-1029.fid)
-command: java -Xmx15000m -cp berkeleyParser.jar edu.berkeley.nlp.PCFGLA.GrammarTrainer -path $1 -out $2.Default -treebank CHINESE
-command: java -Xmx15000m -cp berkeleyParser.jar edu.berkeley.nlp.PCFGLA.GrammarTrainer -mergeMinIt 6 -mergeMaxIt 6 -splitMinIt 6 -splitMaxIt 6 -path $1 -out $2.EM6 -treebank CHINESE
-Output
====Default (ALL)=
Bracketing Recall = 81.09
Bracketing Precision = 83.92
Bracketing FMeasure = 82.48
Complete match = 27.75
====EM6(ALL)=
Bracketing Recall = 78.18
Bracketing Precision = 82.15
Bracketing FMeasure = 80.12
Complete match = 28.61
结果比文章报告的结果还是要稍微差一些。

=后记=
注:这里提供的方案是偷懒式方案。
再:解决过程中得到xiaozhu的热情帮助。

开始

一而再,再而三的处理同一个问题。怒了。只好记下来。