中文分词|Chinese-word-segmentation (1)

背景

中文文本中词与词之间没有明确的分割标记,而是以连续字符串形式呈现。所以,任何中文自然语言处理任务都必须解决中文序列切分的问题——中文分词。当然对于英文等语言来说自带分隔符,不需要分词。但在英语手写字识别时,由于分隔符没有那么明显,因此也需要使用类似中文分词的技术。

事实上不同的人对于同一个句子的分词结果并不一定相同,因此将机器分词的结果与人工分词的结果进行比对时,一个98%准确率的分词器与一个99%的分词器很难比较谁效果更好。在中文自然语言处理任务中,诸如机器翻译,自动问答,语音识别等任务,都需要分词技术做支撑。但是对于不同的子任务,分词的细粒度要求也不一样,尤其是对于一些复合词。比如在机器翻译时,清华大学就应该以整个“清华大学”而不是“清华-大学”。可以说中文分词在工程上是一项需要与任务要求紧密结合的技术。

中文分词存在两个难点,一是歧义,二是未登录词(OOV-out of vocabulary)。语言的歧义性一直伴随着语言学的发展进程,也自然限制着NLP技术。另一方面,词典的选择诸如词典中的复合词选择和词典的大小也影响着中文分词任务。举个直观的例子,对于Baidu搜索引擎的分词模型来说,基于人民日报的词典和基于用户搜索数据的词典得到的模型表现就会有很大差异。

分词方法的演变

基于匹配的词典分词

基于匹配的词典分词是非常自然的想法,我们根据词典扫描一个句子,遇到词典中出现过的词就进行分割,这类方法又被称为机械分词。这类方法简单易实现,而且能取得不错的效果,其主要问题包括如何构建一个完备的词典、如何设计高效的匹配算法、匹配中出现的歧义切分。
常见的匹配算法包括:

  • 正向最大匹配法
  • 逆向最大匹配法
  • 双向最大匹配法
  • 最少切分
  • ......

最大匹配法从句子中寻找长词条进行查字典,若查不到则去掉最后一个字直到找到为止。其中双向最大匹配分别从左到右和从右到左进行两次扫描。最小切分则是寻找使每一个句子切出的词数量最少。

基于标注的机器学习算法

不同于基于匹配的机械分词,基于统计语言模型的分词技术有效提高了分词的准确率。其中基于标注的机器学习算法将中文分词转化为字序列标注问题。,B表示开始位置、M表示中间位置、E表示结束位置及S表示单字构词。机器学习算法 需要人工设计特征模板,指定窗口的大小。由于算法的复杂度以及对分词结果准确度要求等原因,窗口大小一般不超过5。下面介绍几个具有代表性的模型:

  • 隐马尔可夫模型(HMM)隐马尔可夫不是一个复杂的数学模型,但能解决大多数自然语言处理问题。其基本的思想是根据观测值序列找到隐状态值序列。在中文分词中,一段文字的每个字符可以看作是一个观测值,而这个字符的位置标签(BEMS)可以看作是隐状态。使用HMM的分词,通过对切分语料库进行统计,可以得到模型中5大要要素:起始概率矩阵,转移概率矩阵,发射概率矩阵,观察值集合,状态值集合。有了三个矩阵和两个集合后,HMM问题最终转化成求解隐藏状态序列最大值的问题,求解这个问题最常使用的是Viterbi算法。

  • 最大熵马尔可夫模型(MEMM)把HMM模型和maximum-entropy模型的优点集合程一个产生式模型,这个模型允许状态转移概率依赖于序列中彼此之间非独立的特征上,从而将上下文信息引入到模型的学习和识别过程中,提高了识别的精确度。

  • 条件随机场(CRF)是用来标注和划分结构数据的概率化结构模型。和HMM类似,当对于给定的输入观测序列\(X\)和输出序列\(Y\),CRF通过定义条件概率\(P(Y|X)\),而不是联合概率分布\(P(X,Y)\)来描述模型。MEMM模型对每个节点进行独立归一化,存在偏置问题。条件随机场(CRF)结合了多方面优势,对所有特征进行全局归一化,避免了偏置问题,成为传统机器学习中应用最多、最具代表性的模型算法之一。条件随机场能够获得更高的分词准确率,但模型复杂导致分词效率略低。

基于理解的深度学习算法

深度学习模型诸如CNN、GRU、LSTM、BiLSTM被引入中文分词,相对于机器学习而言,深度学习算法无需人工进行特征选择。在基础深度学习模型的基础上,有效结合预训练和后处理方式已成为深度学习的一种趋势,一般性流程如下图所示。 预训练既可以根据领域需要和任务特点进行预训练,也可以直接使用现有的预训练结果进行微调。中文分词预训练的基本单位是词(字)的语义、偏旁、拼音和输人法等。语义表示的预训练模型包括与上下文无关的静态词向量训练模型Word2Vec、Glove以及与上下文相关的动态词向量训练模型ELMo、BERT、XLNet等。
近几年的中文分词主要分为两类,一个是基于字符的中文分词(根据字所在词的位置,对每个字打上标签),一类是基于词的中文分词。

分词工具

jieba

jieba库是一个简单实用的中文自然语言处理分词库,属于概率语言模型分词。
jieba自带一个dict.txt的词典, 里面有2万多条词, 包含了词条出现的次数和词性。将句子根据给定的词典进行查词典操作, 生成所有可能的句子切分,而后根据动态规划查找最大概率路径, 找出基于词频的最大切分组合。对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。
(jieba分词对“自然语言处理”的分词结果为 自然语言|处理)

LTP

LTP是哈工大开源的一套中文语言处理系统,涵盖了基本功能:分词、词性标注、命名实体识别、依存句法分析、语义角色标注、语义依存分析等。LTP基于结构化感知器(Structured Perceptron,SP)属于基于字符的分词模型,以最大熵准则建模标注序列\(Y\)在输入序列\(X\)的情况下的score函数,分词结果则等同于最大score函数所对应的标注序列。 \[ S(Y, X)=\sum_{s} \alpha_{s} \Phi_{s}(Y, X) \] \(\Phi_{s}(Y, X)\)为特征函数,分词流程为先提取字符特征,计算特征权重值,然后Viterbi解码。

THULA

THULA(THU Lexical Analyzer for Chinese)为清华大学推出的中文词法分析工具包,具有中文分词和词性标注功能,其原理与LTP非常相似,在字符特征选择方面有所不同。
测试发现THULA没有针对python3.8进行维护,因此只支持3.7-版本。

Stanford CoreNLP

CoreNLP的中文分词基于CRF模型: \[ P_{w}(y \mid x)=\frac{\exp \left(\sum_{i} w_{i} f_{i}(x, y)\right)}{Z_{w}(x)} \]

\(f_{i}(x, y)\)为特征函数,\(w\)为模型参数。不同于其他分词器采用B、M、E、S四种label来做分词,CoreNLP的中文分词label只有两种,“1”表示当前字符与前一字符连接成词,“0”则表示当前字符为另一词的开始——换言之前一字符为上一个词的结尾。

I do not accept rewards, but you can donate to the public welfare of China.
0%