基于字分类的分词
phyeas
2010-03-30
最近看最大熵看的不太懂,以下描述是本人对字分类算法的一些看法,各位看官说说自己的看法。(下文中,B代表词首、M代表词中、E代表词尾、S代表单字)
首先根据语料训练,得出每个字特征如下: 字本身作为B、M、E、S的概率 根据前一个字得出B\M\E\S的概率 根据后一个字得出B\M\E\S的概率 训练完成后对输入分词时要记入前一个字的B\M\E\S概率对当前字的影响,如当前为第一个字,则字为B的概率为1/2,为S的概率为1/2,M和E均为0 如要分词“我们都是中国人” 当前字为"我",首先根据前一个字对当前字的影响,其概率值为 B=0.5 M=0 E=0 S=0.5 假设此时“我”字的本身作为B的概率为0.4,作为S的概率为0.6,其余均为0,加上后得到概率为 B=0.9 M=0 E=0 S=1.1 现在无法读取前一个字(现在是句首),读取后一个字“们”,根据“们”得出前面这个这个“我”字作为B的概率为1,其余均为0,则加上后得到B=1.9 M=0 E=0 S=1.1 此时将B\M\E\S均除以3得到B=0.64,M=0,E=0,S=0.36 得到“我”字的概率分布后计算“们”字的概率分布 此时根据前一个字,“们”字作为B\M\E\S的概率是均等的,所以此时B=0.25,M=0.25,E=0.25,S=0.25 根据“们”字本身的概率(假设为B=0,M=0.3,E=0.4,S=0.3),则加上前一次计算得到B=0.25,M=0.55,E=0.65,S=0.55,再根据前一个字“我”,得到概率分布(假设为B=0,M=0.5,E=0.5,S=0),相加得到B=0.25,M=1.05,E=1.15,S=0.55,在读取后面这个字“都”,假设模型中“都”对“们”没有约束条件,则根据最大熵原则,平均分布每个熵,加上上次的结果等于B=0.5,M=1.3,E=1.4,S=0.8,此时应将结果除以4,得到“们”字的概率分布,结果为B=0.13,M=0.33,E=0.36,S=0.23 此时应将“我”和“们”字的概率分布分别相乘得到 B->B=0.64*0.13=0.0832 B->M=0.64*0.33=0.2112 B->E=0.64*0.36=0.2304 B->S=0.64*0.23=0.1472 ----------------- S->B=0.36*0.13=0.0468 S->M=0.36*0.33=0.1188 S->E=0.36*0.36=0.1296 S->S=0.36*0.23=0.0828 (由于M和E均为0就不列出来了) 得出最大的概率结果应为B->E,所以“我们”应分为一个词。 其他字依次计算得出最后结果中最大的概率便是最大的分词可能。 回报完毕,大家说说是否可行。本人对最大熵没啥了解,仅限于知道其概念的程度。 |
|
phyeas
2010-04-10
咋没人讨论一下呢,今天又想到,这个算法最大的问题在于计算约束条件的概率……也就是上文说的“再根据前一个字“我”,得到概率分布(假设为B=0,M=0.5,E=0.5,S=0)”,想来想去,记起看最大熵的资料中提到的GIS算法,先平均分配概率,然后使用模型对语料进行评测,不断调高或降低概率分配再对语料进行评测直到模型收敛……据此应该是可以算出这个概率的
|
|
phyeas
2010-04-14
利用最大熵工具终于把分词器的f-score提到0.931了。
|
|
fxsjy
2012-09-29
finalseg 就是你说的这种算法的一个实现: https://github.com/fxsjy/finalseg
当然,有些小小的改进。 |