基于规则的分词是一种机械分词方法,主要通过维护词典,在切分语句时,将语句的每个字符串与词典中的词进行逐一匹配,找到则切分,否则不切分。按照语句切分的方式,可分为:正向最大匹配法、逆向最大匹配法、双向最大匹配法。下面将详细介绍。

一、正向最大匹配法

正向最大匹配法(Maximun Match Method,简称MM)的基本思路是:假设分词词典中最长词的长度为i个字符,则用被处理语句的前i个字符作为匹配字段,来查找词典。如果匹配到这个字段,则这个字段作为一个词被切分出来。如果词典没有匹配到这个字段,就将匹配字段的最后一个字符去掉,再把剩下的匹配字段与词典匹配,直至匹配成功或者剩余字符串长度为0。这样就完成了一轮匹配,然后取下一个i个字符的字符串进行匹配处理。

大致步骤如下:

首先定义待切分字符串s1,分词后的输出为s2,词典最大词长为maxlen

例如:词典为  ['研究','生命','命','的','研究生','起源'],则语句“研究生命的起源”可以切分为:['研究生', '命', '的', '起源']。具体代码如下:

class MM(object):def __init__(self):self.window_size=3          #词典的最长词长度def cut(self,text):dic=['研究','生命','命','的','研究生','起源']result=[]index=0text_length=len(text)while text_length>index:for size in range(self.window_size+index,index,-1):      #一个for循环为一个长度为词典中最长词条的匹配字段,没有匹配到,去掉最后一个字,再来匹配words=text[index:size]if words in dic:index=size-1           #调整下一个匹配字段的起始位置break                  #匹配到字典,跳出本次循环index+=1                   #出现上一个字段匹配到不在词典中的单字符时,保证正确索引下一个匹配字段的起始位置result.append(words + '--')print(result)if __name__ =='__main__':text='研究生命的起源'cut_mm=MM()cut_mm.cut(text)

二、逆向最大匹配法

逆向最大匹配法(Reverse Maximum Match Method,简称RMM)的基本思想与正向自带类似,不过是分词切分的方向与MM法相反。逆向最大匹配法从待处理文本的末端开始切分匹配,每次取最末端的i个字符(i为词典中最长词数)作为匹配字段,若匹配失败,去掉匹配字段最前面的一个字,继续匹配。

需要注意的是,逆向最大匹配法使用的词典是逆序词典,词条都按逆序方式存放。

关于准确度,与正向最大匹配法相比,逆向最大匹配法的误差要小一点。

例如: 词典为  ['研究','生命','命','的','研究生','起源'],则语句“研究生命的起源”可以切分为:['研究', '生命', '的', '起源']。

代码如下:

# coding=utf-8
#逆向最大匹配法分词
class RMM(object):def __init__(self):self.window_size=3          #词典的最长词长度def cut(self,text):dic=['研究','生命','命','的','研究生','起源']result=[]index=len(text)while index>0:for size in range(index-self.window_size,index):      words=text[size:index]if words in dic:index=size+1           #调整下一个匹配字段的起始位置break                  #匹配到字典,跳出本次循环index-=1                   #出现上一个字段匹配到不在词典中的单字符时,保证正确索引下一个匹配字段的起始位置result.append(words + '--')result.reverse()print(result)if __name__ =='__main__':text='研究生命的起源'cut_rmm=RMM()cut_rmm.cut(text)

 三、双向最大匹配法

双向最大匹配法(Bi-directction Match Method)的基本思想是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,根据双向最大匹配原则,选取分析结果。

双向最大匹配原则:

(1)如果正反向分词结果词数不同,则取分词数量较少的那个;

(2)如果正反向分词结果词数相同:

  • 分词结果相同,可返回任意一个;
  • 分词结果不同,返回其中单字较少的那个。

例如:

# coding=utf-8
#双向最大匹配法
class MM(object):def __init__(self):self.window_size=3          #词典的最长词长度def cut(self,text):dic=['研究','生命','命','的','研究生','起源']result1=[]index=0text_length=len(text)while text_length>index:for size in range(self.window_size+index,index,-1):      words=text[index:size]if words in dic:index=size-1           #调整下一个匹配字段的起始位置break                  #匹配到字典,跳出本次循环index+=1                  result1.append(words + '--')print("正向最大匹配:",result1)return result1
class RMM(object):def __init__(self):self.window_size=3          #词典的最长词长度def cut(self,text):dic=['研究','生命','命','的','研究生','起源']result2=[]index=len(text)while index>0:for size in range(index-self.window_size,index):     words=text[size:index]if words in dic:index=size+1           #调整下一个匹配字段的起始位置break                  #匹配到字典,跳出本次循环index-=1                   #出现上一个字段匹配到不在词典中的单字符时,保证正确索引下一个匹配字段的起始位置result2.append(words + '--')result2.reverse()print("逆向最大匹配:",result2)return result2if __name__ =='__main__':text='研究生命的起源'result=[]one_length1=0one_length2 = 0cut_mm=MM()result1=cut_mm.cut(text)cut_rmm = RMM()result2=cut_rmm.cut(text)if len(result1)==len(result2):  #正反向分词结果数相同if result1 ==result2 :#正反向分词结果数相同,结果相同,返回任意一个result=result1else:#统计分析结果的单字数,#正反向分词结果数相同,结果不同,返回单字少的for word in result1:if len(word)==1:one_length1 +=1for word in result2:if len(word)==1:one_length2 +=1if one_length2>one_length1:result=result1else:result =result2else:#正反向分词结果数不同,选择分次数少的if len(result1 )>len(result2 ):result =result2else:result = result1print("双向最大匹配法:",result)

