用python实现前向分词最大匹配算法的示例代码


Posted in Python onAugust 06, 2020

理论介绍

分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。

可以将中文分词方法简单归纳为:

1.基于词表的分词方法
2.基于统计的分词方法
3.基于序列标记的分词方法

其中,基于词表的分词方法最为简单,根据起始匹配位置不同可以分为:

1.前向最大匹配算法
2.后向最大匹配算法
3.双向最大匹配算法

三种方法思想都很简单,今天就用python实现前向最大匹配算法。

word分词是一个Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。能通过自定义配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词性标注、同义标注、反义标注、拼音标注等功能。同时还无缝和Lucene、Solr、ElasticSearch、Luke集成。

前向最大匹配算法

前向最大匹配算法,顾名思义,就是从待分词句子的左边向右边搜索,寻找词的最大匹配。我们需要规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到字典中的词或者成为单字。

具体代码实现

获取分词函数:getSeg(text)

def getSeg(text):
  # 句子为空
  if not text:
    return ''

  # 句子成为一个词
  if len(text) == 1:
    return text

  # 此处写了一个递归方法
  if text in word_dict:
    return text
  else:
    small = len(text) - 1
    text = text[0:small]
    return getSeg(text)

主函数:main()

def main():
  global test_str, word_dict
  test_str = test_str.strip()
  # 正向最大匹配分词测试 最大长度5
  max_len = max(len(word) for word in word_dict)
  result_str = [] # 保存分词结果
  result_len = 0
  print('input :', test_str)
  while test_str:
    tmp_str = test_str[0:max_len]
    seg_str = getSeg(tmp_str)
    seg_len = len(seg_str)
    result_len = result_len + seg_len

    if seg_str.strip():
      result_str.append(seg_str)
    test_str = test_str[seg_len:]

  print('output :', result_str)

字典:

word_dict = ['混沌', 'Logistic', '算法', '图片', '加密', '利用', '还原', 'Lena', '验证', 'Baboon', '效果']

测试句子:

test_str = '''一种基于混沌Logistic加密算法的图片加密与还原的方法,并利用Lena图和Baboon图来验证这种加密算法的加密效果。'''

分词结果

用python实现前向分词最大匹配算法的示例代码

到此这篇关于用python实现前向分词最大匹配算法的示例代码的文章就介绍到这了,更多相关python 前向分词最大匹配算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python开发常用的一些开源Package分享
Feb 14 Python
Python中使用装饰器时需要注意的一些问题
May 11 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
python 顺时针打印矩阵的超简洁代码
Nov 14 Python
python多进程读图提取特征存npy
May 21 Python
Django实现CAS+OAuth2的方法示例
Oct 30 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
详解Python 中的容器 collections
Aug 17 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
python实现图片批量压缩
Apr 24 Python
python实现层次聚类的方法
Nov 01 Python
Python爬虫防封ip的一些技巧
Aug 06 #Python
Python无损压缩图片的示例代码
Aug 06 #Python
通过实例简单了解python yield使用方法
Aug 06 #Python
Python切片列表字符串如何实现切换
Aug 06 #Python
Python爬虫爬取微信朋友圈
Aug 06 #Python
Python变量及数据类型用法原理汇总
Aug 06 #Python
基于logstash实现日志文件同步elasticsearch
Aug 06 #Python
You might like
CI框架给视图添加动态数据
2014/12/01 PHP
完美的php分页类
2017/10/24 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
JS中的==运算: [''] == false —>true
2016/07/24 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
Python中for循环详解
2014/01/17 Python
Python切片知识解析
2016/03/06 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
pandas 时间格式转换的实现
2019/07/06 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
西安当代医院管理研究院笔试题
2015/12/11 面试题
十佳大学生村官事迹
2014/01/09 职场文书
酒吧创业计划书
2014/01/18 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
开业典礼致辞
2015/07/29 职场文书
初中政治教学反思
2016/02/23 职场文书