从事了两年多的NLP研究工作,平时忙于工作,难以静下心来写技术博客。由于疫情的原因,总算有太多的空闲时间来自由安排自己的学习生活,对落下的东西做点补偿吧。随着学习和工作的积累,打算从NLP的基础工作开始,包括分词、词性标注、命名实体识别、句法分析等,这些技术是NLP上层应用的基础,在工作中,发现很多从业人员缺少对这些工作的重视,尽管深度学习很火,如果对底层技术认识不够,很难做到对上层应用的改善。本文出于这样的目的,对自己所学做以总结。

        分词通常是NLP工作的第一步,当然在这里指的是已经做过数据清洗的文本。本系列以中英文为研究对象,进行展开说明。不论是中文还是英文,要对语言进行量化,分词必不可少,但中文分词难度远高于英文,因此也有人调侃拉丁语系(如英文、法文等)没有分词。那么中文分词难点是什么呢?主要有3点:①分词的规范性;分词规范严格来讲,没有标准,因为对于汉字而言,单个字便具有独特的含义,字的组合又会表现出不同的含义,主观性较强。②切分歧义;汉语受到语境的影响,不同的切分在不同的语境下表现出不同的含义。③词表规模;NLP任务很重要的工作便是词典的构建,很多基于词典的分词方法,往往会由于词典规模受限,而得不到理想的切分效果,因此,很多工具都提供了自定义加载词典功能,以提高切分效果,比如jieba工具。

        了解了分词的难点后,那么为什么要进行分词呢?很多人很少思考这个问题,仅仅把分词当做一个流程。语言是人类区别于其他生物的标志。词是最基本的能够表示事物含义的语言单位,计算机无法识别文字符号,只有对文字符号进行编码,才能进一步处理。有了分词,便可以进一步运用数学方法来解决问题。

        目前,常用的分词算法分为3类:基于词表的分词算法、基于经典机器学习方法的分词算法、基于深度学习的分词算法。

        基于词表的分词算法包括前向最大匹配法、后向最大匹配法、双向最大匹配法。基于词表的分词算法会有一个超参数,称之为窗口,指的是在该窗口大小下,和词表中的词进行匹配,如果没匹配上,则缩小窗口的大小。对于前向最大匹配法:比如给定词典:{我,爱,与,喜欢,自然,语言,处理,自然语言,自然语言处理,人工智能,智能,机器学习,机器,学习},给定一句话“我喜欢自然语言处理与机器学习”,设定窗口等于6,下面“[]”括起来的表示窗口内:

“[我爱自然语言]处理与机器学习”,发现词典中没有“我爱自然语言”,缩小窗口,“[我爱自然语]言处理与机器学习”,发现“我爱自然语”也没有,继续缩小窗口,“[我爱自然]语言处理与机器学习”,同样没有,依次类推,最后切分结果“我/爱/自然语言处理/与/机器学习”。

对于后向最大匹配法:比如给定词典:{我,爱,与,喜欢,自然,语言,处理,自然语言,自然语言处理,人工智能,智能,机器学习,机器,学习},给定一句话“我喜欢自然语言处理与机器学习”,设定窗口等于6,下面“[]”括起来的表示窗口内:

“我爱自然语言处[理与机器学习]”,发现词典中没有“理与机器学习”,缩小窗口,“我爱自然语言处理[与机器学习]”,发现“与机器学习”也没有,继续缩小窗口,“我爱自然语言处理与[机器学习]”,这时发现“机器学习”在词典中有,切分成功,继续余下的内容,依次类推,最后切分结果“我/爱/自然语言处理/与/机器学习”。

双向最大匹配算法是将前向最大匹配得到的分词结果和后向最大匹配得到的分词结果进行比较,从而决定正确的分词结果。它采用了一种启发式的思想:①如果前向和后向的分词结果词数不同,则取分词数量较少的那个。②如果分词结果词数相同,在这样的条件下:a、分词结果相同,就说明没有歧义,可返回任意一个。b、分词结果不同,返回其中单字较少的那个。

        基于经典机器学习的分词算法主要包括:基于N-gram语言模型的分词算法、基于HMM的分词算法、基于CRF的分词算法等等。基于N-gram语言模型的分词算法的核心思想是从多个候选切分中,选择概率最大的切分。比如对于“我爱机器学习”,选择bi-gram二元语言模型,假设有三种候选切分(其实可以产生很多切分,这里仅仅举例而已):“我/爱/机器/学习”,“我/爱机器/学习”,“我/爱/机器学习”。那么分别计算P(我/爱/机器/学习)=P(我)P(爱/我)P(机器/爱)P(学习/机器)、P(我/爱机器/学习)=P(我)P(爱机器/我)P(学习/爱机器)、P(我/爱/机器学习)=P(我)P(爱/我)P(机器学习/爱)三个值的大小。而这些值也称之为参数,是可以根据原始语料计算出来的,比如P(机器学习/爱)=P(爱,机器学习)/P(爱)=count(爱,机器学习)/count(爱)。这样选择概率最大的切分结果即可。

对于基于HMM的分词算法,实质上是将分词作为一项序列标注任务,虽然与基于词表的方法相比,不依赖于事先建好的词表,但是仍然需要分好词的训练语料。规定4个标注符号:词首B、词中M、词尾E、单字词S。

对于"我爱机器学习":

X







Y

S

S

B

M

M

E

HMM是一个生成式模型,X为观测序列,Y为隐状态序列。

nlp分词 单词 词性 英文表达 分词理论_机器学习

以下为图模型:

nlp分词 单词 词性 英文表达 分词理论_最大匹配_02

 

基于CRF的中文分词算法与基于HMM的分词算法,方法相似,不过原理有本质不同,CRF属于判别式模型,通过定义条件概率P(Y|X)来描述模型。同样定义词位:词首B,词中M,词尾E,单字词S。CRF分词的过程就是对词位标注后,将B和E之间的字,以及S单字构成分词。对于原始例句:我爱机器学习;CRF标注后:我/S 爱/S 机/B 器/M 学/M 习/E。分词结果:我/爱/机器学习。

整个目标函数为:

nlp分词 单词 词性 英文表达 分词理论_自然语言处理_03

其中S表示整个句子,l表示词位,i表示位置信息,f()表示特征函数。整个图模型表示如下:

 

nlp分词 单词 词性 英文表达 分词理论_深度学习_04

 基于CRF的分词方法采用了机器学习算法CRF,不仅考虑了词语出现的频率信息,同时考虑了上下文语境,具有较好的学习能力,而且是对基于HMM方法的一种改进。但缺点在于计算量大,时间长,算法复杂,需要设置特征模板。

        基于深度学习的分词算法,其核心思路是将深度学习模型和经典机器学习算法进行结合,利用深度学习模型进行特征提取,再利用机器学习算法进行分词。典型的框架为BiLSTM+CRF,如下图所示:

nlp分词 单词 词性 英文表达 分词理论_nlp分词 单词 词性 英文表达_05

 输入层是一个embedding层,经过双向LSTM进行特征学习,输出层为CRF层。详细内容参考博客

本文主要总结了分词方法相关的理论,后期有空会补上代码实战,希望能够帮到大家。