在上一部分中,我们介绍了NLP领域中的一个基本问题:序列标注问题,并对解决该问题的三种方法:HMM、CRF、RNN+CRF进行了介绍。
在这一部分中,我们将在语言结构层面对词法分析进行介绍。
在了解了NLP架构之后,一定还记得这样一张图:
现在,我们已经了解了自然语言研究层面的基本概念:语言模型、序列标注,下一步就是对“词”的分析和处理。
还是那句话,规则法、概率统计法、深度学习法都只是处理NLP问题的方法,归根结底最重要的还是NLP问题。
1. 词法分析
词是最小的能够独立运用的语言单位,因此,词法分析是其他一切自然语言处理问题(例如:句法分析、语义分析、文本分类、信息检索、机器翻译、机器问答等)的基础,会对后续问题产生深刻的影响。
而词法分析的任务就是:将输入的句子字串转换成词序列并标记出各词的词性。
值得注意的是,这里所说的“字”并不仅限于汉字,也可以指标点符号、外文字母、注音符号和阿拉伯数字等任何可能出现在文本中的文字符号,所有这些字符都是构成词的基本单元。
从形式上看,词是稳定的字的组合。
很明显,不同的语言词法分析具体做法是不同的。
以英语和汉语为例作为对比:
对于中文词法分析而言,具体任务如下图所示:
以句子:“警察正在详细调查事故原因” 为例。
中文分词词法分析包括两个主要任务:
- 自动分词:将输入的汉字串切成词串
- 词性标注:确定每个词的词性并加以标注
两个任务分别面临着一些问题:
- 自动分词:歧义问题、未登录词问题、分词标准问题
- 词性标注:词性兼类歧义问题
(这些问题的具体含义我们将在后文进行介绍)
处理这些问题的方法依然有三种:规则法、概率统计法、深度学习法。
在这里,值得注意的是,由于不同的方法有其不同的优势和短板,因此,一个成熟的分词系统,不可能单独依靠某一种算法来实现,而需要综合不同的算法来处理不同的问题。
2. 自动分词面临的问题
上面我们提到,自动分词面临着三个问题:歧义问题、未登录词问题、分词标准问题,下面我们将对它们一一进行解释。
2.1 歧义
这里的歧义指的是切分歧义:对同一个待切分字符串存在多个分词结果。分为交集型歧义、组合型歧义和混合歧义。
2.1.1 交集型歧义
交集型歧义:字串abc既可以切分成a/bc,也可以切分成ab/c。其中,a、bc、ab、c是词。
举个例子:
“白天鹅”——“白天/鹅”、“白/天鹅”;
“研究生命”——“研究/生命”、“研究生/命”
至于具体要取哪一中分词方法,需要根据上下文来推断。
也许对于我们来说,这些歧义很好分辨,但是对计算机而言,这是一个很重要的问题。
针对交集型歧义,提出链长这一概念:交集型切分歧义所拥有的交集串的个数称为链长。
举个例子(朋友们可以自己划分一下,还蛮有趣的):
“中国产品质量”:{国、产、品、质},链长为4;
“部分居民生活水平”:{分、居、民、生、活、水},链长为6.
2.1.2 组合型歧义
组合型歧义:若ab为词,而a和b在句子中又可分别单独成词。
举个例子:
“门把手弄坏了”——“门/把手/弄/坏/了”、“门/把/手/弄/坏/了”
“把手”本身是一个词,分开之后由可以分别成词。
2.1.3 混合歧义
混合歧义:以上两种情况通过嵌套、交叉组合等而产生的歧义。
举个例子:
“这篇文章写得太平淡了”,其中“太平”是组合型歧义,“太平淡”是交集型歧义。
通过上面的介绍可以看出,歧义问题在汉语中是十分常见的。
2.2 未登录词
未登录词是指:词典中没有收录过的人名、地名、机构名、专业术语、译名、新术语等。该问题在文本中的出现频度远远高于歧义问题。
未登录词类型:
- 实体名称:汉语人名(张三、李四)、汉语地名(黄山、韩村)、机构名(外贸部、国际卫生组织);
- 数字、日期、货币等;
- 商标字号(可口可乐、同仁堂);
- 专业术语(万维网、贝叶斯算法);
- 缩略语(五讲四美、计生办);
- 新词语(美刀、卡拉OK)
未登录词问题是分词错误的主要来源。
2.3 分词标准
对于 “汉语中什么是词” 这个问题,不仅普通人有词语认识上的偏差,即使是语言专家,在这个问题上依然有不小的差异。
“缺乏统一的分词规范和标准” 这种问题也反映在分词语料库上,不同语料库的数据无法直接拿过来混合训练。
3. 自动分词技术方法
在了解自动分词所面临的问题之后,我们再来介绍进行自动分词的技术方法。基本方法还是三种:规则法、概率统计法、深度学习法。
3.1 基于字典、词库匹配的分词方法(机械分词法)
该类算法是按照一定的策略将待匹配的字符串和一个已建立好的“充分大的”词典中的词进行匹配,若找到某个词条,则说明匹配成功,识别了该词。
基于词典的分词算法在传统分词算法中是应用最广泛、分词速度最快的一类算法。
其优点是实现简单、算法运行速度快;
缺点是严重依赖词典,无法很好的处理分词歧义和未登录词。
这类方法主要有:
- 正向最大匹配法(从左到右)
- 逆向最大匹配法(从右到左)
- 最少切分法(使每一句中切出的词数最少)
- 双向最大匹配法(进行从左到右、从右到左两次扫描)
3.1.1 最大匹配法
基本思想:先建立一个最长词条字数为
L
L
L 的词典,然后按正向(逆向)取句子前 LLL 个字查词典,如查不到,则去掉最后一个字继续查,一直到找着一个词为止。
最大匹配算法以及其改进方案是基于词典和规则的。其优点是实现简单,算法运行速度快,缺点是严重依赖词典,无法很好的处理分词歧义和未登录词。
举个例子:“他是研究生物化学的”(假设词典中最长词条字数为7)
正向结果:“他/是/研究生/物化/学/的”
逆向结果:“他/是/研究/生物/化学/的”
3.1.2 最少分词法(最短路径法)
基本思想:假设待切分字串为: S = c 1 c 2 . . . c n S=c_1c_2...c_n S=c1c2...cn,其中 c i c_i ci为单个字,串长为 n ( n ≥ 1 ) n (n≥1) n(n≥1)。建立一个结点数为 n + 1 n+1 n+1 的切分有向无环图 G G G,若 w = c i c i + 1 . . . c j ( 0 < i < j ≤ n ) w=c_ic_{i+1}...c_j(0<i<j≤n) w=cici+1...cj(0<i<j≤n)是一个词,则在结点 v i − 1 , v j v_{i-1},v_j vi−1,vj 之间建立有向边。从产生的所有路径中,选择路径最短的(词数最少的)作为最终分词结果。
举个例子:“他说的确实在理”
整个过程如下图所示:
具体过程在这里不再赘述,有兴趣的朋友们可以自行查阅相关资料~
从图中我们可以看出,由于每条边的权重都为1,我们可以直接使用Dijkstra算法求取结果。
可能的结果有两种:“他/说/的确/实在/理”、“他/说/的/确实/在理”。
该种方法的优点在于:需要的语言资源(词表)不多;
缺点在于:对许多歧义字段难以区分,最短路径有多条时,选择最终的输出结果缺乏应有的标准;字串长度较大和选取的最短路径数增大时,长度相同的路径数急剧增加,选择正确结果的困难越来越大。
3.2 基于统计的方法
在上述介绍中,我们可以发现,基于规则的方法对歧义问题的解决能力较弱,而基于统计的方法具有较强的歧义区分能力,但需要大规模标注(或预处理)语料库的支持,需要的系统开销也较大。
3.2.1 基于词的分词方法
基于词的生成模型主要考虑词汇之间以及词汇内部字与字之间的依存关系,大部分基于词的分词方法采用的都是生成式模型。
该种分词方法的基本思想很简单:
W
S
e
q
∗
=
a
r
g
m
a
x
W
s
e
q
p
(
W
S
e
q
∣
c
1
c
2
.
.
.
c
n
)
W_{Seq}^*=argmax_{W_{seq}}p(W_{Seq}|c_1c_2...c_n)
WSeq∗=argmaxWseqp(WSeq∣c1c2...cn)
即,找到概率最大的切分。
在这里介绍两种基于词的分词方法:n元语法模型法、改进最短路径法。
3.2.1.1 n元语法模型方法
利用n元语法计算整个句子的概率切分。
举个例子:“研究生物学”
我们利用二元模型进行计算,即:
p
(
s
)
=
p
(
w
1
)
p
(
w
2
∣
w
1
)
p
(
w
3
∣
w
2
)
.
.
.
p
(
w
n
∣
w
n
−
1
)
p(s)=p(w_1)p(w_2|w_1)p(w_3|w_2)...p(w_n|w_{n-1})
p(s)=p(w1)p(w2∣w1)p(w3∣w2)...p(wn∣wn−1)
整个过程如下图所示:
通过这张图,我们可以求得最大概率切分,即为最后的分词结果。
3.2.1.2改进最短路径法(统计粗分模型)
在规则法中,我们介绍了最短路径法,每条边的权重都为1。
改进最短路径法对最短路径法进行了改进,将边的权重改为该词出现频率
p
(
w
i
)
p(w_i)
p(wi),那么最终选取切分结果的标准则变为:
m
a
x
p
(
W
)
=
∏
i
=
1
m
p
(
w
i
)
(1)
max \quad p(W) = \prod_{i=1}^mp(w_i)\tag{1}
maxp(W)=i=1∏mp(wi)(1)
其中, W = w 1 w 2 . . . w m W=w_1w_2...w_m W=w1w2...wm
但是很明显,如果这样的话就没办法用Dijkstra最短路径算法了。
为了解决这个问题,将(1)式改写为如下形式:
令
p
∗
(
W
)
=
−
l
n
[
p
(
W
)
]
=
∑
i
=
1
m
{
−
l
n
[
p
(
w
i
)
]
}
(2)
p^*(W)=-ln[p(W)]=\sum_{i=1}^m\{-ln[p(w_i)]\}\tag{2}
p∗(W)=−ln[p(W)]=i=1∑m{−ln[p(wi)]}(2)
这样,就可以将求 p ( W ) p(W) p(W)的最大值问题转换为求 p ∗ ( W ) p^*(W) p∗(W)的最小值问题,我们所做的,只是将边的权重 p ( w i ) p(w_i) p(wi) 改写为 − l n [ p ( w i ) ] -ln[p(w_i)] −ln[p(wi)],这样,就可以继续用Dijkstra算法进行求解了。
3.2.2 基于字的序列标注分词方法
该种方法利用序列标注的方法进行分词,具体做法如下图所示:
常用的方法与序列标注方法相同,有HMM、CRF、RNN+CRF等。
基于字的序列标注分词方法主要的优势在于能够平衡地看待词表词和未登录词的识别问题,具有较强的歧义区分能力和未登录词识别能力。但需要大规模标注(预处理) 语料库的支持,需要的系统开销也较大,而且训练文本的选择将影响分词结果。
3.3 深度学习法
该种方法主要是利用深度神经网络模型来对中文进行分词,主要用到了RNN、CNN、GNN等深度神经网络来自动地获取特征,从而代替传统方法中手工定义的特征。
将从句子中获取简单的特征改为获取复杂的特征,从单一语料库单一标准的模型改进为可以使用多语料进行分词等等。
模型结构与序列标注问题类似:
由于该部分内容只是序列标注在分词问题中的应用,所以具体细节就不再赘述
4. 词性标注
词性是词汇的基本语法属性,通常称为词类。
上文中我们提到,词性标注遇到的最重要的问题就是词性兼类问题。那么,为什么会有词性兼类问题呢?
其实,在任何一种语言中,词性兼类问题都普遍存在,汉语中尤为明显。造成词性兼类问题的原因主要有以下几点:
- 汉语缺乏词形态变化,无法通过词形变化判别词类;
- 汉语中,常用词兼类现象严重,比如:
“这个人什么都好,就是好酗酒。”
其中,第一个“好”读三声,是形容词,而第二个“好”读四声,是动词。 - 没有统一的汉语词类划分标准,有些语料划分很粗糙。
在这样的背景下,词性标注问题往往被转化为序列标注问题来解决。由于序列标注问题在前面的部分中已经有过介绍,所以在这里就不加以赘述
5. 词法分析评价指标
词法分析中,通常用正确率、召回率、F值来评价系统的性能。
正确率(precision,P):测试结果中正确结果的个数占系统所有输出结果的比例,即 :
P
=
n
N
∗
100
%
P=\frac{n}{N}*100\%
P=Nn∗100%
召回率(recall,R):测试结果中正确结果的个数占标准答案总数的比例,即:
R
=
n
M
∗
100
%
R=\frac{n}{M}*100\%
R=Mn∗100%
F值(F-measure):正确率和召回率的综合值,即:
F
−
m
e
a
s
u
r
e
=
(
β
2
+
1
)
∗
P
∗
R
β
2
∗
P
+
R
∗
100
%
F-measure=\frac{(β^2+1)*P*R}{β^2*P+R}*100\%
F−measure=β2∗P+R(β2+1)∗P∗R∗100%
通常情况下,取
β
=
1
β=1
β=1,称为
F
1
F1
F1值,即:
F
1
=
2
∗
P
∗
R
P
+
R
∗
100
%
F1=\frac{2*P*R}{P+R}*100\%
F1=P+R2∗P∗R∗100%
看过上面的公式之后,大家可能还是觉得一头雾水,我们来举个例子:
假设某个汉语分词系统在一测试集上输出5260个分词结果,而标准答案是4510个词语,根据这个答案,系统切分出来的结果中有4120个是正确的。
那么:
正确率P:
P
=
4120
5260
=
78.33
%
P=\frac{4120}{5260}=78.33\%
P=52604120=78.33%
召回率R:
R
=
4120
4510
=
91.35
%
R=\frac{4120}{4510}=91.35\%
R=45104120=91.35%
F1值:
F
1
=
2
∗
P
∗
R
P
+
R
=
2
∗
78.33
%
∗
91.35
%
78.33
%
+
91.35
%
=
84.34
%
F1=\frac{2*P*R}{P+R}=\frac{2*78.33\%*91.35\%}{78.33\%+91.35\%}=84.34\%
F1=P+R2∗P∗R=78.33%+91.35%2∗78.33%∗91.35%=84.34%
对正确率、召回率、F1值更细节的内容感兴趣的朋友们可以参考博客:机器学习中的一些基本概念,在这里就不再赘述。
值得注意的是,在很多机器学习问题中,都常用这三个值来衡量系统性能。
在本节内容的结尾,再多说一句题外话:
再次强调一下,神经网络仅仅是处理NLP问题的一种方法,绝不是NLP的全部,它在NLP上的成功应用的领域往往是准确率不高或者运行效率很低的场合,例如问答系统、机器翻译、句法分析。在准确率比较高或者运行效率不错的场景下,利用深度学习方法会得不偿失。
这一部分中,我们介绍了NLP领域最基本的一类问题:词法分析。它是其他一切NLP问题的基础,会对后续问题的处理产生很大的影响。
参考文献
[1] https://blog.csdn.net/echoKangYL/article/details/87912509