小议分词
中文信息检索系统中,创建倒排索引时应当使用什么分词方式一直是众说纷纭,毫无定论。
具我所知,已有某某 paper “研究指出”采用二元切分的方式构建索引是“最好的”;也看到过园子里的一位兄弟认为单字切分最准确(sorry,忘记具体出处);当然,将某个基于词典或者共现频率的中文分词组件包装一下加入自己的项目中也是非常流行的做法。
既然存在这么多的看法与做法,难免会让人生出一较高下或者明辨真伪的决心;
不过作为一个成熟而又理智的热血青年,偶认为这种决心并无必要,原因在于信息检索系统的评价标准是多样化的——召回率、准确率与查询效率三个指标相互矛盾,只有取舍、不能调和;人们关心的指标不尽相同自然会提出不同的观点、奉行不同的做法。假设你在做一个Web搜索引擎,首先要保证的一定是查询效率,因为它所要处理的海量数据与并发请求是一种天然的障碍;其次,在召回率与准确率中你会更倾向于后者,因为最终用户与Web搜索引擎的关系恰如负心男人与痴情女人的关系——用户希望尽快得到最满意的结果,并在下一个瞬间把你抛弃,直到他们再次需要你为止(当然,如果你提供了代号为 Good Morni 的竞价排名服务,为了不致客户投诉,最好还是关心一下召回率。所以说,广大小白和一小撮VIP之间的利益冲突是深刻、长远以及不可调和的。。。);同时,对于一个传统的图书信息检索系统,情况会大不相同——书籍与文章有良好的关键字索引,包括标题、作者、摘要、正文、收录时间等定义明确的结构化数据,文档集合相对稳定并且规模相对较小——这一切都使你的决策更倾向于提高系统的召回率,原因很简单,你有这么做的可能性或者说是先天优势。
既然我们已经明确评价信息检索系统的指标是多元化的,现在让我们来看看不同的索引分词策略到底如何影响这些指标。
首先让我们来比较两个对立的策略,单字切分 vs 中文分词:
单字切分的支持者们最强有力的证据大概如下:
“世界杯”是一个词,用单字切分的话,查“世界”也可以命中这篇文档,而用中文分词就查不到了;
而中文分词的支持者们的反驳大概是:
“参加过世界杯”,用单字切分的话,查“过世”也可以命中这篇文档,但事实上并没有人挂掉;
通过以上陈述我们可以观察得到这样的结论,采用单字切分会提高系统的召回率,而降低准确率;而中文分词则恰恰相反,它提高了准确率,并降低的召回率,并且分词的颗粒越粗糙(平均词长越长)这种趋势就越明显。
这个结论似乎有助于理解为什么 google、百度等等这些理论上更需要高准确率的Web搜索引擎都采用了中文分词技术。但是如果我们的认识仅停留在这种水平就未免显得过于肤浅:事实情况是,需要高吞吐量的Web搜索引擎在处理中文内容时必须采用中文分词技术。
让我们把倒排索引想象成一张表,其中每一行都有一个TermText以及所有包含该TermText的文档编号列表。这样在我们查询某个关键字时,可以一次性获得所有包含该关键字的文档,而不用在原始文档集合中逐一查找。 而采用不同的分词策略创建索引,事实上既是将文档编号集合以不同的程度打散到索引中不同的行。单字切分可以说是打散程度最低的一种方式,行数仅等于汉字数目,而整个倒排索引表会非常的“宽”;相反,颗粒较粗的中文分词将文档编号集合分配到更多的不同行,使得倒排索引表的宽度变小。并且随着分词粒度的增加宽度会逐渐减小,最极端的情况就是将每一篇文档看作一个“词”,此时倒排索引表的宽度处处等于1。
基于以上讨论,我们看出以下两点:
一、在文档集合数量非常庞大时,系统的吞吐量会受到存储倒排索引文件的磁盘的性能限制,因此,采用中文分词,缩短倒排索引表的宽度将有助于提高系统的吞吐量。
二、无论使用布尔查询或者是基于位置信息的查询(如 Lucene 中的 PhraseQuery)单字切分的单词查询性能不会好于中文分词。
这样看来,在Web搜索引擎中使用中文分词就不是一件难以理解的事情了;同样,在文档规模较小时,使用单字切分的策略也不会有什么重大问题。
至于二元切分,在偶看来,这种方法试图以一种战场外科手术的粗犷气质实现中庸之道的思想,单字切分与中文分词之间形成了一种在某些方面不尽人意的折中(歧义、无意义的二元组等)。在实现上它更接近单字切分,而非中文分词。按照偶滴设想,如果实现一种对标准意义的中文分词策略的改进,使其能够在一定程度上缓解中文分词降低召回率的问题,也许会成为一种在各方面都更加平衡的解决方案。
具我所知,已有某某 paper “研究指出”采用二元切分的方式构建索引是“最好的”;也看到过园子里的一位兄弟认为单字切分最准确(sorry,忘记具体出处);当然,将某个基于词典或者共现频率的中文分词组件包装一下加入自己的项目中也是非常流行的做法。
既然存在这么多的看法与做法,难免会让人生出一较高下或者明辨真伪的决心;
不过作为一个成熟而又理智的热血青年,偶认为这种决心并无必要,原因在于信息检索系统的评价标准是多样化的——召回率、准确率与查询效率三个指标相互矛盾,只有取舍、不能调和;人们关心的指标不尽相同自然会提出不同的观点、奉行不同的做法。假设你在做一个Web搜索引擎,首先要保证的一定是查询效率,因为它所要处理的海量数据与并发请求是一种天然的障碍;其次,在召回率与准确率中你会更倾向于后者,因为最终用户与Web搜索引擎的关系恰如负心男人与痴情女人的关系——用户希望尽快得到最满意的结果,并在下一个瞬间把你抛弃,直到他们再次需要你为止(当然,如果你提供了代号为 Good Morni 的竞价排名服务,为了不致客户投诉,最好还是关心一下召回率。所以说,广大小白和一小撮VIP之间的利益冲突是深刻、长远以及不可调和的。。。);同时,对于一个传统的图书信息检索系统,情况会大不相同——书籍与文章有良好的关键字索引,包括标题、作者、摘要、正文、收录时间等定义明确的结构化数据,文档集合相对稳定并且规模相对较小——这一切都使你的决策更倾向于提高系统的召回率,原因很简单,你有这么做的可能性或者说是先天优势。
既然我们已经明确评价信息检索系统的指标是多元化的,现在让我们来看看不同的索引分词策略到底如何影响这些指标。
首先让我们来比较两个对立的策略,单字切分 vs 中文分词:
单字切分的支持者们最强有力的证据大概如下:
“世界杯”是一个词,用单字切分的话,查“世界”也可以命中这篇文档,而用中文分词就查不到了;
而中文分词的支持者们的反驳大概是:
“参加过世界杯”,用单字切分的话,查“过世”也可以命中这篇文档,但事实上并没有人挂掉;
通过以上陈述我们可以观察得到这样的结论,采用单字切分会提高系统的召回率,而降低准确率;而中文分词则恰恰相反,它提高了准确率,并降低的召回率,并且分词的颗粒越粗糙(平均词长越长)这种趋势就越明显。
这个结论似乎有助于理解为什么 google、百度等等这些理论上更需要高准确率的Web搜索引擎都采用了中文分词技术。但是如果我们的认识仅停留在这种水平就未免显得过于肤浅:事实情况是,需要高吞吐量的Web搜索引擎在处理中文内容时必须采用中文分词技术。
让我们把倒排索引想象成一张表,其中每一行都有一个TermText以及所有包含该TermText的文档编号列表。这样在我们查询某个关键字时,可以一次性获得所有包含该关键字的文档,而不用在原始文档集合中逐一查找。 而采用不同的分词策略创建索引,事实上既是将文档编号集合以不同的程度打散到索引中不同的行。单字切分可以说是打散程度最低的一种方式,行数仅等于汉字数目,而整个倒排索引表会非常的“宽”;相反,颗粒较粗的中文分词将文档编号集合分配到更多的不同行,使得倒排索引表的宽度变小。并且随着分词粒度的增加宽度会逐渐减小,最极端的情况就是将每一篇文档看作一个“词”,此时倒排索引表的宽度处处等于1。
基于以上讨论,我们看出以下两点:
一、在文档集合数量非常庞大时,系统的吞吐量会受到存储倒排索引文件的磁盘的性能限制,因此,采用中文分词,缩短倒排索引表的宽度将有助于提高系统的吞吐量。
二、无论使用布尔查询或者是基于位置信息的查询(如 Lucene 中的 PhraseQuery)单字切分的单词查询性能不会好于中文分词。
这样看来,在Web搜索引擎中使用中文分词就不是一件难以理解的事情了;同样,在文档规模较小时,使用单字切分的策略也不会有什么重大问题。
至于二元切分,在偶看来,这种方法试图以一种战场外科手术的粗犷气质实现中庸之道的思想,单字切分与中文分词之间形成了一种在某些方面不尽人意的折中(歧义、无意义的二元组等)。在实现上它更接近单字切分,而非中文分词。按照偶滴设想,如果实现一种对标准意义的中文分词策略的改进,使其能够在一定程度上缓解中文分词降低召回率的问题,也许会成为一种在各方面都更加平衡的解决方案。