基于词表的中文分词算法
基于词表的中文分词算法
正向最大匹配法
对于输入的一段文本从左至右,以贪心的方式切分出当前位置上长度最大的词.正向最大匹配法是基于词典的分词方法,其分词原理是:单词的颗粒度越大,所能表示的含义越确切.
该算法主要分两个步骤:
- 一般从一个字符串的开始位置,选择一个最大长度的词长的片段,如果序列不足最大词长,则选择全部序列.
- 首先看该片段是否在词典中,如果是,则算为一个分出来的词,如果不是,则从右边开始,减少一个字符,然后看短一点的这个片段是否在词典中,依次循环,直到只剩下一个.
- 序列变为第2步骤截取分词后剩下的部分序列.
示例:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
我 | 毕 | 业 | 于 | 湖 | 北 | 科 | 技 | 学 | 院 |
pos | remain characters | start characters | max matching |
---|---|---|---|
0 | 我毕业于湖北科技学院 | 我 | 我 |
1 | 毕业于湖北科技学院 | 毕 | 毕业 |
3 | 于湖北科技学院 | 于 | 于 |
4 | 湖北科技学院 | 湖北科技学院 | 湖北科技学院 |
代码实现:
words_dic = []def init():"""读取词典文件载入词典:return:"""with open('dic/dic.txt','r',encoding='utf8') as dic_inp:for word in dic_inp:words_dic.append(word.strip())#实现正向匹配算法中的切词方法
def cut_words(raw_sentence,word_dic):#统计词典中最长的词max_length = max(len(word) for word in words_dic)sentence = raw_sentence.strip()#统计序列长度words_length = len(sentence)#存储切分好的词语cut_word_list = []while words_length > 0:max_cut_length = min(max_length,words_length)subSentence = sentence[0 : max_cut_length]while max_cut_length > 0:if subSentence in words_dic:cut_word_list.append(subSentence)breakelif max_cut_length == 1:cut_word_list.append(subSentence)breakelse:max_cut_length = max_cut_length - 1subSentence = subSentence[0:max_cut_length]sentence = sentence[max_cut_length:]words_length = words_length - max_cut_lengthwords = "/".join(cut_word_list)return wordsdef main():init()while True:print("请输入您要分词的序列")input_str = input()if not input_str:breakresult = cut_words(input_str,words_dic)print("分词结果")print(result)if __name__ == "__main__":main()
测试结果:
请输入您要分词的序列
我毕业于湖北科技学院,就职于华为
分词结果
我/毕业/于/湖北科技学院/,/就职于/华为
逆向最大匹配法
反向最大匹配法的基本原理与正向最大匹配法类似,只是分词顺序变为从左至右
示例
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
我 | 毕 | 业 | 于 | 湖 | 北 | 科 | 技 | 学 | 院 |
pos | remain characters | start characters | max matching |
---|---|---|---|
4 | 我毕业于湖北科技学院 | 湖 | 湖北科技学院 |
3 | 我毕业于 | 于 | 于 |
1 | 我毕业 | 毕 | 毕业 |
0 | 我 | 我 | 我 |
代码实现:
words_dic = []def init():with open('dic/dic.txt','r',encoding="utf8") as dic_input:for word in dic_input:words_dic.append(word.strip())#实现逆向最大匹配算法的切词算法
def cut_words(raw_sentence,words_dic):max_length = max(len(word) for word in words_dic)sentence = raw_sentence.strip()words_length = len(sentence)cut_word_list = []while words_length>0:max_cut_length = min(max_length,words_length)subSentence = sentence[-max_cut_length:]while max_cut_length > 0:if subSentence in words_dic :cut_word_list.append(subSentence)breakelif max_cut_length == 1 :cut_word_list.append(subSentence)breakelse:max_cut_length = max_cut_length - 1subSentence = subSentence[-max_cut_length:]sentence = sentence[0:-max_cut_length]words_length = words_length - max_cut_lengthcut_word_list.reverse()words = "/".join(cut_word_list)return wordsdef main():init()while True:print("请输入您要分词的序列")input_str = input()if not input_str:breakresult = cut_words(input_str,words_dic)print("分词结果")print(result)
if __name__ == '__main__':main()
测试结果:
请输入您要分词的序列
我毕业于湖北科技学院
分词结果
我/毕业/于/湖北科技学院
双向最大匹配算法
双向最大匹配算法是将正向最大匹配算法得到的分词结果和逆向最大匹配法得到的结果进行比较,从而决定正确的分词方法.
启发式规则
- 如果正反向分词结果词数不同,则取分词数量较少的那一个.
- 如果分词结果次数相同
a. 分词结果相同,就说明没有歧义,可返回任意一个.
b. 分词结果不同,返回单字较少的那个
基于词表的中文分词算法相关推荐
- 基于字典的中文分词算法RMM
引言:目前针对中文分词一般有基于字典,基于统计(HMM等),基于规则的分词方法,然而其中基于字典的中文分词是最基础,同时也是最高效的方式,但分词精度取决与字典的规模. 一.基于字典的中文算法简介 1. ...
- 基于字典的中文分词算法RMM,MM实现
引言:目前针对中文分词一般有基于字典,基于统计(HMM等),基于规则的分词方法,然而其中基于字典的中文分词是最基础,同时也是最高效的方式,但分词精度取决与字典的规模. 一.基于字典的中文算法简介 1. ...
- 入门科普:一文看懂NLP和中文分词算法(附代码举例)
导读:在人类社会中,语言扮演着重要的角色,语言是人类区别于其他动物的根本标志,没有语言,人类的思维无从谈起,沟通交流更是无源之水. 所谓"自然"乃是寓意自然进化形成,是为了区分一些 ...
- 基于感知器的中文分词算法
http://heshenghuan.github.io/2015/12/21/%E5%9F%BA%E4%BA%8E%E6%84%9F%E7%9F%A5%E5%99%A8%E7%9A%84%E4%B8 ...
- 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词
基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤 第一次写中文分词程序,欢迎拍砖. publicclass MM ...
- 基于词典的逆向最大匹配中文分词算法,更好实现中英文数字混合分词
基于词典的逆向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤.实际分词效果比正向分词效果好 publicclass RMM ...
- 在Hadoop上运行基于RMM中文分词算法的MapReduce程序
原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词 ...
- 中文分词算法python代码_中文分词算法之最大正向匹配算法(Python版)
最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...
- 正向最大匹配算法 python代码_中文分词算法之最大正向匹配算法(Python版)
最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...
最新文章
- 解决Linux CENTOS服务器 tree命令出现乱码 解析原因
- 【数据结构】回顾散列表
- css调用方式的方法
- junit编写测试代码_编写数据访问代码测试-不测试框架
- TCP与UDP的区别(未完成,待补充)
- ubuntu 源、codename 与 sources.list 文件
- linux服务器学习笔记:linux忘记密码怎么办?
- windows开启远程桌面命令
- 作数学题应不该用计算机,数学奥数考试
- 电子专业必懂的焊接知识与技能!
- checkbook实现任何颜色背景
- VR终极入门指南:设备,内容,手机...都在这里了|深扒
- 各大电商平台API、淘宝API、1688API、拼多多API抓取商品详情数据接口
- java8 使用拉姆达对基本数据类型集合进行分组
- 书友汇德天-创作不停,学习不止(十字交叉线画法)
- Maven 仓库 .lastUpdated文件
- Week of 2.7
- 两段文章清楚弄明白什么是异步IO、同步IO、同步阻塞IO、同步非阻塞IO、异步阻塞IO、异步非阻塞IO
- zero eclipse_全球首款真无孔机!魅族zero亮相:支持屏幕发声和18W无线快充
- 【EduCoder答案】搜索问题与技术