数学之美梳理(二)如何用数学的方法进行分词

上一篇关于如何计算一句话是否具有实际意义博客中的方法中,通过将一句话被拆分成不同的词,然后计算这个词的序列的可能性大小来实现的。

对于西方拼音语言来讲,词之间有明显的分界符,统计和使用语言模型非常直接。而对于一些亚洲语言,如中,日,韩,泰等,词之间没有明确的分界符,所以我们需要先对句子进行分词。

中文分词方法的演变

分词的输入是一串眉毛连着胡子的汉字,例如一个句子,例如:“中国航天官员应邀到美国与太空总署官员开会”,而分词的输出则是用分界符,比如用斜线或者竖线分割的一串词,如:中国/航天/官员/应邀/到/美国/与/太空/总署/官员/开会。

最容易想到的分词方法,也是最简单的方法,就是查字典。

所谓查字典的方法,其实就是把一个句子从左到右扫描一遍,遇到字典里有的词就标识出来,遇到复合词(比如“上海大学”)就找最长的词匹配,遇到不认识的字串就分割成单字词,于是简单的分词就完成了。

这个最简单的方法可以解决七八成以上的分词问题,应该说它在复杂性不高的前提下,还取得了不错的成果,但是它毕竟太简单了,遇到复杂的问题就无能为力了。

后来有发展成了最少词数的分词理论,即一句话应该分成数量最少的词串。这种方法的一个明显的不足是当遇到有二义性的分割时就无能为力了,比如对于短语“发展中国家”,正确的分割是“发展/中/国家”,而采用从左到右查字典的方法会将它分割成“发展/中国/家”,显然是错的。另外并非所有最长匹配都一定是正确的,比如“上海大学城书店”的正确分词应该是“上海/大学城/书店”,而不是“上海大学/城/书店”

1990年前后,清华大学的郭进博士用统计语言模型成功解决了分词二义性问题,将汉语分词的错误率降低了一个数量级。

利用统计语言模型分词的方法,可以用几个数学公式简单概括,假定一个句子S有几种分词方法,为了简单起见,假定有三种:

A1,A2,A3,,AkB1,B2,B3,,BmC1,C2,C3,,CnA_1,A_2,A_3,\ldots,A_k \\ B_1,B_2,B_3,\ldots,B_m \\ C_1,C_2,C_3,\ldots,C_n

上述各种分词结果可以产生不同数量的词串,分别用k,m,n三个不同的下标来表示这个句子在采用不同分词结果时的数目。

那么最好的一种分词方法应该保证分词完成后这个句子出现的概率最大。,也就是说如果A1,A2,A3,,AkA_1,A_2,A_3,\ldots,A_k 是最好的分词方法,那么其概率满足:

P(A1,A2,A3,,Ak)>P(B1,B2,B3,,Bm)P(A1,A2,A3,,Ak)>P(C1,C2,C3,,Cn)P(A_1,A_2,A_3,\ldots,A_k) \gt P(B_1,B_2,B_3,\ldots,B_m) \\ 且\\ P(A_1,A_2,A_3,\ldots,A_k) \gt P(C_1,C_2,C_3,\ldots,C_n)

因此只要利用上一章提到的统计语言模型计算出每种分词后句子出现的概率,并找出其中概率最大的,就能找到最好的分词方法。

也就是说,上一篇博客是已经有了分词方法了,然后将句子分成一个词串,求这个词串的概率,概率越大,这句子越可能有明确的意思,是按照同一种分词方法求几个不同句子的出现概率。而本篇博客是句子只有一个,有多种不同的分词方法,我们按照不同的分词方法将同一个句子分成不同的词串,去求不同词串的概率。
虽然都是求不同词串的概率,但前者是多个句子按照同一个分词方法获取的,比较的结果是哪个句子概率大,后者是一个句子不同的分词方法获取的,比较的结果是哪个分词方法概率大。

当然,这里有一个实现的技巧。如果穷举所有可能的分词方法并计算出每种可能性下的句子的概率,那么计算量是相当大的。因此,可以把它看成是一个动态规划的问题,并利用维特比算法快速找到最佳分词。

在郭进博士之后,海内外很多学者利用统计的方法,进一步完善了中文分词。其中值得一提的是清华大学孙茂松教授和香港科技大学吴德凯教授的工作。孙茂松教授的贡献主要在于解决了没有词典时的分词问题,而吴德凯教授则是较早讲中文分词方法用于英文词组的分割,并且将英文词组和中文词组在机器翻译时对应起来。

需要指出的是,语言学家对词语的定义不完全相同,比如“北京大学”有的人认为是一个词,有的人认为是两个词。一个折中的方法是,在分词的同时,找到复合词的嵌套结构,比如先把“北京大学”当做一个四字词,然后再进一步细分成两个。

一般来讲,应用不同,汉语分词的颗粒度大小应该不同,比如,在机器翻译中,颗粒度应该大一些,“北京大学”就不能被分成两个词,而在语音识别中,一般是要被分成两个词的。

针对不同的应用,我们可以构造出不同的分词器,但是这样做不进非常浪费,而且也没必要。更好的做法是让一个分词器同时支持不同层次的词的切分。比如“北京大学”既可以被看成一个整体,也可以被切开,然后由不同的应用自行决定切分的颗粒度,它的原理如下:

  1. 首先需要一个基本词表和复合词表,基本词表包含像“北京”“大学”“贾里尼克”这样无法再分的词。符合词表包含复合词以及它们由哪些基本词组成。
  2. 接下来根据基本词表和复合词表分别各建立一个语言模型,比如L1和L2
  3. 然后根据基本词表和语言模型L1对句子进行分词,就得到了小颗粒的分词结果,这里输入的是
  4. 再用复合词表和语言模型L2进行第二次分词

分词器的准确性问题

分词的不一致性分为错误和颗粒度不一致两种。

错误又分为两类,一类是越界型错误,比如把“北京大学生”分成了“北京大学/生”

另一类是覆盖性错误,比如把“贾里尼克”分成四个字

错误是改进分词器时要尽量消除的。

而颗粒度不一致则可以不作为错误,以免不同人的看法不同而左右了对分词器的衡量。