毕业研究进度之中文分词

        由于平时都要去实习实在抽不出时间去搞这个毕设的研究,所以趁着两天周末的时间集中精力研读中文分词的相关文献。

        中文分词其实也是一个被许多人做过的课题,并且网上可以随便搜到不少开源的项目。好吧,经过一系列Research,我在这里总结下现在主流中文分词的技术。

        首先我们要回答一个问题,就是为什么要进行中文分词。词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键。

        然后我们来看下当前的中文分词技术的分类。该技术的实现方式现在大概有三大类:1)基于字典、词库匹配的分词方法; 2)基于词频统计的分词方法(在我之前写的一篇博文中的无知识库的关键词提取就是属于这种);3)基于知识理解的分词方法。惭愧的是我的水平有限,像第三类的基于知识理解的分词实在是啃不下来,只能大概介绍下其他两类中的分词方法。

        终于到正文了啊~        

最大正向匹配法(Maximum Matching Method)

        这个方法的基本思想为:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理……  如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。

其算法描述如下:

 

(1)初始化当前位置计数器,置为0;

(2)从当前计数器开始,取前2i个字符作为匹配字段,直到文档结束;

(3)如果匹配字段长度不为0,

    则查找词典中与之等长的作匹配处理。

        如果匹配成功,则,

            a)把这个匹配字段作为一个词切分出来,放入分词统计表中;

            b)把当前位置计数器的值加上匹配字段的长度;

            c)跳转到步骤2);

        否则

            a) 如果匹配字段的最后一个字符为汉字字符,

            则

                ①把匹配字段的最后一个字去掉;

                ②匹配字段长度减2;

            否则

                ①把匹配字段的最后一个字节去掉;

                ②匹配字段长度减1;

            b)跳转至步骤3);

    否则

        a)如果匹配字段的最后一个字符为汉字字符,

            则当前位置计数器的值加2;

            否则当前位置计数器的值加1;

        b)跳转到步骤2)。

 

逆向最大匹配法(Reverse Maximum Matching Method)

        这个方法的基本原理和正向的是相同的,不同的是分词切分的方向和正向的相反(感觉的废话)。逆向最大匹配发从被处理文档的末端开始扫描,每次取最末端的2i个字符(i字字串)作为匹配字段,若匹配失败,则去掉字段最前面的一个字,继续匹配。

        由于汉语中偏正结构较多,若从后向前匹配,可以适当提高精确度。所以,逆向最大匹配法比正向最大匹配法的误差要小。统计结果表明 ,单纯使用正向最大匹配的错误率为 1/169,单纯使用逆向最大匹配的错误率为1/245。例如切分字段“硕士研究生产“,正向最大匹配法的结果会是“硕士研究生/产”,而逆向最大匹配法利用逆向扫描,可得到正确的分词结果“硕士 / 研究 / 生产”。

 

双向匹配法

        将正向最大匹配法与逆向结合起来。先根据标点对文档进行粗切分,把文档分解成若干个句子,然后再对这些句子用正向最大匹配法和逆向最大匹配法进行扫描切分。如果两种分词的结果是一样的,那么说明没有歧义,分词成功;但是如果不一样,则说明有歧义,而该算法的关键也正是在这个消除歧义上面。

        常见的歧义消除方法有:选择分词数量较少的那个、选择单字较少的那个、选择分词长度方差最小的那个。

        罚分策略:简单来说,就是有很多中文字,几乎是永远不会单独出现的,总是作为一个词出现。那么,就单独做个字典,把这些字加进去。如果在分词的结果中,包含这样的单字,说明这个分词结果又问题,就要扣分。每出现一个,就扣一分。正反分词结果经过扣分之后,哪个扣得少,哪个结果就是最优的。这个方法乍听起来简直就是坑爹啊,你怎么去统计一个字总是在词语中出现而不是单独出现啊,制作这个惩罚字的字典实在太费时费力了。然而作为一个喜欢偷懒的人,通过进一步的Research,发现可以用多音字进行替换,原因很简单,如果多音字总是单独出现的话,那么谁会知道它应该念成什么呢。因此罚分的根据就是如果分词的结果中出现单独存在的多音字,那么就罚分。

        其实事实上,罚分的方式多种多样,上述的两种方法也不见得就是是有效的,遇到某些情况总有不灵的时候,所以罚分的标准可以从多个角度综合考虑,非词典词罚分,甚至大颗粒度词积分的策略都是可以被考虑采纳的。

 

       除此之外,google黑板报上面提到的统计语言模型算法非常优秀,当然这个是我在Matrix67大牛的博客上面看到的,因为自从我离开上一次实习的地方,就再也看不到国外的网络世界了,国内的网络根本上不去google黑板报!!!我将原文我认为最有价值的一部分贴在下面:

对于任意两个词语 w1 、 w2 ,统计在语料库中词语 w1 后面恰好是 w2 的概率 P(w1, w2) 。这样便会生成一个很大的二维表。再定义一个句子的划分方案的得分为 P(∅, w1) · P(w1, w2) · … · P(wn-1, wn) ,其中 w1, w2, …, wn 依次表示分出的词。我们同样可以利用动态规划求出得分最高的分词方案。这真是一个天才的模型,这个模型一并解决了词类标注、语音识别等各类自然语言处理问题。

 

        至此,我中分分词的算法总结就大概告一段落了,在接下来的博文中我会贴出我写的一些程序。

posted @ 2014-01-08 21:49  BruceShen  阅读(331)  评论(0编辑  收藏  举报