关于百度中文分词系统研究(下)

分词中的难题

经历了将近十年的发展,各种分词算法都已经比较成熟了,但是中文是一种十分复杂的语言,让计算机理解中文语言更难。在中文分词过程中,有两大难题一直没有完全突破。

1) 歧义识别

歧义是指同样的一句话,可能有两种或者更多的切分方法。例如,“安徽大学生”,因为“安徽”、“大学”、“学生”、“大学生”、“安徽大学”都是词,那么 这个短语就可以分成“安徽/ 大学生”和“安徽大学/ 生”。这种称为交叉歧义。像这种交叉歧义十分常见,相对组合歧义来说是还算比较容易处理的,组合歧义就需要根据整个句子来判断了。例如,在句子“这个门把 手坏了”中“, 把手”是个词,但在句子“请把手拿开”中“, 把手”就不是一个词。此外,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。如“网球拍卖完 了”,如果没有上下文,即使是人也很难判断到底是“网球拍/卖/完了”还是“网球/拍卖/完了”。

2) 新词识别

新词,专业术语称为未登录词,也就是那些在字典中都没有收录过,但又确实能称为词的那些词。最典型的是人名,此外还有机构名、地名、产品名、商标名、简 称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。目前新词识别准确率已经成为 评价一个分词系统好坏的重要标志之一。

百度分词算法推导

搜索引擎涉及到许多技术点,比如查询处理、排序算法、页面抓取算法、CACHE 机制、ANTI C SPAM 等等。这些技术细节,作为商业公司的搜索引擎服务提供商比如百度, Google 等是不会公之于众的。将现有的搜索引擎看作一个黑盒,通过向黑盒提交输入,判断黑盒返回的输出大致判断黑盒里面不为人知的技术细节。百度作为一个典型的中 文搜索引擎一直强调其“中文处理”方面具有其它搜索引擎所不具有的关键技术和优势。那么就来看看百度到底采用了哪些所谓的核心技术。

首先,判断一下百度的分词条件。单字词不用分,从二字词开始,为了避免词对判断分词程序是否起作用的干扰,输入任意非词二字。分别向百度提交“校 学”、“学大”,从返回结果的标红关键字来看,百度并没有将“校学”、“学大”分成“校/ 学”、“学/ 大”,说明百度的分词程序没有启动;接着提交查询“或者与”,返回结果1 210 000 篇相关页面,翻到最后一页,发现标红的关键字都是“或者与”连续出现的情况,好像没有切分,但是还不确定,再提交人工分好的查询“或者与”,返回结果31 400 000 篇,要么是“或者,与”,要么是“或者与”,可以确定没有进行分词; 再向百度提交“论文下载”,从返回结果中标为红字的地方可以看到查询已经被切分成“论文/ 下载”两个词了,说明分词程序已经启动了。如果是比四个中文字符更长的字符串,分词程序当然也会被激发了。归纳一下,单从字符数上来看,百度的分词条件是 大于等于四个中文字符,三个及以下字符不进行切分。

下面,判断一下百度采取的分词算法。现在分词算法已经算是比较成熟了,有简单的有复杂的,比如正向最大匹配、反向最大匹配、双向最大匹配、语言模型方法、最短路径算法等等。判断一个分词系统好不好,关键看两点,一个是消除歧义能力;一个是词典未登录词的识别能力。

首先假设,百度没有采取比较复杂的算法,因为考虑到速度问题。提交一个查询“安徽大学网络实验室”,如果是正向最大匹配算法的话,那么输出应该是: “安徽大学/ 网络实验室”或者“安徽大学/ 网络/ 实验室”,百度的分词结果:“安徽大学/ 网络/ 实验室”,跟期望相一致,但是并不能据此就说明百度采用的是正向最大匹配算法。再输入“甲型H1N1 流感症状”,结果百度分为“甲型H1N1/ 流感/ 症状”。可以获得如下信息:百度能够识别“甲型H1N1”,说明百度有未登录词识别功能或者百度的专有词典中已经有了“甲型H1N1”这个词。认为分词过 程分为两个阶段:第一阶段,查找一个特殊词典,这个词典包含一些人名、地名以及一些普通词典没有的新词, 这样首先将“甲型H1N1”解析出来。第二阶段,将剩下的字符串“流感症状”交给普通词典,分成“流感/ 症状”。分词的结果也符合正向最大匹配算法。然而上面的两个例子如果是反向最大匹配算法结果也是说的通的,为了证明这一点,提交查询“安徽大学科建设”, 如果是反向最大匹配算法应该分成“安徽/ 大/ 学科/ 建设”,百度实际分成“安徽大学/ 科/ 建设”。再查询“东京城市民国”, 如果是反向最大匹配算法应该分成“东京/ 城市/ 民国”,但是百度分成“东京城/ 市民/ 国”,这就证明了不是反向最大匹配算法。同时又出现了新的问题,“东京”是个城市的名字,为什么没有识别出来,而是分成了“东京城”,我想应该是百度的专 有词典中有“东京城”这个词,虽然也有“东京”,但是按最大匹配来分应该是分成“东京城”。这样基本能确定百度分词采取了至少两个词典,一个是普通词典, 一个是专有词典( 地名、人名等) 。而且是专有词典先切分,然后将剩余的片断交由普通词典来切分。继续测验,提交查询“登上海东方明珠”,如果没有专有词典,那么结果应该是“登上/ 海/ 东方明珠”,事实上百度的分词结果是“登/ 上海/ 东方明珠”。至此,可以判断百度的分词算法是正向最大匹配算法。

结束语

归纳一下百度的分词算法系统:首先用专有词典采用正向最大匹配分词,切分出部分结果,剩余没有切分的部分交给普通词典,同样采取正向最大匹配分词, 最后输出结果。虽然正向最大匹配分词方法分词的效果可能不是最好的,却是最符合中国人的习惯的。另外百度的专有词典也是很强大的,不仅包含的专有词非常 多,而且收录新词的速度很快。