写在前面的话

本文参考《Python自然语言处理实战 核心技术与算法》,一本不可多得的自然语言处理入门书籍。

MM、RMM、Bi_MM都是基于规则分词的算法,通过匹配所持有的字典,进行分词。分词结果取决于字典的完整程度和匹配方式。根据SunM.S 和Benjamin K.T(1995)的研究表明,中文中90.0%左右的句子,MM和RMM分词结果重合且完全正确,9.0% 的句子两种方法分词结果不一样,但其中必有一个是正确的,另外1.0%两种方法切分虽重合但却是错误的结果,或者切分不重合都是错的。

MM(Maximum Match Method)最大匹配

算法思想:MM也称正向最大匹配,以字典中词的最大长度为匹配窗口大小,例如 dic = [‘南京’, ‘南京市’, ‘南京市长’, ‘长江’, ‘长江大桥’, ‘大桥’, '桥],字典中词的最大长度为4,则匹配窗口最大长度为4,即从处理文本的前4个字符串作为匹配字段。若首次匹配成功,则匹配窗口向后滑动4个字符位置,继续匹配。若匹配不成功,则缩小匹配字符串大小一位,继续匹配,匹配成功,从下位开始继续向后,不成功,继续减小所匹配字符串的长度。

算法实现:参考书中算法(基于python3)

class MM(object):"""maximum Match Method for NLP"""def __init__(self, window_size=3):super(MM, self).__init__()self.window_size = window_sizedef cut(self, text):result = []index = 0text_length = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']while text_length>index:for size in range(self.window_size+index, index, -1):piece = text[index:size]if piece in dic:index = size-1breakindex += 1result.append(piece + '---')print(result)if __name__ == '__main__':text = '研究生命的起源'mm = MM()mm.cut(text)拆分结果:['研究生', '命', '的', '起源']

RMM(Reverse Maximum Match Method)

算法思想:RMM的算法思想与MM思想基本一致,只是从要处理文本的末端开始匹配,不在赘述。看代码

算法实现:

class RMM(object):"""Reverse Maximum Match Method for NLP"""def __init__(self, window_size=3):super(RMM, self).__init__()self.window_size = window_sizedef cut(self, text):result = []text_length = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']while text_length>0:for size in range(text_length-self.window_size, text_length):piece = text[size:text_length]if piece in dic:text_length = size+1breaktext_length = text_length-1result.append(piece + '---')result.reverse()print(result)if __name__ == '__main__':text = '研究生命的起源'mm = RMM()mm.cut(text)分词结果:['研究', '生命', '的', '起源']

Bi_MM(Bi-direction Match Method)

算法思想:基于正向分词和逆向分词的结果,如果正反分词结果词数不同,则取分词结果中词数较少的那个座位返回结果。如果正反分词结果词数相同,则取分词结果中单字个数较少的那个作为分词结果,(单字个数相同时返回逆向分词结果)

算法实现:

class BiMM(object):"""Bi-direction Matching Method1. 对比两种方法分词结果,返回分词长度较小的分词结果2. 如果分词结果长度相同a. 如果分词结果相同,返回热议一个b. 不同,返回分词结果中单个字数较少的"""def __init__(self, window_size=3):super(BiMM, self).__init__()self.window_size = window_sizedef cut(self, text):text_length = len(text)f_result = []   # 最大正向匹配结果r_result = []   # 最大反向匹配结果dic = ['研究', '研究生', '生命', '命', '的', '起源', '南京', '南京市', '南京市长', '长江', '长江大桥', '大桥', '桥']index = 0while text_length-index>0:  for i in range(self.window_size+index, index, -1):  # trick 从index到self.window_size每次只判断一个window_sizepiece = text[index:i]if piece in dic:index = i - 1breakindex = index+1f_result.append(piece)while text_length>0:for size in range(text_length-self.window_size, text_length):piece = text[size:text_length]if piece in dic:text_length = size - 1breaktext_length += 1r_result.append(piece)r_result.reverse()if len(r_result) == len(f_result):  if r_result == f_result:  # 分词解果相同,返回任意一个都行return f_resultelse:f_single_count = len([word for word in f_result if len(word) == 1])  # 正向单一字统计r_single_count = len([word for word in r_result if len(word) == 1])  # 反向单一字统计# for f in f_result:  #返回单字个数少的那个#   if len(f) == 1:#      f_single_count += 1# for r in r_result:#  if len(r) == 1:#      r_single_count += 1return f_result if f_single_count<r_single_count else r_resultelse:return f_result if len(f_result)<len(r_result) else r_resultif __name__ == '__main__':text = '南京市长江大桥'mm = BiMM(4)result = mm.cut(text)print(result)分词结果:['南京市', '长江大桥']

MM、RMM、Bi_MM相关推荐

  1. 自然语言处理-中文分词相关算法(MM、RMM、BMM、HMM)

    文章目录 一.前言 二.分词算法 2.1 规则分词 2.1.1 正向最大匹配法 2.1.2 逆向最大匹配法 2.1.3 双向最大匹配法 2.2 统计分词 2.2.1 语言模型 2.2.2 HMM模型 ...

  2. Android 编译时:m、mm、mmm、mma、mmma的区别

    m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Andr ...

  3. Android 系统(64)---Android中m、mm、mmm、mma、mmma的区别

    Android中m.mm.mmm.mma.mmma的区别 m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android ...

  4. Android中m、mm、mmm、mma、mmma的区别

    Android中m.mm.mmm.mma.mmma的区别 m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android ...

  5. 基于MM、STP、ECN、MTF的外汇平台模式深度分析

    外汇经纪商平台的分类: * MM,做市商模式,全称Market Maker: * STP,直接交易处理系统模式,全称Straight Through Processing: * ECN,电子自动撮合成 ...

  6. 区分Android中的各种单位——in、mm、pt、px、dp、dip、sp

    Android常用的单位有in.mm.pt.px.dp.dip.sp. in.mm.pt是屏幕的物理单位,1in=25.4mm=72pt. px是屏幕的像素单位,例如,1080*1920的屏幕在横向有 ...

  7. Android 长度单位(dp、sp、px、in、pt、mm)详解

    px: 即像素,1px代表屏幕上一个物理的像素点: px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同,如下图所示(图片来自android developer guid ...

  8. mysql mma 原理_Android中m、mm、mmm、mma、mmma的区别

    m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Andr ...

  9. 关于 字号、PX像素、PT点数、em、CM厘米、MM毫米之间的换算

    关于 字号.PX像素.PT点数.em.CM厘米.MM毫米之间的换算 (2011-04-25 15:09:21)转载▼ 标签: 杂谈 分类: 专业知识 pt (point,磅) 是一个物理长度单位,指的 ...

最新文章

  1. java如何实现redis分片存储_面试官:你说一下Redis吧,怎么实现高可用,还有持久化怎么做的?...
  2. ML之DT:基于DT决策树算法(交叉验证FS+for遍历最佳FS)对Titanic(泰坦尼克号)数据集进行二分类预测
  3. 如何在Windows Defender中安排扫描
  4. Android下利用Bitmap切割图片
  5. 大型企业网络设备管理
  6. css3 hover显示隐藏过渡,CSS3中 “hover” 样式 和 动画过渡 的问题。
  7. 电缆桥架安装规范标准_电缆桥架安装标准分享
  8. php 7.x memcache.dll nts,vc15等下载
  9. 一天搞懂深度学习--深度学习简介
  10. 【转载】KG-知识图谱初探
  11. 磁珠 符号_磁珠简介_磁珠的命名、单位和选型
  12. python基础教程:face++与python实现人脸识别签到(考勤)功能
  13. 浅谈升级到 MacBook Air M1的体验
  14. 基于微信小程序的新生自助报到系统小程序
  15. java.net.Url类的应用
  16. CSS中100%和inherit(继承)的区别,以及inherit的简单应用
  17. python夯实基础日记-类详解
  18. 学习Linux的博客和资源网站
  19. python的学习笔记案例1--汇率兑换4.0
  20. 从 Airflow 到 Apache DolphinScheduler,有赞大数据开发平台的调度系统演进

热门文章

  1. “代理服务器出现问题,或者地址有误”解决方案
  2. matlab app使用对话框读取和保存文件
  3. html第一个子元素选择,css选中父元素下的第一个子元素(:first-child)
  4. Excel 表列序号
  5. 【Unity3D日常开发】Unity3D中实现计时器工具类-正计时、倒计时、暂停计时、加速计时
  6. 奋斗吧之“和loser对话”小故事
  7. 【网单服务端】神鬼世界一键安装服务端双镜像优化版网游单机
  8. 如何有效开展小组教学_如何有效开展小组合作学习活动
  9. [解读] GTN: Generative Teaching Networks
  10. 入力できる文字数チェック