综上可知,基于规则的分词一般都较为简单高效,但是词典的维护是一个很庞大的工程,很难通过词典覆盖到所有词。

中文分词技术(一):规则分词相关推荐

  1. 中文分词技术之基于规则分词

    中文分词技术之基于规则分词 基于规则分词的基本思想 正向最大匹配法 逆向最大匹配法 双向最大匹配法 总结 词是中文语言理解中最小的能独立运用的语言单位.中文的词与词之间没有明显分隔标志,因此在分词技术 ...

  2. [转载]中文搜索引擎技术揭密:中文分词

    前言 信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google.百度.yisou.中搜等大型搜索引擎一直人们讨论的话题.随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴 ...

  3. 中文搜索引擎技术揭密:系统架构(五)

    来源:e800.com.cn 搜索引擎细化趋势 随着搜索引擎市场空间越来越大,搜索引擎也分得越来越细.互联网没有国界,百度总裁李彦宏所讲:搜索引擎市场是赢家通吃的市场.如果一个搜索引擎要想在搜索市场上 ...

  4. 【Python自然语言处理】中文分词技术——规则分词

    中文分词方法 本文参考自书籍<Python自然语言处理实战:核心技术与算法> 用做个人的学习笔记和分享 1. 规则分词 规则分词是一种机械分词方法,主要通过维护词典,在切分语句时将语句的每 ...

  5. Go语言 中文分词技术使用技巧(一)

    分词技术就是搜索引擎针对用户提交查询的关键词串进行的查询处理后根据用户的关键词串用各种匹配方法进行分词的一种技术. 中文分词(Chinese Word Segmentation)指的是将一个汉字序列( ...

  6. 深入浅出不可思议的中文分词技术

    亲爱的喵喵们,明天小夕就正式开学啦.开学后每周有几天的课比较多,小夕为了保证每篇文章的质量,可能做不到每天一更啦.但是小夕也会尽量挤出时间来写文章,尽量保证两三天更一篇.希望不要责怪小夕哦... 分词 ...

  7. NLP学习(二)中文分词技术

    运行平台: Windows Python版本: Python3.x IDE: PyCharm 一. 前言 这篇内容主要是讲解的中文分词,词是一个完整语义的最小单位.分词技术是词性标注.命名实体识别.关 ...

  8. NLP学习(二)—中文分词技术

    本次代码的环境: 运行平台: Windows Python版本: Python3.x IDE: PyCharm 一.    前言 这篇内容主要是讲解的中文分词,词是一个完整语义的最小单位.分词技术是词 ...

  9. 【原创】NLP中的中文分词技术

     NLP中的中文分词技术 作者:mjs (360电商技术组) 随着需求的变化和技术的发展,互联网企业对数据的分析越来越深入,尤其是自然语言处理处理领域,近几年,在搜索引擎.数据挖掘.推荐系统等应用方 ...

  10. 《自然语言处理实战入门》 ---- 第4课 :中文分词原理及相关组件简介 之 语言学与分词技术简介...

    <自然语言处理实战入门> ---- 第4课 :中文分词原理及相关组件简介 之 语言学与分词技术简介 https://edu.csdn.net/course/play/20769/25954 ...

最新文章

  1. pytorch笔记:09)Attention机制
  2. matlab 常用数学函数
  3. 基于代数距离的椭圆拟合
  4. VM克隆之后启动eth0找不到eth0:unknown interface:no such device
  5. UML总结---UML九种图关系说明
  6. 概率论与数理统计思维导图_数学思维到底有多重要?这个学科往往影响国家实力...
  7. osx mount nfs/smb
  8. 20200709每日一句
  9. 基于C语言的JPEG编码代码详解
  10. Java小游戏项目之坦克世界
  11. VM使用-pin针同心度检测
  12. iOS 苹果2.1大礼包解决方法
  13. 循环冗余校验码CRC原理和实例
  14. Black Arch虚拟机安装及配置
  15. Excel如何生成条形码图片?
  16. 如何用【Python】制作一个二维码生成器
  17. 国标流媒体服务器GB28181协议和海康设备的交互过程记录
  18. AI机器人源码,电话机器人源码和系统部署运行环境freeswitch
  19. Excel函数——OFFSET函数将多列合并成一列
  20. 谈钱不尴尬,程序员面试谈薪资的6个必知技巧!

热门文章

  1. Operations-ansible-01
  2. 网络工程师笔记--广域网和接入网
  3. 云锁linux宝塔安装,【最新版】宝塔面板下为Nginx自编译云锁Web防护模块教程
  4. 火星探险问题 网络流
  5. Cloudera Manager 环境搭建
  6. 云服务器查看物理MAC地址的方法
  7. Tensorflow2 model.compile()理解
  8. 浏览器安全检查5秒解决方案
  9. java校园圈子论坛跳蚤市场小程序源码
  10. Set Scrolling Pictrues in the WebPage