3.2 中文分词
不言而喻,中文中最小的单位是字,但具有语义的最小单位是词,这是区分中文分词技术和英文分词技术的最重要的理论基础,也是导致切分方式不同的原因。中文分词技术是一项关键的技术,尽管目前的中文分词技术已经比较成熟了,但是它依然在语义分析方向上有很大的发展空间,需要尽可能地以自然语言的理解方式去分词。
3.2.1 中文分词概要
在中文分词过程中不仅要进行语义分析,还要进行多重性分词。多重性分词是指让分词结果尽可能多种多样。例如,句子“中国科学技术大学在哪?”,这样一条简单的语句却包含了搜索中非常难处理的问题。在正常情况下的分词结果为“中国科学技术大学\在哪\?”,看似完美的分词效果,但是对于大数据时代的搜索引擎来说,并不是理想的分词效果。为了提供更好的搜索结果,会做到如下分词:中国科学技术大学\在哪\中国\科学\技术\大学\科学技术\?。这是分词的原子化,不仅描述全局,更深入细节,从而为搜索结果提供了很好的技术支持。另外,为了提供很好的搜索结果,最好在进行语义分析的同时分析用户搜索的意图,判断出原本用户最期待的答案是“安徽合肥”,但是这对自然语言处理的要求相对较高。
中文分词的方式有很多种,最常用的是基于词库的分词方式。但是对于搜索引擎使用的自然语言处理框架而言,仅仅采用基于词库的分词方式是不够的,还需要利用机器学习的方式,采用基于上下文信息的分词技术。目前公认的机器学习方式能够达到的较好效果是基于条件随机场(Conditional Random Fields)模型的中文分词技术。目前,随着深度学习的发展,基于深度学习技术实现的分词方法也在不断涌现。
3.2.2 基于词库的分词技术
在词典的分词方法中,逆向最大匹配分词是常用的方式之一,在一般情况下,匹配效果较为满意,但准确程度也在一定程度上依赖词库。同理,也存在正向最大匹配分词。这里的逆向最大和正向最大表示分词时允许每次读取的最大文本长度。
正向最大匹配的实质是在每次从头开始读取最大文本长度之后,去词库中查询该词是否存在,如果不存在,则减少一个字,再去词库中查询该词是否存在,依次类推,直到找到一个词为止。例如,假定某词库中包含“香港大学”“香港”“大学”“校庆”“典礼”等词。对于句子“香港大学校庆典礼”的正向最大匹配顺序如图3-1所示。
图3-1 对于句子“香港大学校庆典礼”的正向最大匹配顺序
设定最大匹配长度为5,则首先从字符串的开始位置依次取5个长度的词语“香港大学校”,将其与词库进行比较,如果词库中不存在“香港大学校”,则将“香港大学”与词库进行比较,结果命中词库,这意味着可以将“香港大学”视为一个词。依次将剩余的字符串按照相同的方法与词库进行比较,最终分词结果为“香港大学\校庆\典礼”。
逆向最大匹配的计算过程与正向最大匹配的计算过程一致,唯一不同的是对匹配顺序的改变,其匹配顺序如图3-2所示。
图3-2 对于句子“香港大学校庆典礼”的逆向最大匹配顺序
同样设定最大匹配长度为5,则从字符串的尾部位置向前依次取5个长度的词语“学校庆典礼”与词库进行比较,如果不能与词库匹配,则减少一个字,将“校庆典礼”与词库进行比较,依次类推。最终的分词结果与采用正向最大匹配分词方法的分词结果一致。
逆向最大匹配分词方式与正向最大匹配分词方式都有自己的优势,但是在基于相同词库的情况下,工程应用表明,逆向最大匹配分词方式优于正向最大匹配分词方式。例如,针对句子“发展中国家领导人正在开会”设定正向最大匹配长度为5,则采用正向最大匹配分词方式的分词结果为“发展\中国\家\领导人\正在\开会”;而采用逆向最大匹配分词方式的分词结果为“\发展\中\国家\领导人\正在\开会”。当然,并不是说逆向最大匹配分词方式时时刻刻都是最优的,它也存在效果比正向最大匹配分词方式差的情况。例如,“庞大数据”采用逆向最大匹配分词方式的分词结果为“庞\大数据”,而实际上正向最大匹配分词方式的分词结果“庞大\数据”略好。
在工程应用中,会将正向最大匹配分词方式与逆向最大匹配分词方式结合,俗称“双向匹配分词”。首先,对被分词的句子采用两种方法分别进行分词处理;然后,将两者的分词结果进行比较,如果分词结果一致,则直接输出,如果分词结果不一致,则按照如下原则输出。
(1)分词结果中词越少越优先输出。例如,“三角形和平行四边形”,正向最大匹配分词方式的分词结果为“三角形\和平\行\四边形”,而逆向最大匹配分词方式的分词结果为“三角形\和\平行四边形”,分别产生了4个词语与3个词语,因此优先输出“三角形\和\平行四边形”。
(2)分词结果在词库中能够找到得越多越优先输出。例如,“售后和服务”,正向最大匹配分词方式的分词结果为“售后\和服\务”,在词库中能够找到“售后”“和服”,而“务”不存在单独的词;逆向最大匹配分词方式的分词结果为“售后\和\服务”,在词库中三者均能够找到。因此,优先输出逆向最大匹配分词方式的分词结果“售后\和\服务”。
正向最大匹配分词方式与逆向最大匹配分词方式在无法通过上述两项原则区分优先输出结果时,优先输出逆向最大匹配分词方式的分词结果。
3.2.3 基于条件随机场模型的中文分词
基于条件随机场模型进行中文分词是一种有效的方式。条件随机场模型是以最大熵马尔科夫模型(Maximum Entropy Markov Model, MEMM)及隐马尔科夫模型(Hidden Markov Model, HMM)为基础提出的一种判别式概率无向图模型,是一种用户标注和切分有序数据的条件概率模型。在基于条件随机场模型进行中文分词之前,需要对判别式模型和概率图模型有一定的了解。
(1)判别式模型。判别式模型(Discriminative Model)通过判别函数形成预测模型进行预测;与之相对应的是产生式模型(Generative Model),它通过概率密度模型形成产生模型进行预测,如图3-3所示。
图3-3 产生式模型与判别式模型的预测方式示例
对于输入数据x,判别类型标签y,产生式模型估计它们的联合概率分布P(x, y),判别式模型估计条件概率分布P(y|x)。其中,联合概率分布与条件概率分布都属于现代概率论中的概念,两者的含义如表3-2所示。
表3-2 联合概率分布与条件概率分布的含义
判别式模型和产生式模型是机器学习中的重要概念,是基于条件随机场模型进行中文分词的理论基础。
下面通过示例说明判别式模型和产生式模型。已知数据(x, y)表示x与y的某种特定关系,对于多个数据(b, a)、(b, b)、(c, a)、(c, b),分别通过产生式模型和判别式模型对x与y的关系进行分析。
通过产生式模型计算P(x, y),则P(b, a)=1/2、P(b, b)=0、P(c, a)=1/4、P(c, b)=1/4。通过判别式模型计算P(y|x),则P(a|b)=1、P(b|b)=0、P(a|c)=1/2、P(b|c)=1/2。
产生式模型与判别式模型的优缺点如表3-3所示。
表3-3 产生式模型与判别式模型的优缺点
产生式模型可以依据贝叶斯公式转换为判别式模型,但是判别式模型不能转换为产生式模型。之所以基于条件随机场模型进行中文分词,是因为它既具有判别式模型的优势,又具有产生式模型中转移概率及以序列化形式进行全局参数优化和解码的特点,解决了其他判别式模型中难以避免的标记偏见问题。在中文分词领域,条件随机场模型的效果优于隐马尔科夫模型和最大熵马尔科夫模型。
(2)概率图模型。概率图模型是一种利用图的结构来表达随机变量之间条件独立性的概率模型,图中的每个节点表示随机变量,节点之间的边则表示随机变量之间的依赖关系。图中的边可以是有向的或者无向的,有向的则称为概率有向图模型,无向的则称为概率无向图模型。概率有向图模型如图3-4所示,通过图的方式将随机变量相互之间的影响关系表示出来:天气状况和环境温度会影响到感冒;感冒是导致头晕的一个因素;边上的权值为影响的概率,也可以理解为两个节点之间的联合概率分布。
图3-4 概率有向图模型
概率无向图模型又被称为马尔科夫随机场,是一种具备马尔科夫性质的随机变量之间的全联合概率分布模型。这里的马尔科夫性质是指当一个随机过程在给定现在状态及所有过去状态的情况下,其未来状态的条件概率分布仅依赖当前状态。
(3)条件随机场模型。在理解了判别式模型及概率图模型之后,可以较好地理解条件随机场模型。条件随机场模型对应一个无向图G=(V, E), Y=Yv|v∈V, Y中的元素与无向图的顶点一一对应。在条件X下,随机变量Yv的条件概率分布符合图的马尔科夫性质,即可称当前(X, Y)是一个条件随机场。
条件随机场模型用于在给定需要标记的观察序列的条件下,计算整个标记序列的联合概率分布。从中文分词的角度来分析,每个词语中的每个字都存在4种可能的状态,分别是词头(Begin)、词中(Middle)、词尾(End)和单字成词(Single),简称B、M、E、S。给定句子中的每个字则被视为条件随机场模型中的观察序列,B、M、E、S是需要对每个字进行标记的状态,整个句子则会形成一个标记序列,条件随机场模型求解的就是句子中字的标记序列的联合概率分布。
采用条件随机场模型进行分词,需要通过如下步骤完成。
(1)准备语料库。准备一个已经分好词的语料库,用于条件随机场模型的参数学习。语料库由大量类似下面的句子组成,词语之间采用空格符分隔。
尽管印尼中央和地方政府已派出上千人的灭火队,但由于该地区长期干旱少雨,所以火势至今未得到有效控制。
(2)语料库特征初步学习。需要在语料库的每个词组中分析出每个字的状态,如“收益”需要改为“收\B益\E”。对语料库中每个分好的词添加状态信息,标记后的语句如下。
尽\B管\E印\B尼\E中\B央\E和\S地\B方\M政\M府\E已\S派\B出\E上\B千\E人\S的\S灭\B火\E队\S , \S但\S由\B于\E该\S地\B区\E长\B期\E干\B旱\E少\S雨\S , \S所\B以\E火\B势\E至\B今\E未\S得\B到\E有\B效\E控\B制\E。\S
使用这样的语料库,即可将中文分词问题转换为序列标注问题,对一个未分词的句子中的每个字进行类似上述的序列标注(标注状态B、M、E、S)即可知道分词结果。例如,对“我们爱中国”进行状态标注后,结果为“我\B们\E爱\S中\B国\E”,表示将句子“我们爱中国”分词为“我们爱中国”。
(3)词语特征学习。词语特征学习是分词过程中非常重要的一步。词语的特征包括如下信息。
第一,针对特定的某个字,它共在语料库中出现的次数。例如,“我”字共在语料库中出现了256次。
第二,针对具体的某个字,计算它的状态为词头(B)、词中(M)、词尾(E)、单字成词(S)的概率。例如,在出现的256次“我”字中,“我”字作为词头的概率值为0.8,作为词中的概率值为0.01,依次计算所有出现的字的状态概率。
第三,针对某个字,计算当它的状态为词头(B)时,它转移到下一个字的状态概率。每个字都有属于自己的状态,但是这个字的后面一个字也有属于自己的状态,那么需要计算从每个字的状态到下一个字的状态(或许是B、M、E、S之一)的概率。例如“我”字,当“我”字的状态为B的时候,在后面跟的字中,状态为B的有0个,状态为M的有10个,状态为E的有20个,状态为S的有0个。依次统计当“我”字的状态为M、E、S的时候,下一个字的状态,此过程计算的是状态之间相互的转移概率。针对4种状态,会形成一个4×4的矩阵,矩阵中的值是它们相互之间的转移概率。
通过前面三个词语特征的学习,我们发现,似乎条件随机场模型与隐马尔科夫模型的方式并不存在太大差异,但是从理论上研究,基于条件随机场模型的分词准确率一定高于基于隐马尔科夫模型的分词准确率。原因在于条件随机场模型会将文本的上下文关系作为分词的一个参考信息。相比隐马尔科夫模型,条件随机场模型还记录了当一个字出现时,它的前一个字及后一个字出现的内容,并以概率的方式记录。
第四,当某个字出现的时候,需要计算该字的下一个字出现的内容,并计算两个字同时出现的概率。例如,状态为B的“我”字,下一个字是“们”的概率为67.9%;状态为S的“我”字,上一个字是“的”的概率为21%;状态为B的“我”字,下一个字是“爱”的概率为17.8%等。记录每个字在4种状态下的上下文关系是非常重要的一步。在这一步中,仅仅记录了上一个字和下一个字的上下文关系,在条件允许的情况下,可以记录上两个字和下两个字的上下文关系或者更多的上下文关系。
(4)开始分词。既然特征已经训练好了,就可以通过已经训练好的参数值实现中文分词了。例如,对用户输入的句子“希腊的经济结构较特殊”进行中文分词处理。
第一步,将“希腊的经济结构较特殊”变成字符数组,即“希”“腊”“的”“经”“济”“结”“构”“较”“特”“殊”。
第二步,取出每个字对应的特征,并根据状态信息绘制字与状态的初始矩阵映射关系表,如表3-4所示。在分词前的初始状态概率为0。
表3-4 字与状态的初始矩阵映射关系表
根据表3-4,既然是矩阵并且要计算矩阵里面的一条路径,那么很容易想到维特比算法。维特比算法是一种动态规划算法。因此,只需计算出“希”字在B、M、E、S下的状态概率,后面的问题即可迎刃而解。
设定矩阵中的值为S, S[字][当前状态]=max(P[上一个字的状态][当前状态]×S[上一个字][任何一种状态])+W前(后)[前(后)一个字的当前状态][当前的字]+R[当前状态概率](备注:R是特征二,P是特征三,W前是特征四的上文部分,W后是特征四的下文部分)。
例如,针对表3-4中的“腊”字,在状态B下的值为:S[腊][B]=max(P[B] [B]×S[希][B], P[M][B]×S[希][M], P[E][B]×S[希][E], P[S][B]×S[希][S])+W前[希_B] [腊]+W后[的_B][腊]+R[B]。同理可以计算S[腊][M]、S[腊][E]、S[腊][S]。依次类推,可以计算出后面其他字的情况。由于“希”字出现在首字,不存在其他状态转移到其状态的概率,因此,S[希][B]=W前[_B][希]+W后[腊_B][希]+R[B],依次计算出“希”字的其他值。计算后的矩阵值如表3-5所示。
表3-5 字与状态对应关系计算后的矩阵值
在表3-5中,在所有值的后面都有一个小括号,里面存放的是路径,也就是这个值是通过上一个字的其中某一个状态概率计算而来的(因为有计算max的过程就会有路径选择),记录下来之后,便于路径回溯。
在得到这个矩阵之后,分词系统只需将“殊”中的最大值取出,即1.1867425360549322对应的状态是E(End),来自上一个字的状态0,也就是“特”字的状态B(Begin),再次查看“特”字来自上一个字“较”的状态S(Single)。依次进行路径回溯,得到标注后的状态为“希\B腊\E的\S经\B济\E结\B构\E较\S特\B殊\E”,转换成分词结果就是“希腊的经济结构较特殊”,完成分词过程。
虽然基于条件随机场模型已经可以完成中文分词了,但是往往也会利用词库辅助分词,原因在于采用词库分词的方式可以灵活地对分词结果进行改变,而采用基于条件随机场模型的分词方式,若要手动改变一个分词结果则相对较困难。
3.2.4 分词粒度
一个分词器没有绝对的优劣,不同的评价标准也会导致评价结果不一致。并且分词本身也是具有歧义的,由于分词粒度不一致,大家对分词结果的评价也会不一致。例如“国家科学技术委员会”,粗粒度分为“国家科学技术委员会”,细粒度则分为“国家科学技术委员会”,在两种不同分词粒度下的结果均可视为正确的分词结果。但如果因为分词粒度导致实际效果和期望效果不一致,则会对搜索引擎有一定的影响。
分词粒度对搜索引擎的影响是:分词粒度越大,则分词后的词数量越多,会间接导致索引存储量越大,搜索展示结果越多,进一步导致搜索结果的相关性越差;反之,分词粒度越小,则最终得到的词数量越少,也使得索引存储量越小,也会间接导致搜索展示结果偏少,但搜索结果的相关性较好。
除减少分词粒度导致的分词结果不一致之外,还需要减少分词的歧义。例如,对句子“湖南省长沙河镇长”的分词结果可能为“湖南省长沙河镇长”或者“湖南省长沙河镇长”,这样的分词结果很可能导致搜索结果相关性较差。类似的还有“张三打死狗”“重庆市长江大桥”“羽毛球拍卖完了”等。