首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

【北大天网搜索引擎TSE学习札记】第7节——中文分词

2013-02-19 
【北大天网搜索引擎TSE学习笔记】第7节——中文分词这一节将介绍搜索功能入口程序TSESearch.cpp的第三步——中文

【北大天网搜索引擎TSE学习笔记】第7节——中文分词

        这一节将介绍搜索功能入口程序TSESearch.cpp的第三步——中文分词。

 (一)引子

        中文分词主要有基于字符串匹配的分词方法和基于统计的分词方法,基于字符串匹配的方法又称为机械分词方法,它是按照一定的策略将待分析的汉字串与一个充分大的词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词),所以该方法是基于词典的,需要一个充分大的且准且的词典。TSE中就是用的基于字符串匹配的分词方法。基于统计的分词方法在这里不做介绍,感兴趣的读者可以查看相关资料。

        机械分词方法根据不同的规则和策略有不同的中类,常用的机械分词方法有:正向最大匹配、逆向最大匹配、最少切分和双向最大匹配法。TSE中采用的就是正向最大匹配。关于该算法,这里也不再叙述,《搜索》一书中有很详细的介绍,网上也有非常多的资料,读者可以自己查阅。下面开始分析源代码。

 (二)代码分析

        看到第4节中main函数中中文分词部分,首先定义了一个CHzSeg类的对象,然后调用了该类的SegmentSentenceMM函数。中文分词的程序文件和数据文件都在./ChSeg目录中,看到./ChSeg/HzSeg.cpp文件,里面有两个关键的函数:SegmentSentenceMM和SegmentHzStrMM。原始的字符串中可能包含英文字符(ASCII字符)、中文特殊字符或者中文标点符号等,SegmentSentenceMM函数先过滤掉这些符号,将剩余的汉字字符串将交给SegmentHzStrMM函数进行中文分词。所以,SegmentSentenceMM是进行分词的调用接口,也可以说是中文分词预处理函数,而SegmentHzStrMM是中文分词算法的实现函数。下面看这两个函数的源代码,代码中加入了详细的注释(以“LB_C”开始的注释为我加入的)进行说明。


图1

        文章http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation中指出29-34行的代码漏掉了ch==32(如图2所示)。

【北大天网搜索引擎TSE学习札记】第7节——中文分词

图2

        这样其实也是不对的,而且问题会更加严重。代码的意思是:如果ch==32,则将s1[0]开始的i个字节数据拷贝倒已处理串s2,即不进行切分。例如s1=" love搜索“(注意love前面有一个空格字符),则这样分词后的结果是s2=”love搜索“,在倒排表中检索关键词时会去查找”abc搜索“,显然找到的几率是很低的,因为把"love"和"搜索"当成了一个词。TSE中搜索的结果就是0,如图3所示。

【北大天网搜索引擎TSE学习札记】第7节——中文分词

图3

        这里的处理也是我的一个疑惑之处,分析到s1的第i个字节时是否要插入分隔符,为什么要看s1[0]的取值呢?例如分析s1=”love搜索“,分析到'e'时遇到汉字,此时为什么要看s1[0]是不是LF、CR和SP来决定是不是要出入分隔符呢?这里应该直接插入分隔符就可以吧!不明白作者的真实意图,希望有理解的读者请解释一下!

热点排行