中文与西方文字不同,西方文字如英文的单词间有空格作为分隔,计算机很容易把一个个词分开。而中文句子里的之间没有分隔,要把中文句子拆分成词就需要使用中文分词技术。由于全文索引采用的是倒排索引技术,所以分词的效果直接决定了搜索的效果。
目前的中文分词技术主要有:n元切分、最长匹配、最大压缩、统计语言模型等方法。n元切分,即机械切分。就是把中文句子每n个字分成一个“词”。比如,“我是大学生”用一元切分的结果就是“我”、“是”、“大”、“学”、“生”。二元分词如果采用串分割,结果就是“我是”、“大学”、“生”,采用交叉分割结果就是“我是”、“是大”、“大学”、“学生”。通常,都采用交叉切分,以免在搜索“学生”时无法搜索到结果。同时,交叉分割可以保证查询和索引切分的一致性。但交叉分割的索引大小是串分割的n倍。机械切分并不是真正意义上的中文分词,因为它并没有把句子根据词法和语义分成有意义的词。这种方法实现简单,切分效率高,但会产生很多无用词。Lucene自带的StandardAnalyzer对中文的切分就是一元切分。Lucene Sandbox中的CJKAnalyzer采用的是交叉二元分词。
最长匹配法是使用词典来切分的。比如,“我是大学生”根据词典通常会被拆分为“我”、“是”、“大学生”。最长匹配法又分正向最长匹配和反向最长匹配,即从句子的正方向或方向匹配单词。通常反向最长匹配的效果要好于正向最长匹配。也可以把两者结合起来,即双向最长匹配。最长匹配法实现也较简单,分词速度较快,但准确率比较低。采用词典的分词方法的效果很大程度上取决于词典的质量。同时,在遇到词典中没有的词往往就束手无策了。而且,基于词典的分词对于新词,还有人名、地名等往往不能很好地识别。Lucene Sandbox中的ChineseAnalyzer就是采用的反向最长匹配。
统计语言模型方法简单的说,就是通过从文本库中统计出字与字之间结合和分开的概率来分词的。比如“我是大学生”,“是”和“大”结合的概率要小于“大”和“学”结合的概率。这种方法不依赖于词库和语法定义,可以适应新词以及人名地名等。但实现复杂,分词速度慢。在上下文信息较少的情况下效果不够好。
这有个免费的中文分词系统,貌似还不错,我在项目中已经用到了,而且官方提供免费更新
http://dev.8jiao.com/index.php/Wb_cws_index
你好,看了你写的文章,思路很清晰。能不能把全文和源代码发给我一份啊,万分感谢!!
期待全文:)
啊,深奥呀,看不懂,是不是四年以后也能达到这个境界了呢?赫赫
嗯…专业啊 是用于搜索的吧?!
牛人啊!
百度/google分别的分词在搜索引擎上和在硬盘搜索上,居然都不同!!!
呃…开始期待全文了.