算法分析

双向最大匹配,顾名思义就是将正向最大匹配和逆向最大匹配结合在一起
具体算法,详见正向最大匹配
将而二者得到的结果进行比较
1.如果正反向分词结果词数不同,则取分词数量较少的那个。
2.如果分词结果词数相同
.a.分词结果相同,就说明没有歧义,可返回任意一个。
.b.分词结果不同,返回其中单字较少的那个。

代码实现

BMM.py

#实现切词方法
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_words = []#开始切分while words_length > 0:#求算每次切分的长度max_cut_length = min(words_length, max_length)#切分出一个子串,从右侧切分subSentence = sentence[-max_cut_length:]#切分一轮,在左侧删去一个字符 每成功匹配一次就进行breakwhile max_cut_length > 0:#成功匹配一个分词if subSentence in words_dic:cut_words.append(subSentence)break#只剩下一个字elif max_cut_length == 1:cut_words.append(subSentence)break#都不符合,从左侧去掉一个词,长度减一,继续循环else:max_cut_length -= 1subSentence = subSentence[-max_cut_length:]#将切掉的单词(后侧)删去,将切掉的长度减去sentence = sentence[0:-max_cut_length]words_length -= max_cut_lengthcut_words.reverse()#words = '/'.join(cut_words)return cut_words

FMM.py


#实现正向最大匹配法
def cut_words(raw_sentence, words_dic):#统计词典种最长的词(若小于待切分总长度,则每次从未匹配处找这么长的字符串开始匹配)max_length = max(1, 3)   #len(word) for word in words_dicsentence = 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_length#words = "/".join(cut_word_list)#为了配合双向匹配return cut_word_list

BIMM.py

import FMM
import BMMwords_dic = []def init():"""读取词典文件载入词典:return:"""#with as 的用法噶with open("dict.txt", encoding="utf8") as dic_input:for word in dic_input:words_dic.append(word.strip())#实现双向最大匹配法   正反相同返回分次数少的那个
def cut_words(raw_sentence, word_dic):bmm_word_list = BMM.cut_words(raw_sentence, word_dic)fmm_word_list = FMM.cut_words(raw_sentence, word_dic)bmm_size = len(bmm_word_list)fmm_size = len(fmm_word_list)#分词结果数不同if bmm_size != fmm_size:if bmm_size < fmm_size:return bmm_word_listelse:return fmm_size#分词结果数相同,1.结果相同,无歧义,返回任意一个  2。结果不同,返回单字少的那个else:Fsingle = 0Bsingle = 0isSame = Truefor i in range(bmm_size):#分词结果不同if bmm_word_list[i] != fmm_word_list[i]:   # not in也可以isSame = False#统计单个词的数量if len(bmm_word_list[i]) == 1:Bsingle += 1if len(fmm_word_list[i]) == 1:Fsingle += 1if isSame == True:return bmm_word_list#分词结果不同选词数少的一个else:if Fsingle >= Bsingle:return bmm_word_listelse:return fmm_word_listdef main():"""于用户交互接口:return:"""init()while True:print("请输入您要分词的序列")input_str = input()if not input_str:breakresult = cut_words(input_str, words_dic)result = '/'.join(result)print("分词结果:")print(result)
if __name__ == '__main__':main()

