这篇文章主要参考中科院软件所张俊林先生在2005年11月写作的《搜索引擎设计实用教程》的分词部分,提供的查询关键词范例也源于该文。
搜索引擎本身并不提供信息,因此用户需要在搜索引擎的搜索框键入关键词进行查询以获取信息,然而由于中文信息检索存在的自身特点,比如中文语词之间没有空格,中文的语法分析和语义理解与英语相比更为困难。因此搜索引擎在信息索引前都要对用户所查询的语词进行切分。
并非任何一个查询词百度都会进行切分,如果关键词组仅仅包含小于等于3个中文字符就保留不进行切分,大于4个中文字符的时候,百度的分词程序便会开始运行,这时候才是百度分词的真正时机。当然,如果是完全匹配的话,不管几个词,一般情况看起来都似乎没有进行切分,这是因为百度拥有一个全世界最庞大的中文分词词库,这个词库不断增加用户最新的查询词,比如“我是谁的谁”,这个原本要进行分词,但是因为词库中存在,百度就知道这是黄征的一首歌,于是就不予切分,但其实仍然是有进行切分的,只是百度将切分后的结果当做一个短语进行查询,看到的效果就跟没有切分是一样的。
分词算法也有简单难易之分,比如正向最大匹配、反向最大匹配、双向最大匹配、语言模型方法、最短路径算法等等。
张俊林先生假设百度因为考虑到速度问题,不会采取比较复杂的算法,因此判断百度采用的是双向最大匹配算法。他提交了一个查询“毛泽东北京华烟云”以测试百度的分词是如何消歧以及是否有词典未登录词的识别功能。我们知道这个查询如果是正向最大匹配算法的话,那么应该输出为“毛泽东/北京/华/烟云”,反向最大匹配算法的话,则会输出“毛/泽/东北/京华烟云”,百度分词结果却是“毛泽东/北/京华烟云”,因此有可能是双向最大匹配算法。
这个分词结果还告诉我们百度分词可以识别人名,也可以识别“京华烟云”这种词典未登录词的功能。
我们一起来看下具体的百度分词过程:
1,先查找内部的特殊分词词典,专用词典先切分,剩余关键词再交由普通词典来切分。
百度的这个词典应该包含了一些独有的人名、部分地名以及一些普通词典没有的新词。按照这样的方法,“毛泽东”被首先解析出来,剩下“北京华烟云”,通过反向最大匹配的分词结果,再次分为“北/京华烟云”。为了证明这时候百度分词采用了反向最大匹配,作者再次提交查询了“发毛泽东北”,百度没有输出正向最大匹配的“发毛,泽,东北”,而是输出“发,毛泽东,北”。而有时候比如查询“古巴比伦理”,则输出为正向最大匹配的结果“古巴比伦,理”,而非反向最大匹配的“古巴,比,伦理”,因此我们判断百度可能采用双向最大匹配分词算法。
这里附加说下,根据张俊林先生后来写的补充文章,结论应该是百度采取了正向最大匹配算法。例子说明见下:
从例子“山东京城”百度切分为“山东,京城”说明“东京”是在普通词典里,再次查询“陈晓东京华烟云”,这两个词汇都在专有词典里面,因此百度切分为“陈晓东,京华烟云”。
说明对于专有词典词汇,百度分词算法采取正向最大匹配或者双向最大匹配。
查询“陈晓东方不败”,关键词“陈晓东”“东方不败”都在专有词典,正向切分应为“陈晓东,方,不败”,反向切分则应为“陈,晓,东方不败”,百度切分结果是第一种,说明还是采用正向最大匹配。
2,当正向和反向匹配分词结果一致时,百度直接输出切词结果,不一致的则采用最短路径方法,即切分的片断越少越好,比如“古巴,比,伦理”和“古巴比伦,理”相比选择后者,“北京,华,烟云”和“北,京华烟云”相比选择后者。
3,当正向反向匹配分词不一致,并且最短路径也相同时,比如提交查询“遥远古古巴比伦”,这个查询被百度切分为“遥远,古古,巴比伦”,说明词典里面有“巴比伦”,但是否有“古巴比伦”这个词汇不确定,此时看不出是正向切分还是反向切分得出的结果。换查询“遥远古巴比伦”,此时被切分为“遥远/古巴比伦”,说明词典里面有“古巴比伦”这个词汇,这说明“遥远古古巴比伦”是正向最大匹配的结果。为什么“遥远古古巴比伦”不会被反向切分为“遥/远古/古巴比伦”呢?百度在这种情况下,可能选择单字少的那组切分结果。
4,当切分后单字也一样多,比如查询“王强大小”,百度的分词结果是“王/强大/小”,是正向切分的结果,而非反向的“王/强/大小”,这说明有歧义而且单字也相同则选择正向切分结果。
我们来看下张俊林先生对百度分词算法的总结:首先查询专用词典(人名、部分地名等),将专有名称切出,剩下的部分采取双向分词策略。如果两者切分结果相同,说明没有歧义,直接输出分词结果;如果不一致,则输出最短路径的那个结果;如果长度相同,则选择单字词少的那一组切分结果;如果单字也相同,则选择正向分词结果。
如果百度是采用正向匹配的话,那么我们应该重新归纳一下百度的分词系统:首先用专有词典采用最大正向匹配分词,切分出部分结果;剩余没有切分交给普通词典,同样采取正向最大匹配分词,最后输出结果。这样更为简单,不过文章中的观点距离现在已经有4年多,目前百度的分词算法我们应该通过自己的SEO实践重新得出。
判断一个分词系统好不好,关键看两点:一个是消除歧义能力;一个是词典未登录词的识别,比如人名、地名、机构名等。百度的分词算法仍然未能非常好地消除歧义,不过其庞大的分词词典在业内确是没有任何一家搜索引擎能够领先,虽然从第一来看百度的分词算法似乎并不像其在宣传中的“你不知道我知道”的高深莫测,但由于其拥有的庞大分词词典,我们仍然可以说百度的分词算法是目前所有搜索引擎最为成熟的。