实验maxent分词

使用张乐博士maxent工具包,应用赵海博士的6 tags + 3字窗口法,对bakeoff2005公开的语料进行实验。用python写了个简单的转换脚本,将CRF++的训练语料转换为maxent支持的格式。训练模型的时间比CRF要少了许多。对MSR的语料和测试集,得到预测的准确度为96.4357%。与Yandong使用4 tags + 3字窗口的结果接近(96.2225%)。400多万个样本,其中只出现一次、被cut掉的event居然有240多万个。不知道是不是我使用的输入格式有问题?


S U00-_B U01-“ U02-人 U03-_B/“ U04-“/人 U05-_B/人 E
B U00-“ U01-人 U02-们 U03-“/人 U04-人/们 U05-“/们 S
E U00-人 U01-们 U02-常 U03-人/们 U04-们/常 U05-人/常 B
S U00-们 U01-常 U02-说 U03-们/常 U04-常/说 U05-们/说 E
S U00-常 U01-说 U02-生 U03-常/说 U04-说/生 U05-常/生 S
B U00-说 U01-生 U02-活 U03-说/生 U04-生/活 U05-说/活 S
E U00-生 U01-活 U02-是 U03-生/活 U04-活/是 U05-生/是 B
S U00-活 U01-是 U02-一 U03-活/是 U04-是/一 U05-活/一 E
S U00-是 U01-一 U02-部 U03-是/一 U04-一/部 U05-是/部 S
S U00-一 U01-部 U02-教 U03-一/部 U04-部/教 U05-一/教 S
B U00-部 U01-教 U02-科 U03-部/教 U04-教/科 U05-部/科 S
B2 U00-教 U01-科 U02-书 U03-教/科 U04-科/书 U05-教/书 B
E U00-科 U01-书 U02-, U03-科/书 U04-书/, U05-科/,B2
... ...

