本程序使用的是北大提供的人民日报1998年1月的语料库,包含约110万词。由于采用二元语法模型,所以需要计算语料库中单个词的频率,以及每一个词后面出现另一个词的频率。
2、建立二元切分词图。
建立一个有向无环图,图中的结点为任意一个可能的候选词语,图中的边代表相邻两个词语的续接关系。二元切分词图的每一条边的权值表示二元词语转移概率P(Wi|Wi-1)。任何一种切分的方式可以表示为二元切分词图上的一条起始结点到结束结点的路径。路径上所有边的概率之积就是该切分结果对应的二元语法模型概率。而我们要做的就是找出一条概率之积最大的路径。
3、对一个句子进行全切分。
在对句子进行切分时要按照词图的拓扑序,即从句首到句尾,每一个汉字表征一个hierarchy.将词图中的词归类到各个hierarchy。比如句子为“对一个句子进行全切分”。则词图中以“对”字结尾的词归到hierarchy0,以“一”字结尾的词归到hierarchy1……以此类推。
4、Viterbi算法求最优路径。
Viterbi算法是一种动态规划的算法。一个问题能够用动态规划来求解,它必须能够满足以下两个条件:最优子结构和重叠子问题。也就是说,一个问题的最优解是由子问题的最优解构成,而求解此问题最优解的方法过程,对于求解子问题也适用,也就是可递归性。
程序中,用变量optimalCandidates表示每个hierarchy上的最优解。
再用上面的句子举例。“对一个句子进行全切分”。对于“子”字,属于hierachy4,它的最优解可以由optimalCandidates[0],optimalCandidates[1],optimalCandidates[2],optimalCandidates[3],中的解来生成。对属于每个hierarchy的词,按照它的长度,找到它的上一个hierarchy。例如上面例子中的“子”字所属的hierarchy中有一个词是“句子”。那么这个词就回溯到hierachy2,看看P(句子|optimalCandates[2])的概率值。假设“子”字hierarchy还有一个词是“个句子”这个词可以回溯到hierachy1。
求得概率最大的最优值之后,再从最后一个hierarchy回溯遍历一遍,便能获得最优解,即一种概率最大的切分方式。
二、程序实现
该程序在windows7环境下采用python3.2编写。主要包括以下几个模块:
(1)SegmentEvaluate.py为分词的正确性评估模块,通过计算分词的准确率,召回率以及F值来评估分词的准确度。(2)MyViterbi.py为viterbi类模块,主要是实现viterbi算法求最优解。
(3)WordDict.py为读取语料库进行训练的模块,统计语料库中的频数信息生成词典供viterbi类使用。
(4)WordSegment.py为分词的主程序,其中包括的分词的输入、输出文件信息。
三、分词性能
测试集也是采用的人民日报1998年1月的语料库。开放测试方法:首先将已切分语料删除一部分,形成开放测试集,在没有针对开放测试集进行训练学习的情况下,对删除的那部分进行分词测试,得到一组实验结果。封闭测试方法:用完整的已切分语料进行训练,之后用语料中出现过的部分语句进行测试,得到训练语料的测试结果。测试结果如下表所示。
表1分词测试结果
词数
实际切分词数
准确率
召回率
F-值
开放测试
10645
11110
0.907021
0.946642
0.926408
封闭测试
380806
378885
0.991874
0.986870
0.989365
四、参考文献
[1]张华平,刘群.基于N2最短路径的中文词语粗分模型[J].中文信息学报,2002,16(5):77-84.
[2]吴应良,韦岗,李海洲.一种基于N-gram模型和机器学习的汉语分词算法[J].电子与信息学报,2001,23(11):1148-1153.
[3]孙晓,黄德根.基于动态规划的最小代价路径汉语自动分词[J].小型微型计算机系统,2006,27(3):516-519.
[4]刘丹,方卫国,周泓.基于贝叶斯网络的二元网络中文分词模型[J].计算机工程,2010,1(1):12-14.