说明: 本程序为中科院研究生院刘群老师的课程《计算语言学》的一个课程作业。所以,语料库来源于刘群老师,格式是1998年1月人民日报语料库经过编码后的格式。 语料库格式见正向最大匹配。关于二元词图以及Viterbi算法的入门性质介绍见二元词图,Viterbi算法入门简介

 

 

下面简单说一下:二元分词的思路。

1.       建立词图:

 词图上的节点为单字(如果此单字在字典中出现,它的初始概率就由语料库计算,否则赋极小值,1/NN为训练语料库中所有词的总和,如果词重复出现,其重数也要计算在内)以及对于这个句子所有可能出现的词,如果这个词在语料库中出现过,我们就把它加到词图上去。

 

2.       如何找到一个句子的所有可能分词?

采用如下方法:

首先对单词词典建立一个一级Trie树,即把词语按首字相同进行分组。对于句子中的每个字,我们看看以此字开头的词语的最大长度为多少,然后在句子中以此字为起始节点,每次取两个字,三个字……到最大长度位置,并且看看这些生成的词在词典里是否出现,如果出现则加入词图。

3.       为刚才生成的词图建立一个拓扑序(Topological order)。我的方法如下:从句首到句尾,没一个汉字表征一个hierachy. 将词图中的词归类到各个hierachy 比如句子为我是一个大好人大大的好人。则词图中以字结尾的词归到Hierachy0,以“是”字结尾的词归到Hierachy1……以此类推。

4.       维特比算法实现

为了简单起见,把双字词典也建立成了前缀Trie树。

维特比算法属于动态规划范畴。一个问题能够用动态规划问题建模,它必须能够满足以下两个条件:子结构最优,子问题交叠。也就是说一:1个问题的最优解是由最优的子问题的最优解构成;2求解此问题最优解的方法过程,对于求解子问题也适用,也就是可递归性。

建立一个变量  optimalCandidates,保存每个hierachy上的最优节点。

再用上面的句子举例。“我是一个大好人大大的好人”。第一个好字,属于hierachy5,它的最优解可以由 optimalCandidates[0], optimalCandidates[1], optimalCandidates[2], optimalCandidates[3], optimalCandidates[4],中的某些来生成。

对属于每个hierachy的词,按照它的长度,找到它的上一个hierachy。例如上面例子中的好字所属的hierchay中有一个词是“大好”。那么这个词就回溯到hierachy3,看看P(大好|optimalCandates[3])的概率值。假设 “好”字hierachy还有一个词是“学习好”这个词可以回溯到hierachy2,但是不做处理,因为“学”字和,不相等。

综上,就是我的二元分词法梗概。我的方法有一个缺陷,就是非常耗时。首先在建立字典上耗时,然后就是建立词图,需要不断查字典也比较耗时。

 

 

posted on 2010-08-13 19:05  finallyly  阅读(6405)  评论(6编辑  收藏  举报