目前的搜索引擎,大多是基于一种称为倒排索引的结构[1]。以什么做为索引的Key值,直接影响到整个搜索引擎的准确度、召回率[2]、速度。我们先看看不使用中文分词的情况。
如果不使用中文分词,可以采用单个汉字索引方式。例如,雅虎,先索引'雅'字,然后再索引'虎'字。同样,对于一篇文章,先把所有的汉字都单独索引一次,并记录他们的位置。搜索过程中,也是先找'雅'字的所有文档,再找'虎'字的所有文档,然后做交叉'与'运算,即包含这两个字,而且位置连续的文档才会做为符合要求的结果。这种方式是最基本的索引方式,现在有些小引擎中还在使用。但这里存在一个很有挑战性的问题:总共的常用汉字是3000多个,我们每次查询过程中,进行'与'操作的计算量会相当大,对于大数据量搜索引擎来说(超过10亿的文档),每天上亿次查询,这样的索引结构,无疑是对硬件和算法的极大挑战。
考虑到速度问题,如果不使用分词,还有另外一种选择:n元组合索引方式,2元/3元等。拿2元来说,中国人,先索引'中国', 再索引'国人'。同样,对于一篇文章,以2为单位,把所有相邻的汉字都索引起来,并记录他们的位置。搜索过程中,也是先找包含'中国'的所有文档,再找'国人'的所有文档,然后做交叉'与'运算,即包含这两个单元,而且位置连续的文档才会做为符合要求的结果。这样以两个字做为索引单元,可以大大减少在搜索过程中的计算量。
以上两种方式,都可以不需要分词,也能实现搜索引擎的索引和搜索。但是这里存在一个不可忽视的问题:准确度。一个很常见的例子:和服,如果按照上面两种方式,都会查到包含'主板 和服 务器'的文档; 北大 也会得到'东 北大 学'。对于大数据量的搜索引擎来说,每个搜索次都会有成千上万个结果,用户已经很挑选他真正想要的文章,如果这里还要增加许多错误,估计用户体验会极差。这时候,我们需要中文分词。
词,是中文语言中最小的语意单位。以词为单位做为搜索引擎的索引的Key值,会大大提高搜索引擎结果的准确性,同时保证了搜索过程中计算量小。其实还有一个优点,以词为单位的索引,索引库会比上两种方式小很多。很明显:如果以 中国人 做为一个词,那么搜索的时候,不需要任何'与'运算,索引的时候记录也会减少。