24 thoughts on “实验maxent分词

  1. 再重头看MaxEnt和MEMM时,发现原先训练的输入数据中,没有考虑状态的转换,也就是单纯估计P(S_i|O_i)的概率。如果将前一个事件的状态(或label)也加入到特征(features)中,是否可以认为得到的模型就是MEMM了呢,即估计的概率是P(S_i|S_{i-1},O_i)?另外加入状态转换的约束之后,准确率比之前有提高。

  2. 再仔细重读赵海博士的blog,上面提到的应该是加入状态转移约束的MaxEnt模型。而MEMM和MaxEnt+状态转移约束的区别是,“前者只是根据最大化联合概率原则一步导出解码序列,结果可能只是碰巧合法而已,后者是在严格的合法状态转移规则限制下完成解码。”P(S_i|S_{i-1},O_i) = P(S_i|S_{i-1}) * P(S_i|O_i),可以通过MaxEnt训练得到P(S_i|O_i),P(S_i|S_{i-1})可以另行确定(可以用ML估计+平滑得到)。

  3. 晕了晕了,从许多论文和文章看(例如McCallum00),似乎把前一个事件的状态(或label)加入到特征中进行ME训练,得到的就是MEMM模型了。但也有论文是把P(S_i|O_i)和P(S_i|S_{i-1})单独估计的。

  4. 再仔细看McCallumn的论文,发现这两者应该都是MEMM,其中分开估计P(S_i|O_i)和P(S_i|S_{i-1})的方式,在训练样本比较稀疏的情况下更为适用。

  5. 忘了提一句,P(S_i|S_{i-1},O_i) = P(S_i|S_{i-1}) * P(S_i|O_i)前提是,S_{i-1}和O_i概率无关,这样才能拆成两部分来计算。

  6. 在和同事讨论最大熵时,介绍了以前一个用最大熵分词的实验,突然对为什么每个事件需要U03~U05这三项产生了疑惑,当时也没有细想。
    再重新整理了一下头绪,在张乐的工具包中,事件并非是样本,样本应该是那个三字窗口。例如“人们常”,这个样本产生了7个feature,分别是(U00-人, E), (U01-们, E), (U02-常, E), (U03-人/们, E), (U04-们/常, E),(U05-人/常),(B, E),这些feature构成了一个事件。(U00-人, E)描述的是,一个三字窗口,起始字符为“人”时,中间的字符被标记为“E”的情况;(U05-人/常, E)描述的是,三字窗口的左右分别是“人”和“窗”时,中间字符被标记为“E”的情况;(B, E)描述的是,三字窗口的起始字符被标记为B时,中间字符被标记为E的情况。
    这样,对三字窗口的描述才是比较完备的。

  7. 如此看来,我们原先训练的应该是加入状态转移的ME,而不是MEMM。MEMM的feature是,将ME的每个feature,额外加入上一个状态作为条件。因此,用来训练MEMM的事件,应该写成这个样子,
    ... ...
    E U00-人-B U01-们-B U02-常-B U03-人/们-B U04-们/常-B U05-人/常-B
    ... ...
    实验的结果,对msr的数据集准确率有小幅提高,但是对pku的数据集有小幅降低。

  8. 您好,在网上搜到您的文章。
    本人在毕业论文中,要涉及到最大熵模型一些问题,望您能给于帮助。谢谢

  9. 夏璐,您好,我也是很浅显地学习了一些关于最大熵的一些原理,有问题大家可以一起探讨。

  10. 您好!我想问您下您的解码过程是如何实现的。我也采用张乐博士的maxent工具包,应用赵海博士的6 tags + 3字窗口法,对bakeoff2005公开的pku语料进行实验。但是得到的结果很差。用了赵海博士的6 tags + 3字窗口法,结果居然更差,不知道哪里错了。我的训练过程和测试的都是采用maxent工具包的命令行实现的:
    maxent -m pku_model -c 2 -i 100 -v pku_train.txt
    maxent -p -m pku_model --detail -o pku_result_detail.txt pku_test.txt
    其中pku_test.txt和pku_train.txt是我生成的maxent支持的语料格式
    请问知道哪里出错了吗?谢谢!

  11. 用了赵海博士的6 tags + 5字窗口法,结果居然更差,不知道哪里错了。 (楼上写错了应该是5字窗口,不好意思)
    请多多指教啊!谢谢了!

  12. robert,你的训练集的格式是什么样的,和我blog中的是一样的么?我也是直接用maxent -p来看预测结果的。你把-c 2设置成-c 1试一试?可能你cut掉的event太多了。

  13. 您好!我的训练集格式和您本文blog中只是标记有所不同。我今天用了您的crf2maxent.py的脚本生成pku_train.txt作为训练集重做了一次实验,结果还是很差。命令参数也改了 -c 1 了:
    maxent -m pku_model_c1_i100 -c 1 -i 100 -v pku_train.txt
    maxent -p -m pku_model_i100 --detail -o pku_i100_detail.txt pku_test.txt
    测试的时候我采用了两种方式:一种是直接采用命令形式(如上一行命令)预测所有Tags的概率,然后根据状态转移约束条件选择了其中概率最高的值,得到的F值: 84.5702%,这个值比用 -c 2 参数大约高了3个百分点;另外一种是使用maxent的API接口按行读入pku_test.txt,在每一行的末尾加入上一行所预测的Tag作为context来预测,得到的F值: 86.6413%,这个值比用 -c 2 参数大约高了3个百分点。我想问题可能出现在这几个方面:
    一、我的测试数据格式问题;
    二、我的解码过程有问题;
    本来还想我的训练数据可能有问题,但是用了你的转换脚本后结果我想这个问题应该排除了吧。
    所以我想请教您:如果是以上两个问题,应该如何解决?是否还存在其它问题?最后附上我的训练数据和测试数据样本:
    pku_train.txt:
    B U00-_B U01-迈 U02-向 U03-_B/迈 U04-迈/向 U05-_B/向 E
    E U00-迈 U01-向 U02-充 U03-迈/向 U04-向/充 U05-迈/充 B
    B U00-向 U01-充 U02-满 U03-向/充 U04-充/满 U05-向/满 E
    E U00-充 U01-满 U02-希 U03-充/满 U04-满/希 U05-充/希 B
    B U00-满 U01-希 U02-望 U03-满/希 U04-希/望 U05-满/望 E
    E U00-希 U01-望 U02-的 U03-希/望 U04-望/的 U05-希/的 B
    S U00-望 U01-的 U02-新 U03-望/的 U04-的/新 U05-望/新 E
    S U00-的 U01-新 U02-世 U03-的/新 U04-新/世 U05-的/世 S
    B U00-新 U01-世 U02-纪 U03-新/世 U04-世/纪 U05-新/纪 S
    pku_test.txt:
    U00-_B U01-共 U02-同 U03-_B/共 U04-共/同 U05-_B/同
    U00-共 U01-同 U02-创 U03-共/同 U04-同/创 U05-共/创
    U00-同 U01-创 U02-造 U03-同/创 U04-创/造 U05-同/造
    U00-创 U01-造 U02-美 U03-创/造 U04-造/美 U05-创/美
    U00-造 U01-美 U02-好 U03-造/美 U04-美/好 U05-造/好
    U00-美 U01-好 U02-的 U03-美/好 U04-好/的 U05-美/的
    U00-好 U01-的 U02-新 U03-好/的 U04-的/新 U05-好/新
    U00-的 U01-新 U02-世 U03-的/新 U04-新/世 U05-的/世
    U00-新 U01-世 U02-纪 U03-新/世 U04-世/纪 U05-新/纪
    U00-世 U01-纪 U02-— U03-世/纪 U04-纪/— U05-世/—
    U00-纪 U01-— U02-— U03-纪/— U04-—/— U05-纪/—

  14. Yong Sun:
    您好!我今天重做了一次实验,和昨天下午的实验区别是在每句测试语句前后做了个标记(我想可能句子的首尾信息也很重要)。结果F值:84.6196% 相对昨天下午的实验只有0.05左右的改进。我猜想如果是不是我的测试数据生成时有问题?冒昧向您要一份测试数据生成的脚本(或者是程序?),我的邮箱是wen6860@126.com,谢谢啦!

  15. 你好,我正在尝试实现CRF这个算法,在用Template生成feature function的时候,不明白为什么要如此设置templates,设置这样的Templates是基于什么样的根据?我看了您的博客,发觉您提到用的是赵海博士的“6 tags + 3字窗口法”,我找了一下他的博客,找不到相关资料,请问您可以共享一下相关的资料吗? 谢谢。

  16. 你好,赵海博士的博客已经找不到了,还有更多关于6 tags + 3字窗口法的资料吗?

  17. 你采用最大熵模型进行分词时,测试语料的格式是怎么样的?以前做过类似工作,怎么现在又有些迷惑了。

  18. 我想请问一下:你用最大熵做训练时用的输入文件,最后一列的状态是如何加入测试文件的呢(用最大熵做训练时,train.txt和test.txt的列数,处了第一列标记tag外,其他的不是都一样么)

  19. 你好,我刚刚开始学习最大熵模型,在网上看到张乐博士的最大熵模型工具包,想用它来做中文分词,但是看手册没看懂训练样本的输入格式,想请问一下,训练样本的输入格式,谢谢!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

To submit your comment, click the image below where it asks you to...
Clickcha - The One-Click Captcha