自动分词在互联网领域极其重要。比如你在搜索框里输入“中文自动分词算法”并搜索时,搜索引擎会同时找出含有“中文”、“自动”、“分词”和“算法”的内容网页,尽管这四个词并没有连在一块。比如一篇文章写清华大学生如何如何,但是相关文章里全是和清华大学有关的。这就多半是分词算法错误地把清华大学当成了一个词。
所以,计算机如何正确地切分一句话呢?
自动分词的主要困难在于分词歧义。“他说的确实在理”在计算机认为就有以下三种可能:
他 / 说 / 的 / 确实 / 在理
他 / 说 / 的确 / 实 / 在理
他 / 说 / 的确 / 实在 / 理
对于计算机来讲,上面三种都是可以的。最令人头疼的是诸如“中外科学名著”,“提高产品质量”,“鞭炮声响彻夜空”,“努力学习语法规则”这种,随便切几刀都是合理的,在这种极端例子下,分词算法的优劣一试便知。
最大匹配法
顾名思义,“最大匹配法”就是从句子左端开始,不断向右扫描,匹配出最长的词,一些组不出词的字单独划开。直到划完句子。在大多数情况下,这种算法可以成功。但是这种算法并不可靠。比如开头的“清华大学生前来应聘”,正确划分应该是“清华大学生 / 前来 / 应聘”,却会被划分成:“清华大学 / 生前 / 来 / 应聘”。
维护一个特殊规则表,可以修正一些很机械的问题,效果相当不错。例如强制把“不可能”分为“不 / 可能”这类特殊规则。
不过这种算法归根结底都是像人一样从左到右扫描文字,为了充分利用计算机的优势,我们还可以把句子作为一个整体来考虑,从全局的角度评价一个句子划分方案的好坏。因为每次都匹配最长的词,得出的方案不一定是正确的。
例如:“独立自主和平等互利的原则”这句话会被计算机分为“独立自主 / 和平 / 等 / 互利 / 的 / 原则”,一共有6个词;而正确的分法次数更少:“独立自主 / 和 / 平等互利 / 的 / 原则”,只有5个词。
但是最少词数法也有出错的时候,“为人民办公益”的最大匹配划分和最少次数划分都是“为人 / 民办 / 公益”,而正确的划分却是“为 / 人民 / 办 / 公益”。
算法当然还有进一步优化的余地,大家应该已经想到了,何不用每个词出现的概率来衡量句子的优劣?于是我们有了一个更标准、更连续、更自动的改进算法,即最大概率法。
最大概率法
先统计大量真实语料中各个词出现的概率,然后把每种分词方案中各词的出现概率乘起来作为这种方案的得分,最后选出得分最高的方案,认为这是分词的结果。
举个例子:“有意见分歧”这个句子。查表可知,“有”、 “有意”、 “意见”、 “见”、“分歧”的出现概率分别是0.0181、0.0005、0.0010、0.0002、0.0001,因此“有 / 意见 / 分歧”的得分是1.8×10^-9,但“有意 / 见 / 分歧”的得分只有 1×10^-11,正确方案胜。
但是这样的算法对于计算机来说,好像句子就是随机选择词语连在一起,是个一元过程。这个假设显然不合理。
于是我们不得不跳出一元假设,把人类语言抽象想象成一个二元模型,对于任意两个词语都生成一个概率P,即第一个词后刚好是第二个词的概率,划分完一个句子后,就把这个句子所有的P值加起来,得分最高的分词方案就认为是正确的分词方案。
至此,算是有了一个实用的算法。
但是在中文里,有一个最令人头疼的东西———未登录词。中文没有首字母大写,没有书名斜体,这让计算机如何辨识人名地名?这也是现在中文分词领域都在攻克的难关。
对于人名来说,汉语姓氏大约有1000个,人名的常用字也比较集中最常用的400字就涵盖了名字用字的90%。根据这些信息我们足以计算出一个字符串能够成为名字的概率,结合事先设定阈值就可能很好的识别出人名。
中国地名的用字就分散的多了,北京有一个地方叫“臭泥坑”。网上搜索 “臭泥坑”,前几页全是“臭泥坑地图”和“臭泥坑附近酒店”之类的信息。甚至重庆还有一个地方叫“犀牛屙屎”和“犀牛屙屎抽水”。好在中国地名也就十万多个。中国地名委员会编写了《中华人民共和国地名录》,就让地名的识别简单了许多。
最难的是缩略词了,大部分缩略词,例如“高数”,“女单”,“发改委”,“安检”,人人都知道什么意思。但是有些词人们都不知道代表什么。比如你能猜到“人影办”是什么的缩写吗?猜不到吧,是“人工影响天气办公室”。
很多缩略词都已经可以成为独立的词语加入词库了,但新出现的或者临时构造的词语就不那么友好了。所以如何解决网络文章的自动分词,目前还是相当困难的。革命尚未成功,分词算法还需努力。