1. NLP
- NLP四大任务
- NLP预处理流程
- 语料库
通过不同的途径获取到了想要的语料库。 - 文本清洗
因为很多的语料数据是无法直接使用的,其中包含了大量的无用符号、特殊的文本结构。 - 分词
中文分词和英文分词有很大的不同,英文是使用空格作为分隔符,所以英文分词基本没有什么难度。而中文是字与字直接连接,中间没有任何的分隔符,但中文是以“词”作为基本的语义单位,很多NLP任务的输入和输出都是“词”,所以中文分词的难度要远大于英文分词。中文分词是一个比较大的课题,相关的知识点和技术栈非常丰富,可以说搞懂了中文分词就等于搞懂了大半个NLP。 - 标准化
标准化是为了给后续的处理提供一些必要的基础数据,包括:去掉停用词、词汇表、训练数据等等。具体任务具体分析。 - 特征提取
为了能够更好的训练模型,我们需要将文本的原始特征转化成具体特征,转化的方式主要有两种:统计(TF-IDF等)和Embedding。
- 语料库
2. 中文分词背景
2.1 分词意义
英语等西方语言天然由空格分开,分词很容易。和大部分西方语言不同,书面汉语的词语之间没有明显的空格标记,句子是以字串的形式出现。因此对中文进行处理的第一步就是进行自动分词,即将字串转变成词串。
比如“中国建筑业呈现新格局”分词后的词串是 中国/建筑业/呈现/新/格局。
为什么中文分词如此重要?因为它是处理中文的语义分析,文本分类,信息检索,机器翻译,机器问答等问题的基础。如果分词效果不好,有可能会严重影响到后续的研究。
2.2 分词关键点
- 粒度,不同应用对粒度的要求不一样,比如“苹果手机”可以是一个词也可以是两个词
- 歧义,比如“下雨天留人天留我不留”
- 未登录词,比如“skrrr”、“打call”等新兴词语
3. 中文分词模型
- 传统的基于词典匹配的机械分词,包括最大匹配分词(FMM、RMM等),最短路径分词,N-gram model分词等。
- 基于标注的机器学习算法,包括HMM(隐马尔科夫模型),MEMM(最大熵马尔科夫模型),CRF(条件随机场)等。
- 基于理解的深度学习算法,包括CNN,LSTM,BiLSTM-CRF,BERT-CRF等等。
其中,基于标注的机器学习算法和深度学习算法被统称为统计分词方法
3.1 基于匹配的词典分词
3.1.1 最大匹配分词
正向最大匹配
正向最大匹配法,顾名思义,对于输入的一段文本从左至右、以贪心的方式切分出当前位置上长度最大的词。分词前 分词后 就读北京大学 就读,北京大学 研究生命起源 研究生,命,起源 逆向最大匹配
跟正向最大匹配的唯一不同是分词顺序变为从右到左。分词前 分词后 研究生命起源 研究,生命,起源 项目的研究 项,目的,研究 双向最大匹配
同时执行正向和逆向最大匹配,若两者的词数不同,则返回词数更少的那一个。
否则,返回两者中单字更少的那一个。当单字数也相同时,优先返回逆向最长匹配的结果。分词前 分词后 研究生命起源 研究,生命,起源 项目的研究 项,目的,研究
总之,最大匹配分词就是寻找最优组合的方式是将匹配到的最长词组合在一起。先将词典构造成一棵Trie树,也称为字典树。Trie树由词的公共前缀构成节点,降低了存储空间的同时提升查找效率。
词典分词虽然可以在O(n)时间对句子进行分词,但是效果很差,在实际情况中基本不使用此种方法。在成熟的工业界应用上几乎不会直接使用此类方法作为分词模块的实现方法。
3.1.2 最短路径分词
最短路径分词算法首先将一句话中的所有词匹配出来,构成词图(有向无环图DAG),之后寻找从起始点到终点的最短路径作为最佳组合方式。
我们认为图中每个词的权重都是相等的,因此每条边的权重都为1。
在求解DAG图的最短路径问题时,总是要利用到一种性质:即两点之间的最短路径也包含了路径上其他顶点间的最短路径。比如S->A->B->E为S到E到最短路径,那S->A->B一定是S到B到最短路径,否则会存在一点C使得d(S->C->B)<d(S->A->B),那S到E的最短路径也会变为S->C->B->E,这就与假设矛盾了。利用上述的最优子结构性质,可以利用贪心算法或动态规划 两种求解算法。
最短路径分词
基于Dijkstra(狄克斯特拉)算法求解最短路径。该算法适用于所有带权有向图,求解源节点到其他所有节点的最短路径,并可以求得全局最优解。Dijkstra本质为贪心算法,在每一步走到当前路径最短的节点,递推地更新原节点到其他节点的距离。可见最短路径分词算法可以满足部分分词要求。但当存在多条距离相同的最短路径时,Dijkstra只保存一条,对其他路径不公平,也缺乏理论依据。分词前 分词后 他说的确实在理 他,说,的,确实,在理 全切分
将上述所有可能的路径都当作分词结果返回,就是全切分方法。最大概率分词
最大概率分词是最短路径分词的变种,在最短路径中所有边的权重都是1,如果我们把边的权重替换成边对应的词语的概率,把最短路径替换成最大概率路径,分词的算法就变成了最大概率分词了。词语的概率约等于频数除以所有词的总数,由于求最大概率需要用到概率的连乘,把概率替换成对数,连乘就变成了连加。
相比最短路径分词,词典不仅要记载每个词汇,还要记载每个词汇出现的频率。
jieba
的基础分词器使用的就是最大概率分词。N最短路径分词
最短路径分词只返回一个结果,全切分返回所有可能的结果,N最短路径分词是两者的折中,返回路径最短的前N个分词结果。相应地,也有N最大概率分词。N-最短路径分词是对Dijkstra算法的扩展,在每一步保存最短的N条路径,并记录这些路径上当前节点的前驱,在最后求得最优解时回溯得到最短路径。该方法的准确率优于Dijkstra算法,但在时间和空间复杂度上都更大。
3.1.3 N-gram model分词
选取N元语言模型概率最大的分词序列作为分词结果。
语言模型的目的是构建一句话出现的概率p(s),根据条件概率公式我们知道:
\[p(他说的确实在理)=p(他)p(说|他)p(的|他说)...p(理|他说的确实在)\]而要真正计算“他说的确实在理”出现的概率,就必须计算出上述所有形如$p(w_n|w_1…w_{n-1})\quad n=1,…,6$ 的概率,计算量太过庞大,因此我们近似地认为:
\[p(s)=\prod_{i=1}^lp(w_i|w_i...w_{i-1})\thickapprox\prod_{i=1}^lp(w_i\|w_{i-1})\]该模型即为二元语言模型(2-gram model)。类似的,如果只对词频进行统计,则为一元语言模型。由于计算量的限制,在实际应用中n一般取3。
用最短路径分词的算法求解最大概率路径即可。
3.2 基于标注的机器学习算法
与基于词典的分词不同的是,基于字的分词事先不对句子进行词的匹配,而是将分词看成序列标注问题,把一个字标记成B(Begin), I(Inside), O(Outside), E(End), S(Single)。因此也可以看成是每个字的分类问题,输入为每个字及其前后字所构成的特征,输出为分类标记。对于分类问题,可以用统计机器学习或深度学习的方法求解。
机器学习中一般将模型分为两类:生成式模型和判别式模型。
- 生成式模型:对P(X,Y)联合概率进行建模,再由贝叶斯公式计算得到条件概率P(Y|X);
- 判别式模型:直接对后验概率P(Y|X)进行建模,或者说直接学习决策函数Y=F(x)。
3.2.1 HMM分词算法
HMM(隐马尔科夫链模型)是由字构词的方法,其并不依赖于事先编制好的词表,但需要分好词的训练语料。
规定每个字有4个词位:词首 B,词中 M,词尾 E,单字成词 S
X | 我 | 毕 | 业 | 于 | 中 | 南 | 财 | 经 | 政 | 法 | 大 | 学 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Y | S | B | E | S | B | M | M | M | M | M | M | E |
HMM是生成式模型,X是观测序列,Y是隐序列。 \(P(X,Y)=\prod_{t=1}^TP(y_t|y_{t-1})*P(x_t|y_t)\)
- HMM三个基本问题如下,其中$O$为观测序列,$I$为状态序列,$\lambda$为模型,$\pi,A,B$分别为模型参数即初始状态概率、状态转移矩阵、观测概率矩阵:
- Evaluation
概率计算问题:求解观测序列概率$P(O|\lambda)$ - Training
学习问题:极大似然法估计模型参数$\lambda=(\pi, A, B)$ - Recognition
预测问题/解码问题:求解状态序列概率$P(I|O)$
- Evaluation
分词对应其中的解码问题,即根据观测序列预测状态序列。模型参数可以通过对训练语料统计得到,然后使用Viterbi算法求得最大概率对应的状态序列。
jieba
的新词模式就是使用HMM识别未登录词的,具体做法是:针对不在词表中的一段子文本,使用HMM分词,并把HMM的分词结果加入到原始分词结果中。
Viterbi算法
维特比算法是一种动态规划算法。我们要求从时刻0开始,每往前走一个时刻,都要保证是目前为止最优的。但是因为我们要找的是路径,所以还要保存好每次的上一个节点。
3.2.2 CRF分词算法
CRF(条件随机场)为判别式模型,而HMM为生成式模型。
HMM假设了两类特征,一是当前词词性与上一个词词性的关系,一个是当前词语和当前词性的关系,分别对应着转移概率和发射概率。HMM的学习过程就是在训练集中学习这两个概率矩阵。和HMM不同的是,CRF并没有做出上述的假设,CRF使用feature function来更抽象地表达特征,使得他不再局限于HMM的两类特征。一个特征函数可以表示为$f(X,i,y_i,y_{i-1})$。
其中$X$表示input sequence,$i$为当前的位置,$y_i$是当前state,$y_{i-1}$表示前一个state。但是只有在linear CRF中$y_{i-1}$表示前一个state,事实上它可以有更丰富的表达。例如特征函数可以表示当前的state与任意一个observation或者state甚至future state的关系。也就是说,特征方程的存在允许CRF有十分自由的特征表达,$y_{i-1}$可以是$y_{i\pm (1…n)}$。这也就是条件随机场中场所代表的意义。
- 现实应用中,尤其是对标记序列建模时,最常用的是链式结构,即链式条件随机场chain-structured CRF。
- 给定观测变量序列$\pmb X={X_1,X_2,…,X_n}$,链式条件随机场主要包含两种关于标记的团:
- 单个标记变量与$\pmb X$构成的团:${Y_i,\pmb X},i=1,2,…,n$。
- 相邻标记变量与$\pmb X$构成的团:${Y_{i-1},Y_i,\pmb X},i=2,…,n$。
与马尔科夫随机场定义联合概率的方式类似,条件随机场使用势函数和团来定义条件概率$P(\pmb Y|\pmb X)$。
采用指数势函数,并引入特征函数feature function
,定义条件概率: \(P(\pmb Y|\pmb X)=\frac1Zexp(\sum_{j=1}^{K_1}\sum_{i=2}^{n}\lambda_jt_j(Y_{i-1},Y_i,\pmb X,i)+\sum_{k=1}^{K_2}\sum_{i=1}^n\mu_ks_k(Y_i,\pmb X,i))\)其中:
- $t_j(Y_{i-1},Y_i,\pmb X,i)$为已知观测序列下的转移特征函数
transition feature function
,它刻画了相邻标记变量间的相关关系,同时位置变量$i$也对势函数有影响,比如:已知观测序列情况下,相邻标记取值(代词,动词)
出现在序列头部可能性高,而(动词,代词)
出现在序列头部的可能性低。 - $s_k(Y_i,\pmb X,i)$为已知观测序列下的标记位置$i$上的状态特征函数
status feature function
。它刻画了观测序列$\pmb X$对标记变量的影响。同时位置变量$i$也对势函数有影响,比如:已知观测序列情况下,标记取值名词
出现在序列头部可能性高,而动词
出现在序列头部的可能性低。 - $\lambda_j,\mu_k$为参数,$Z$为规范化因子(确保上式满足概率定义)。$K_1$为转移特征函数个数,$K_2$为状态特征函数个数。
- $t_j(Y_{i-1},Y_i,\pmb X,i)$为已知观测序列下的转移特征函数
- 特征函数同时是实值函数,用来刻画数据可能成立或者预期成立的经验特性。一个特征函数例子(词性标注): \(t_j(Y_{i-1},Y_i,\pmb X,i) = \begin{cases} 1, & if \quad Y_i=[P],Y_{i-1}=[V] \; and \; X_i=knock\\ 0, & otherwise\end{cases}\)
\(s_k(Y_i,\pmb X,i)=\begin{cases} 1,& if \quad Y_i=[V] \; and \; X_i=knock\\ 0,& otherwise \end{cases}\)- 转移特征函数刻画的是:第$i$个观测值$X_i$为单词
knock
时,相应的标记$Y_{i-1}$和$Y_i$很可能分别为[V]
和[P]
。 - 状态特征函数刻画的是:第$i$个观测值$X_i$为单词
knock
时,标记$Y_i$很可能为[V]
。
- 转移特征函数刻画的是:第$i$个观测值$X_i$为单词
- $P(\pmb Y|\pmb X)$形式上类似逻辑回归。事实上,条件随机场是逻辑回归的序列化版本。
- 简化版: \(score(\pmb X, y)=\sum_{i=0}^nA_{y_i,y_{i+1}}+\sum_{i=1}^nP_{i,y_i}\)
正确路径分数 = 标签序列转移分数之和 + 观测序列与标签序列之间的发射概率之和。
\(P(y|\pmb X)=\dfrac{e^{score(\pmb X,y)}}{\sum_{\tilde y\in \pmb Y}e^{score(\pmb X,\tilde y)}}\)
正确路径分数的概率值,我们训练的目的其实就是:最大化似然概率$P(y|\pmb X)$
3.3 基于理解的深度学习算法
相对于机器学习而言,深度学习算法无需人工进行特征选择,还可以有效地保留长距离句子信息。
在NLP中,最常用的神经网络为循环神经网络(RNN,Recurrent Neural Network),它在处理变长输入和序列输入问题中有着巨大的优势。LSTM为RNN变种的一种,在一定程度上解决了RNN在训练过程中梯度消失和梯度爆炸的问题。双向(Bidirectional)循环神经网络分别从句子的开头和结尾开始对输入进行处理,将上下文信息进行编码,提升预测效果。
3.3.1 BiLSTM-CRF模型
Embedding层:主要有词向量、字向量以及一些额外特征。
双向LSTM层:特征抽取器。
最后的CRF层:做句子级别的标签预测。
维度:[b, seq_len, embedding_dim]=>[b, seq_len, hidden_size]=>[b, seq_len, tags_num]
在BILSTM-CRF中,BILSTM 的预测结果(状态数×序列长度)作为发射矩阵。转移矩阵则对应于CRF层内的可训练权重。
损失函数:训练过程中的损失函数类似于Softmax,其中分子为正确路径的得分,分母为全部路径的得分和(每条路径的得分)。求分母时不需要全部枚举然后再计算分数和,可采用动态规划的思想(类似于Viterbi,但是其中的一步不取最大值,而是取和。),进而迭代求和。
预测时采用Viterbi算法。CRF预测的本质其实就是为输入的序列进行标注,也就是给定观测序列,预测其状态序列,与HMM的预测问题一致,均用Viterbi。
问题:为什么HMM中的转移概率和发射概率,在计算的过程中都是以连乘的形式出现,而CRF中的转移矩阵和发射矩阵在计算损失时是连加的形式?
回答:本质不同。HMM中的三种概率矩阵/向量,所表示的含义就是“概率”的意义,当计算联合概率时自然需要相乘。而CRF中的转移矩阵和发射矩阵实际上表示的是“分数”,或者理解为特征函数的加权系数,每一条路径的得分是由不同特征函数的结果累加得到的,因此路径的得分是“分数累加”的形式。
- BiLSTM-CRF为什么比单独BiLSTM、CRF的效果好,两者的作用分别是什么?
- CRF,需要设计特征工程,结果的优劣与特征的选取有很大关联。
- BiLSTM,就像深度学习这个黑盒子那样,可以很好的学习到特征,但是在学习和预测时,无法考虑到语法以及句子中各词之间的相关性,比如I-PER标签不可能跟在B-LOC之后。
- BiLSTM-CRF,结合了各自的优点:BiLSTM可以很好的学习到特征,CRF可以考虑相邻标签之间的关系,计算整个句子的标签的条件概率,自动学习到句子的约束条件。
- CRF与Softmax的差别是什么?
- softmax将序列标注看成是n个k分类问题,即完全不考虑序列中各词之间的相关性
- CRF 将序列标注看成是1个$k^n$分类问题,计算的是条件概率
3.3.2 BERT-BiLSTM-CRF和BERT-CRF模型
2015-2019年,BiLSTM-CRF为序列标注效果最好的方法。BERT提出后,BERT-CRF等方法开始出现。
- BERT是谷歌于2018年10月公开的一种自然语言处理方法。该方法一经发布,就引起了学术界以及工业界的广泛关注。在效果方面,BERT刷新了11个NLP任务的当前最优效果,该方法也被评为2018年NLP的重大进展以及NAACL 2019的best paper。BERT和早前OpenAI发布的GPT方法技术路线基本一致,只是在技术细节上存在略微差异。两个工作的主要贡献在于使用预训练+微调的思路来解决自然语言处理问题。以BERT为例,模型应用包括2个环节:
- 预训练(Pre-training),该环节在大量通用语料上学习网络参数,通用语料包括Wikipedia、Book Corpus,这些语料包含了大量的文本,能够提供丰富的语言相关现象。
- 微调(Fine-tuning),该环节使用“任务相关”的标注数据对网络参数进行微调,不需要再为目标任务设计Task-specific网络从头训练。
模型结构
BERT-BiLSTM-CRF与BiLSTM-CRF结构一样,只是把输入BiLSTM的Embedding换成了BERT的输出向量。
BERT-CRF就是把Bi-LSTM换成了BERT。
同理,可以使用其变种RoBERTa,DistilBert,AlBert来替代Bert。
3.3.3 多任务
比如Cascade,把NER中拆成两个任务,一个用来识别实体,另一个用来判断实体类型。
3.3.4 多特征
在原本字级别的序列标注任务上加入词级别的表征。
3.3.5 对抗训练
对抗式方法解决多标准下的中文分词问题。将不同标准的语料库一起利用起来,进行多任务联合训练,通过对公共特征的学习,帮助提升各个子任务的分词性能。
参考资料:
https://zhuanlan.zhihu.com/p/92102484
https://zhuanlan.zhihu.com/p/50444885
https://zhuanlan.zhihu.com/p/33261835
https://zhuanlan.zhihu.com/p/58688732
https://www.zybuluo.com/zakexu/note/1653490
http://mantchs.com/2020/02/04/Introduction-NLP/
https://www.bookstack.cn/read/huaxiaozhuan-ai/spilt.4.a1c8cb11a2e246b2.md
https://turingtopia.com/article/details/c46f251aa243416e8a9cde6ed17c0ec5
唐琳,郭崇慧,陈静锋. 中文分词技术研究综述*[J]. 数据分析与知识发现, 2020, 4(2/3): 1-17.