中文分词是中文自然语言处理的基础,现代语言分析处理算法基本是以词为单位进行计算的。

1、词典匹配
词典匹配是分词最传统最常见的一种办法。即便在后面要提到的基于统计学习的方法中,词表匹配也通常是非常重要的信息来源(以特征函数的形式)。匹配方式可以有正向(从左到右),逆向(从右到左)。对于匹配中遇到的多种分段可能性(segmentation ambiguity),通常会选取分隔出来词的数目最小的。很明显,这种方式对词表的依赖很大,一旦出现词表中不存在的新词,算法是无法做到正确的切分的。但是词表匹配也有它的优势,比如简单易懂,不依赖训练数据,可以做到和下游的应用紧密结合 (机器翻译中的phrase table,TTS中的词典等等),易于纠错等等。还有一类方法通过语料数据中的一些统计特征(如互信息量)去估计相邻汉字之间的关联性,进而实现词的切分。这类方法不依赖词表,具有很强的灵活性,特别是在对生词的发掘方面,但是也经常会有精度方面的问题。所以很多系统会结合基于词表的方法和无词表方法,发挥词表方法的准确性以及在与后段应用结合上的优势,同时利用无词表方法在召回方面的能力。
2、机器学习分词
最近十多年,机器学习的发展非常迅速,新的模型,新的算法层出不穷。中文分词由于其重要性,以及问题的清晰性,成为很多新研究的试验场。因为这方面的内容很多,所以我想尽可能的把主要的模型和方法分为两大类:一类是基于character tagging的,也就是对每一个字单独进行分段信息的标注;还有一类就是基于词的,也就是对词进行整体的标注和建模。基于单个字方法的核心就是对每一个字在其所属词中的位置进行一个标注。对于任何一个字来说,它可以是一个词的开始(Beginning), 一个词的中间(Inside), 一个词的结尾(End),或者本身就是一个单字的词(Singleton),这也就是在序列标注中常用的BIES的分类。这种标注空间(模型状态空间)的划分在其他任务上(如NER)也很常用,也会有一些类似的变种,比如NER中常用的BIO。说到这类方法,就要说到MEMM (Maximum Entropy Markov Model) 和CRF (Conditional Random Field) 。这两个都是discriminative的模型,和generative的模型(比如naive bayes, HMM)相比,在特征函数的定义方面有很大的灵活性。(第二个是MEMM,第三个是CRF,X是句子,Y是位置的标注。)MEMM是一个locally normalized的模型。也就是说在每一个字的位置,其对应的概率分布需要进行归一化,这个模型有一个很有名的label bias的问题,也就是当前的tag完全由前一个tag决定,而完全忽略当前的字本身。CRF则通过全局归一化(global normalization)的方式很好的解决了这个问题。这两个模型都被拿来在分词上试验过(Xue et al. 2003, Peng et al. 2004, Tseng et al. 2005, etc), 取得了不错的效果。这类基于单个字的模型,正如它的名字所暗示,无法直接的去model相邻词之间的相关性,也无法直接看到当前整个词所对应的字符串。具体到MEMM和CRF中特征函数的定义,在当前位置,模型无法抓去到“当前的词”,“两边的词”这样重要的特征,而只能通过基于字的特征去代替。这个往往会造成建模效果与效率的损失。基于词的模型就很好的解决了这个问题。这一块的很多工作会去用类似transition based parsing的办法去解决分词的问题。Transition based parsing是一种渐进式的(incremental),自下而上(bottom-up)的语法分析办法。它一般以从左向右的方式处理逐字处理文本的输入,并在运行过程中通过一个堆栈去保存到当前为止得到的不完整的分词结果,并且通过机器学习的方法去决定如何整合当前的分析结果,或是接收下一个输入去拓展当前的分析结果。具体到分词这个任务上,每一个字输入进来,算法会去决定这个字是去拓展堆栈上已经保存的词,还是开始一个新词。这个算法的一个问题就是堆栈上的保存的到当前位置的分析结果的数量会非常大(到当前为止所有可能的分词结果),所以必须要做pruning保证搜索空间在可控范围内。基于词的模型还有一个方法这里简单提一下(Andrew, 2006),它和刚才说的transition parsing的方法还是很类似的,这个模型就是Semi CRF (Sarawagi & Cohen 2004)。这个模型运用也很多,微软内部很多NER就是用这个模型。它在本质上是一个高阶的CRF,通过扩展state space的方法去模拟segment level的关联性,用到分词上也就是相邻词之间的关联性。和之前的方法要做pruning一样,Semi-CRF在实际应用中也需要限制segment的长度,以控制搜寻最优解的复杂度。
3、深度学习分词
近几年深度学习发展非常快,影响力很大,所以这一块要专门拿出来说一说。和大多数自然语言处理中的任务一样,深度学习也不出意外地被用在了分词上,最近几年也有非常多的相关的论文。和之前说过方法相比,深度学习带来的变化主要是特征的定义与抽取。无论是基于单字的,还是基于词的,最近几年都有这方面的工作。基于单字的,运用deep learning的方法进行NLP领域的序列的标注,其实早在2008年就有人做过(Collobert & Weston 2008)主要的方法是通过神经网络在每一个位置去自动提取特征,并且预测当前位置的标注,最后也可以加一个tag transition模型与神经网络输出的emission模型合并,通过viterbi抽取最佳标注序列。最近几年的进展主要是通过更强大的神经网络去提取更有效的信息,从而实现分词准确率的提高 (Zheng et al. 2013, Pei et al. 2014, Chen et al. 2015, Yao et al.2016, etc)。这个是collobert 2008年的基本版本,最近的工作结构上没有太大偏差。全局归一化的CRF模型也可以通过神经网络去自动提取特征(DNN,CNN,RNN,LSTM,etc),这个在NER上已经有了广泛的应用,也完全可以用在分词这个任务上,这里就不赘述了。之前提到的基于词的transition based的分词最近也有了deep learning领域的拓展,原有的基于线性模型的action模型(延续当前词还是开始新词)也可以通过神经网络去实现,简化了特征的定义,提高了准确率。
4、联合建模法
中文自然语言处理通常会把分词作为一个预处理的过程,所以系统是pipeline形式的,这样带来的一个问题就是error propagation。也就是分词的错误会影响到后面更深层次的语言语义分析,比如POS tagging, chunking, parsing等等。所以在学术界也有很多joint modeling(联合建模)方面的工作,主要目的就是把分词和其他更复杂的分析任务一起进行(Zhang & Clark 2010, Hatori et al. 2012, Qian & Liu 2012, Zhang et al. 2014, Lyu et al. 2016, etc)。最近几年由于神经网络的迅速发展,其强大的特征学习能力也大大简化了对多个任务进行联合建模时在特征选取方面所要做的工作。联合建模的一大好处是分词与其他任务可以共享有用的信息,分词的时候也会考虑到其他任务的要求,其他任务也会考虑各种分词的可能性,全局上可以取得最优解。但是随之而来问题是搜索的复杂度往往会显著提高:需要更有效的pruning机制在控制复杂度的同时,不对搜索的结果产生显著影响。
网友评论