欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自然语言处理:中文分词

程序员文章站 2022-06-12 16:09:41
...

中文分词一般有3中方法:

  • 基于规则
  • 基于统计
  • 混合算法

基于规则

基于规则是说,我们按照一定的规则去将中文文本分类,最常见的方法就是正向最大匹配算法、逆向最大匹配算法和双向最大匹配算法。

正向最大匹配法

什么是正向最大匹配算法呢?

很简单,首先我们有一个预先定义好的词典,词典里面存放者目前已知的所有词语,假设词典中最大长度的词语长度是6,然后我们会从左往右,匹配词典中长度为6的词语,若是匹配到了,就开始匹配下一个长度为6的词语,若是匹配不到,就匹配长度为5的词语,直到匹配到为止。

例如我要将 ’北京大学很厉害’
进行分词。

我的词典为:
[北京,大学,北京大学,大学生,生,很,厉害]

那么第一个匹配到的就是 北京大学
然后是
最后是 厉害

分词效果: ’北京大学/很/厉害‘。

但是,如果我要将 ”北京大学生很厉害“
进行分词。

就会分成: ‘北京大学/生/很/厉害’
明显不是我们想要的结果。

逆向最大匹配法

这时可以采用逆向最大匹配法。
从句子末尾开始向前匹配最大长度的词语,然后过程和正向最大匹配法相同。
分词效果:
‘北京/大学生/很/厉害’

双向最大匹配法

就是同时使用正向和逆向最大匹配法,选其中划分较少的句子作为分词效果。

算法具体代码见文末

基于统计:

基于统计的算法有很多,例如语言模型,HMM模型,CRF模型等等

语言模型

假设句子为ABCDEFGABCDEFG,由贝叶斯公式:

P(ABCDEFG)=P(ABCDEFG)=
P(A)P(BA)P(CA,B)...P(GA,B,C,D,E,F)P(A)*P(B|A)*P(C|A,B)*...*P(G|A,B, C,D,E,F)

然后因为P(GA,B,C,D,E,F)P(G|A,B, C,D,E,F)难以计算,一般会采用ngramn-gram模型,也就是当前点的概率分布只和当前点的前n1n-1个点有关。

例如2gram2-gram模型,
P(ABCDEFG)=P(ABCDEFG)=
P(A)P(BA)P(CB)...P(GF)P(A)*P(B|A)*P(C|B)*...*P(G|F)
通过计算语料库中每一个词的条件概率分布,P(wnwn1)P(w_n|w_{n-1}),就能计算出P(ABCDEFG)P(ABCDEFG)的概率,然后比较其中最大的一个选为输出。
得出的结果就应该是
P///>P///P(‘北京/大学生/很/厉害’。)>P(‘北京大学/生/很/厉害’。)

(概率P(nn1)=count(n1,n)count(n1)P(n|n-1)=\frac{count(n-1,n)}{count(n-1)})

HMM模型

隐马尔可夫模型:将句子处理为序列标注来实现分词效果。

例如每一个字都有四种可能的状态,作为词语的开头:BB,作为词语的中间部分:MM,作为词语的结尾:EE,和独立成词:SS

举个栗子:
“天气真好啊,我们一起去峨眉山旅游吧!”
就可以标注为:
BEBESSBEBESBMEBESSBEBESSBEBESBMEBESS
原来的文本就被划分为:
“天气/真好/啊/,/我们/一起/去/峨眉山/旅游/吧/!”

使用贝叶斯公式:
假设要字为w,标注为t那么我们的任务就是求出:
P(t1,t2,t3,...,tnw1,w2,w3,...,wn)P(t_1,t_2,t_3,...,t_n|w_1,w_2,w_3,...,w_n)
选择概率最大的一种标注作为最终结果。
为了简化模型,假设变量之间都相互独立:
P(t1,t2,t3,...,tnw1,w2,w3,...,wn)P(t_1,t_2,t_3,...,t_n|w_1,w_2,w_3,...,w_n)
=P(t1w1)P(t2w2)...P(tnwn)=P(t_1|w_1)*P(t_2|w_2)*...*P(t_n|w_n)
但是这样就可能会出现BBBBBBBBBBEEEEEEEEEE这种不合理的情况。

引入 HMM 模型:
P(tw)=P(wt)P(t)P(w)P(t|w) = \frac{P(w|t)*P(t)}{P(w)}
由于分布是常数,不用管,则只需计算最大的 P(wt)P(t)P(w|t)*P(t)

P(tw)P(t|w) 正比于 P(wt)P(t)P(w|t)*P(t)
P(wt)P(t)P(w|t)*P(t) (马尔可夫假设)
=P(t1)P(w1t1)P(t2t1)P(w2t2)...P(tntn1)P(wntn)=P(t_1)*P(w_1|t_1)*P(t_2|t_1)*P(w_2|t_2)*...*P(t_n|t_{n-1})*P(w_n|t_n)

至于如何计算最优解,需要用到viterbiviterbi算法
算法的核心是,若第nn个点是最优点(概率最大),那么第n1n-1个点也一定是最优点。
详细代码请参看文末

CRF模型后面的章节会提到,目前先不写了。

混合模型

就是同时规则模型和统计模型。
例如:python库:jiebajieba

#import jieba 
#jieba.cut(text) #a精确模式
#jieba.cut(text,cut_all=Ture) #全部模式
#jieba.cut_for_search(text) #搜索模式

参考书籍:《Python自然语言处理实战》
完整代码:请点击

相关标签: NLP