自然语言处理——分词系统(双向最大匹配)相关推荐

  1. python实现双向最大匹配法

    python实现双向最大匹配法 CSDN小马哥 于 2019-01-08 21:01:29 发布 2776  收藏 3 文章标签: python 中文分词技术 双向最大匹配法 自然语言处理 版权 -- ...

  2. NLP-基础任务-中文分词算法(1)-基于词典: 机械分词(词典字符串匹配):前向最大匹配、后向最大匹配、双向最大匹配【OOV:基于现有词典,不能进行新词发现处理】

    分词与NLP关系:分词是中文自然语言处理的基础,没有中文分词,我们对语言很难量化,进而很能运用数学的知识去解决问题.对于拉丁语系是不需要分词的. 拉丁语系与亚系语言区别 拉丁语言系不需要分词,因为他们 ...

  3. 利用现有资源快速实现汉语专用分词系统

    利用现有资源快速实现汉语专用分词系统<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&q ...

  4. 词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法

    词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法 Type真是太帅了 于 2018-12-31 13:20:07 发布 1930  收藏 1 分类专栏: 编程 版权 编程 专栏收录该内容 15 ...

  5. 中文分词算法之--最大匹配法

    中文分词算法之–最大匹配法 ​ 前段时间研究了如何用分词工具进行分词,但是分词中涉及的一些算法,不太了解,所以,准备这段时间专攻分词算法原理,大家有补充,或者建议,欢迎留言. 1. 最大匹配法(Max ...

  6. 基于Java实现的中文分词系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85941192 资源下载地址:https://download.csdn.net/downl ...

  7. 一种快速分词系统的设计与实现

    一种快速分词系统的设计与实现 (***计算机学院) 摘  要: 通过对已有分词算法的分析,一方面用hash加tire树的结构来改进词典,从而提高了分词速度,另一方面,在已有模型的基础上,通过增加规则来 ...

  8. JAVA调用NLPIR(中科院汉语分词系统)的使用

    介绍 最近在查找关于中文分词解析方面的开源工具,最开始找到了腾讯的文智与百度的自然语言,这两个平台都是对外提供HTTP接口调用需要把数据传输过去返回解析结果. 使用这种方式会有两种隐患:1.要确定网络 ...

  9. Python下如何调用NLPIR(ICTCLAS2013)分词系统

    NLPIR汉语分词系统-Python下如何调用NLPIR(ICTCLAS2013) 在国内研究自然语言处理的人大概都知道ICTCLAS分词系统的大名.该系统是由张华平博士开发的基于层叠隐性马可夫链的分 ...

  10. NLPIR(北理工张华平版中文分词系统)的SDK(C++)调用方法

    一.本文内容简介 二.具体内容 1. 中文分词的基本概念 2.关于NLPIR(北理工张华平版中文分词系统)的基本情况 3.具体SDK模块(C++)的组装方式 ①准备内容: ②开始组装 三.注意事项 一 ...

最新文章

  1. oracle可视化工具IB,oracle小记:dba_data_files
  2. boost::convert模块实现lexical_cast的测试程序
  3. 从分子层面雕刻肌肉,新数学模型预测锻炼肌肉最优方式
  4. Java黑皮书课后题第5章:5.11(找出能被5或6整除的数,但不能同时整除)编写程序,显示从100到1000之间能被5或6整除但不能同时整除的数,每行显示10个。数字之间用一个空格字符隔开
  5. 【数据结构与算法】之深入解析“石子游戏V”的求解思路与算法示例
  6. uni app map 地图 漂浮问题及方案
  7. 设计模式---享元模式(C++实现)
  8. svn中文路径 权限设定
  9. 无线通信网络学习之LTE网络架构篇(20141208)
  10. 微信小程序设置字体无效_UI设计微信小程序用了苹方字体,前端却说做不了怎么办?...
  11. uva 1449 Dominating Patterns(AC自动机基本应用)
  12. 嘉兴 机器人仓库 菜鸟_今天,菜鸟上线中国最大机器人仓库
  13. 远程办公神器-如何在家里远程办公室的电脑,利用cpolar内网穿透
  14. 超融合和服务器关系_分析超融合与传统服务器部署的区别
  15. springboot2.0优雅关闭
  16. linux网络编程(6)基于多进程的TCP服务器与客户端编程
  17. PCB电路板原理图中VCC、VDD、VEE、VSS、VBAT各表示什么意思?
  18. java中经纬度使用与相关工具类
  19. C#批量修改文件后缀
  20. 【Turtle表白合集】“海底月是天上月,眼前人是心上人。”余生多喜乐,长平安~(附3款源码)

热门文章

  1. 机器学习算法之SVM的多分类
  2. 计算机系统动态库修复,win10系统提示dll动态链接库出现故障修复的处理步骤
  3. 大量监控视频如何存储?
  4. 机器人动力学与控制学习笔记(十一)————机器人凯恩方程动力学建模
  5. 《自然语言处理简明教程》读书笔记:第二章 词汇自动处理
  6. 机顶盒刷成普通android,移动网络电视机顶盒如何刷成安卓系统
  7. 开方 C语言 迭代法加二分法
  8. 2019icpc计算机程序设计大赛,关于开展西安理工大学2019年程序设计竞赛暨ACM-ICPC大赛选拔赛的通知...
  9. java学生管理系统登录注册_《Java》— 学生管理系统——登录界面
  10. cmos和ttl_ttl和cmos的区别