自动分词技术方法
进行自动分词的技术方法。基本方法还是三种:规则法、概率统计法、深度学习法。
A. 基于字典、词库匹配的分词方法(机械分词法)
该类算法是按照一定的策略将待匹配的字符串和一个已建立好的“充分大的”词典中的词进行匹配,若找到某个词条,则说明匹配成功,识别了该词。
基于词典的分词算法在传统分词算法中是应用最广泛、分词速度最快的一类算法。
其优点是实现简单、算法运行速度快;
缺点是严重依赖词典,无法很好的处理分词歧义和未登录词。
这类方法主要有:
1.正向最大匹配法(从左到右)
2.逆向最大匹配法(从右到左)
3.最少切分法(使每一句中切出的词数最少)
4.双向最大匹配法(进行从左到右、从右到左两次扫描)
(1)最大匹配法
基本思想:先建立一个最长词条字数为 L LL 的词典,然后按正向(逆向)取句子前 L LL 个字查词典,如查不到,则去掉最后一个字继续查,一直到找着一个词为止。
最大匹配算法以及其改进方案是基于词典和规则的。其优点是实现简单,算法运行速度快,缺点是严重依赖词典,无法很好的处理分词歧义和未登录词。
举个例子:“他是研究生物化学的”(假设词典中最长词条字数为7)
正向结果:“他/是/研究生/物化/学/的”
逆向结果:“他/是/研究/生物/化学/的”
(2)最少分词法(最短路径法)
基本思想:假设待切分字串为:S = c 1 c 2 . . . c n S=c_1c_2...c_nS=c
1
c
2
...c
n
,其中 c i c_ic
i
为单个字,串长为 n nn(n ≥ 1 n≥1n≥1)。建立一个结点数为 n + 1 n+1n+1 的切分有向无环图 G GG,若w = c i c i + 1 . . . c j w=c_ic_{i+1}...c_jw=c
i
c
i+1
...c
j
(0 < i < j ≤ n 0<i<j≤n0<i<j≤n)是一个词,则在结点 v i − 1 , v j v_{i-1},v_jv
i−1
,v
j
之间建立有向边。从产生的所有路径中,选择路径最短的(词数最少的)作为最终分词结果。
举个例子:“他说的确实在理”
整个过程如下图所示:
具体过程在这里不再赘述,有兴趣的朋友们可以自行查阅相关资料~
从图中我们可以看出,由于每条边的权重都为1,我们可以直接使用Dijkstra算法求取结果。
可能的结果有两种:“他/说/的确/实在/理”、“他/说/的/确实/在理”。
该种方法的优点在于:需要的语言资源(词表)不多;
缺点在于:对许多歧义字段难以区分,最短路径有多条时,选择最终的输出结果缺乏应有的标准;字串长度较大和选取的最短路径数增大时,长度相同的路径数急剧增加,选择正确结果的困难越来越大。
B. 基于统计的方法
在上述介绍中,我们可以发现,基于规则的方法对歧义问题的解决能力较弱,而基于统计的方法具有较强的歧义区分能力,但需要大规模标注(或预处理)语料库的支持,需要的系统开销也较大。
(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)
W
Seq
∗
=argmax
W
seq
p(W
Seq
∣c
1
c
2
...c
n
)
即,找到概率最大的切分。
在这里介绍两种基于词的分词方法:n元语法模型法、改进最短路径法。
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(w
1
)p(w
2
∣w
1
)p(w
3
∣w
2
)...p(w
n
∣w
n−1
)
整个过程如下图所示:
通过这张图,我们可以求得最大概率切分,即为最后的分词结果。
改进最短路径法(统计粗分模型)
在规则法中,我们介绍了最短路径法,每条边的权重都为1。
改进最短路径法对最短路径法进行了改进,将边的权重改为该词出现频率p ( w i ) p(w_i)p(w
i
),那么最终选取切分结果的标准则变为:
(1) m a x p ( W ) = ∏ i = 1 m p ( w i ) max \quad p(W) = \prod_{i=1}^mp(w_i)\tag{1}
maxp(W)=
i=1
∏
m
p(w
i
)(1)
其中,W = w 1 w 2 . . . w m W=w_1w_2...w_mW=w
1
w
2
...w
m
但是很明显,如果这样的话就没办法用Dijkstra最短路径算法了。
为了解决这个问题,将(1)式改写为如下形式:
令
(2) p ∗ ( W ) = − l n [ p ( W ) ] = ∑ i = 1 m { − l n [ p ( w i ) ] } 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(w
i
)]}(2)
这样,就可以将求 p ( W ) p(W)p(W) 的最大值问题转换为求 p ∗ ( W ) p^*(W)p
∗
(W) 的最小值问题,我们所做的,只是将边的权重 p ( w i ) p(w_i)p(w
i
) 改写为 − l n [ p ( w i ) ] -ln[p(w_i)]−ln[p(w
i
)],这样,就可以继续用Dijkstra算法进行求解了。
(2)基于字的序列标注分词方法
该种方法利用序列标注的方法进行分词,具体做法如下图所示:
常用的方法与序列标注方法相同,有HMM、CRF、RNN+CRF等。
对序列标注不熟悉的朋友们可以参看博客:
自然语言处理NLP(4)——序列标注a:隐马尔科夫模型(HMM)
自然语言处理NLP(5)——序列标注b:条件随机场(CRF)、RNN+CRF
基于字的序列标注分词方法主要的优势在于能够平衡地看待词表词和未登录词的识别问题,具有较强的歧义区分能力和未登录词识别能力。但需要大规模标注(预处理) 语料库的支持,需要的系统开销也较大,而且训练文本的选择将影响分词结果。
C. 深度学习法
该种方法主要是利用深度神经网络模型来对中文进行分词,主要用到了RNN、CNN、GNN等深度神经网络来自动地获取特征,从而代替传统方法中手工定义的特征。
将从句子中获取简单的特征改为获取复杂的特征,从单一语料库单一标准的模型改进为可以使用多语料进行分词等等。
模型结构与序列标注问题类似:
版权声明:本文为CSDN博主「echoKangYL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/echoKangYL/article/details/87912509