中文分词目前可以分为“规则分词”,“统计分词”,“混合分词(规则+统计)”这三个主要流派。这次介绍下基于规则的分词,其是一种机械的分词方法,主要通过维护词典,在切分语句时,将语句的每个字符串与词表中的词逐一进行匹配,找到则切分,否则不予切分。

正向最大匹配算法:这里需要知道两点,一个是分词词典(也即是已经分词过的词典),另一个是需要被分词的文档。假定分词词典中的最长词有iii个汉子字符串,则用被处理文档的当前字符串中的前i" role="presentation" style="position: relative;">iii个字作为匹配字段,查找字典。若此时分词词典中存在这样一个字符串,则匹配成功,而此时被匹配的字段切分出来。如果匹配失败,将匹配字段中的最后一个字去掉,对此时剩下的字串重新与分词词典进行匹配,如此下去直到匹配成功。也即是切分出一个词或剩余字串的长度为零为止,这个时候才是匹配了一轮,接着进行下一个ii<script type="math/tex" id="MathJax-Element-3">i</script>字字串的匹配,方法同上,直到文档被扫描完为止。

正向最大匹配算法的原理比较简单,也没有用到机器学习和概率论,统计的一些知识,下面贴出代码:

# 定义逆向最大匹配类
class IMM(object):# 初始化得到给定的字典中的所有词和长度最大的词def __init__(self, dic_path):self.dictionary = set()self.maximum = 0#读取词典with open(dic_path, 'r', encoding='utf8') as f:for line in f:# strip():只能删除开头或是结尾的字符,不能删除中间部分的字符line = line.strip()print('line:',line)if not line:continueself.dictionary.add(line)if len(line)>=self.maximum:self.maximum = len(line)print('self.dictionary:',self.dictionary,'\n','self.maximum:',self.maximum) # 该方法可切分新得到的词组    def cut(self, text):result = []index = len(text)print('index:',index)while index > 0:word = Nonefor size in range(self.maximum, 0, -1):if index - size < 0:continueprint('index - size=>',index - size,':',index)piece = text[(index - size):index]print('piece:',piece)# 判断该词是否在词典中if piece in self.dictionary:word = pieceresult.append(word)index -= sizebreakif word is None:index -= 1return result[::-1]def main():text = "南京市长江大桥"# 词典的地址tokenizer = IMM(r'./imm_dic.utf8')print(tokenizer.cut(text))main()

运行结果:

line: 南京市
line: 南京市长
line: 长江大桥
line: 人名解放军
line: 大桥
self.dictionary: {'人名解放军', '长江大桥', '大桥', '南京市长', '南京市'} self.maximum: 5
index: 7
index - size=> 2 : 7
piece: 市长江大桥
index - size=> 3 : 7
piece: 长江大桥
index - size=> 0 : 3
piece: 南京市
['南京市', '长江大桥']

而且这里的分词词典是自己定义好的,作为简单的demo学习一下。

参考:《pytho自然语言处理实战 核心技术与算法》

中文分词之正向最大匹配算法相关推荐

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

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

  2. java正向最大匹配算法_java中文分词之正向最大匹配法实例代码

    前言 基于词典的正向最大匹配算法(最长词优先匹配),算法会根据词典文件自动调整最大长度,分词的好坏完全取决于词典. 所谓词典正向最大匹配就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子 ...

  3. python分词代码_中文分词--最大正向匹配算法python实现

    最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描).例如:词典中 ...

  4. 2022-0828-0640,中文分词,逆向最大匹配算法 RMM

    # encoding:utf8text = "我们这帮人都是辛苦的打工人" words = ["我", "们", "我们" ...

  5. 分词算法----正向和逆向最大匹配算法(含Python代码实现)

    文章目录 分词算法(Segmentation Method) 最大匹配算法(Maximum Matching) 需要的前提 正向最大匹配算法(Forwards Maximum Match,FMM) 逆 ...

  6. php中文分词的实现方案

    中文分词是指将中文文本按照一定的规则,分割成一个个有意义的词语的过程.其原理可以简述如下: 词库:中文分词需要一个包含常用词语的词库,该词库可以手动构建,也可以从现有的数据中自动生成. 分词算法:中文 ...

  7. 基于词表的中文分词算法

    基于词表的中文分词算法 正向最大匹配法 对于输入的一段文本从左至右,以贪心的方式切分出当前位置上长度最大的词.正向最大匹配法是基于词典的分词方法,其分词原理是:单词的颗粒度越大,所能表示的含义越确切. ...

  8. 详细介绍NLP中文分词原理及分词工具

    基于词表的分词方法 正向最大匹配算法FMM 从左到右扫描文本,得到词的最大匹配. 案例分析: 用正向最大匹配法对"秦皇岛今天晴空万里"进行中文分词,见下表. 词典 :"秦 ...

  9. 正向最大匹配算法 python代码_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

最新文章

  1. VS code for python开发利器
  2. matlab 图论工具箱
  3. python之IO操作
  4. 在android上面让TextView 过多的文字实现有滚动条 scrollview
  5. Linux-部署应用到生产环境Tomcat项目-全流程(图文教程)
  6. Atom插件主题推荐
  7. MVC Html.AntiForgeryToken() 防止CSRF***
  8. C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信
  9. ubuntu 12.04 samba 服务器搭建
  10. Smack 4.3.2 发布,XMPP(jabber) 的 Java 客户端类库
  11. Mac使用终端压缩加密文件
  12. Domino学习笔记之邮件发送程序
  13. mysql gtid 集群_Docker搭建MySQL主从集群,基于GTID
  14. php 文件上传框架,Laravel框架实现文件上传的方法分析
  15. c++ 中类重复定义的分析与解决办法
  16. 学习一下什么是SRE和DevOps
  17. 双绞线有两种接法:EIA/TIA 568B标准和EIA/TIA 568A标准。具体接法如下:
  18. CAD中怎么管理线缆CAD图层?
  19. 【信息检索导论】第一章 布尔检索
  20. iOS内容含有隐藏功能、第三方支付等被拒4次的心路历程

热门文章

  1. OpenGL fragmentlist片段列表的实例
  2. C++类特殊成员函数
  3. C++的#include_next
  4. 04_05_06:设置线型风格(设置线型风格)、区域着色 (Shading Regions)、设置Spines
  5. 3.QT中的debug相关的函数,以及文件锁的使用
  6. Linux 常见命令之Find \; +结合其它命令使用案例详解
  7. 极度随机树ExtraTreesClassifier
  8. java 博客系统_讲解开源项目:5分钟搭建私人Java博客系统
  9. 同时读取两个USB摄像头采集
  10. Qt Creator的下载和安装