中科院分词系统的平滑处理

根据2元统计语言模型,最优可能的一种划分s1,s2,..sn 满足下面的值最大:
P(s) = max(p(s1) * p(s2|s1) * ... * p(sn|sn-1);
一般两边取对数
lnp(s) = max(ln(p(s1)) + ln(p(s2|s1)) + ... + ln(p(sn|sn-1)))
那么一条路径的长度为:
wi = ln(p(si|si-1))

但是,在中科院分词系统的源代码中却发现,
wi = -log{a*P(si-1)+(1-a)P(si|si-1)} (0<a<1)
这是为什么呢?
实际上,他做了一个所谓的平滑处理。为什么要做平滑处理呢?
语料是有限的,不可能覆盖所有的词汇。做过物理实验的都知道,我们一般测量了几个点后,就可以画出一条大致的曲线,这叫做回归分析。
利用这条曲线,就可以修正测量的一些误差,并且还可以估计一些没有测量过的值。
统计语言里面也一样,如果 p(si|si-1) = 0, 我们就要估计一下它的大小。
在免费版本里面的这个估计非常的粗糙,实际上会引起很多的分词不准确性,特别是对那些 P(si-1) 比较大,同时 P(si|si-1) 又比较小的词。
这个a 值,默认是 0.1 , 对于字典比较全的情况下,可以把这个值设置小一点。这样可以提高准确性。
如果,要进一步改进这个回归算法,可以看下面的论文:

Katz平滑算法在中文分词系统中的应用 , 版权关系,不提供下载了。
posted @ 2009-08-04 16:59  暮夏  阅读(740)  评论(0编辑  收藏  举报