maxent分词补遗

在和同事讨论最大熵时,介绍了以前一个用最大熵分词的实验,突然对为什么每个事件需要U03~U05这三项产生了疑惑,当时也没有细想。

... ...
E U00-人 U01-们 U02-常 U03-人/们 U04-们/常 U05-人/常 B
... ...

再重新整理了一下头绪,在张乐的工具包中,事件并非是样本,样本应该是那个三字窗口。例如“人们常”,这个样本产生了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的情况。

如此看来,我们原先训练的应该是加入状态转移约束的ME,而不是MEMM。MEMM的feature是,将ME的每个feature,额外加入上一个状态作为条件。因此,用来训练MEMM的事件,应该写成这个样子,

... ...
E U00-人-B U01-们-B U02-常-B U03-人/们-B U04-们/常-B U05-人/常-B
... ...

实验的结果,对msr的数据集准确率有小幅提高,但是对pku的数据集有小幅降低。

实验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
... ...