自然语言处理:中文分词
中文分词一般有3中方法:
- 基于规则
- 基于统计
- 混合算法
基于规则
基于规则是说,我们按照一定的规则去将中文文本分类,最常见的方法就是正向最大匹配算法、逆向最大匹配算法和双向最大匹配算法。
正向最大匹配法
什么是正向最大匹配算法呢?
很简单,首先我们有一个预先定义好的词典,词典里面存放者目前已知的所有词语,假设词典中最大长度的词语长度是6,然后我们会从左往右,匹配词典中长度为6的词语,若是匹配到了,就开始匹配下一个长度为6的词语,若是匹配不到,就匹配长度为5的词语,直到匹配到为止。
例如我要将 ’北京大学很厉害’
进行分词。
我的词典为:
[北京,大学,北京大学,大学生,生,很,厉害]
那么第一个匹配到的就是 北京大学
然后是 很,
最后是 厉害。
分词效果: ’北京大学/很/厉害‘。
但是,如果我要将 ”北京大学生很厉害“
进行分词。
就会分成: ‘北京大学/生/很/厉害’。
明显不是我们想要的结果。
逆向最大匹配法
这时可以采用逆向最大匹配法。
从句子末尾开始向前匹配最大长度的词语,然后过程和正向最大匹配法相同。
分词效果:
‘北京/大学生/很/厉害’。
双向最大匹配法
就是同时使用正向和逆向最大匹配法,选其中划分较少的句子作为分词效果。
算法具体代码见文末
基于统计:
基于统计的算法有很多,例如语言模型,HMM模型,CRF模型等等
语言模型
假设句子为,由贝叶斯公式:
然后因为难以计算,一般会采用模型,也就是当前点的概率分布只和当前点的前个点有关。
例如模型,
通过计算语料库中每一个词的条件概率分布,,就能计算出的概率,然后比较其中最大的一个选为输出。
得出的结果就应该是
(概率)
HMM模型
隐马尔可夫模型:将句子处理为序列标注来实现分词效果。
例如每一个字都有四种可能的状态,作为词语的开头:,作为词语的中间部分:,作为词语的结尾:,和独立成词:。
举个栗子:
“天气真好啊,我们一起去峨眉山旅游吧!”
就可以标注为:
原来的文本就被划分为:
“天气/真好/啊/,/我们/一起/去/峨眉山/旅游/吧/!”
使用贝叶斯公式:
假设要字为w,标注为t那么我们的任务就是求出:
选择概率最大的一种标注作为最终结果。
为了简化模型,假设变量之间都相互独立:
但是这样就可能会出现,这种不合理的情况。
引入 HMM 模型:
由于分布是常数,不用管,则只需计算最大的
正比于 、
(马尔可夫假设)
至于如何计算最优解,需要用到算法
算法的核心是,若第个点是最优点(概率最大),那么第个点也一定是最优点。
详细代码请参看文末
CRF模型后面的章节会提到,目前先不写了。
混合模型
就是同时规则模型和统计模型。
例如:python库:
#import jieba
#jieba.cut(text) #a精确模式
#jieba.cut(text,cut_all=Ture) #全部模式
#jieba.cut_for_search(text) #搜索模式
参考书籍:《Python自然语言处理实战》
完整代码:请点击
上一篇: C语言细讲——分支与循环
下一篇: C#中利用正则表达式检测文件路径的合法性