看到题目就知道我要说什么了,这个话题好像已经被讨论过n次了,看雅虎搜索blog上在06年就有过专题系列文章,地址为:http://ysearchblog.cn/2006/07/post_16.html,文中详细的介绍了有关中文分词的意义,算法,跟搜索引擎的关系等等。个人认为文章质量非常不错。其实我所写的也不外乎这些东西,可我为什么还要写呢?是因为我花了将近一周的时间来理解中文分词,收集有关资料,为了不让努力白费,我还是总结一下吧。
一.为什么要中文分词?
对啊,为何要分词,不分词行不行?要讨论这个话题,首先需要了解一下搜索引擎的原理。搜索引擎的为什么能快速检索到自己查询的关键字呢?实际上这得益于他的数据存储机制-----倒排索引。这里用一个例子来大体说明什么是倒排索引(之所以说大体,是因为我也没有深入的了解)。假设我有10篇文章,他们可能论述了相同或不同的主题。如果我想看看哪篇文中含有“中文分词”这个词语,我可以这么干:循环遍历每一篇文章,看看他的内容中有没有含有“中文分词”这个词语,然后把含有目标词语的文章返回。很显然,我需要打开10篇文章,并且从头到尾的遍历每篇文章,看能不能匹配到“中文分词”,这样的效率是很低的,对于毫秒级的搜索引擎来说是绝对不能接受的。所以我要给每篇文章做个“目录”!不是你想查询“中文分词”吗?好,我事先找到含有“中文分词”的文章。假设文章1,3,5,7含有这个词语,文章2,4,6,7含有“搜索引擎”,好,我建立一个对应关系表“中文分词——>1,3,5,7”,“搜索引擎——>2,4,6,7”,于是当你要检索“中文分词”这个词语的时候,我不再打开每篇文章去匹配,而是直接到对应关系表去看一下“中文分词”对应着文章1,3,5,7,好,结果出来了,文章1,3,5,7含有“中文分词”这个词语,同样检索“搜索引擎”,返回的结果是2,4,6,7。那我要同时检索“中文分词”和“搜索引擎”呢?那就是(1,3,5,7)跟(2,4,6,7)取交集!结果是文章7同时含有“中文分词”,“搜索引擎”。那我搜其他的词语呢?那就把其他词语也放到这个对应表中。这个“对应关系表”其实就是所谓的倒排索引,当然,倒排索引可能含有的信息更为丰富,比如不仅包含了词语在哪一篇文章,同时还包含了在这篇文章的哪个位置等等。很显然,我们需要把所有文章建立一个倒排索引。问题来了,计算机怎么认识哪个是词语呢?他并不知道“中文分词”就是一个词语。没有词语,怎么建立索引呢?于是,我们需要中文分词!并且分词发生在用户查询和服务器建立索引时。
二.什么样的中文分词适合搜索引擎
因为中文的每个句子是连续的字的序列,词语跟词语直接没有明显的分隔(英文的单词之间用格隔开