python实现机械分词之逆向最大匹配算法代码示例


Posted in Python onDecember 13, 2017

逆向最大匹配方法

有正即有负,正向最大匹配算法大家可以参阅https://3water.com/article/127404.htm

逆向最大匹配分词是中文分词基本算法之一,因为是机械切分,所以它也有分词速度快的优点,且逆向最大匹配分词比起正向最大匹配分词更符合人们的语言习惯。逆向最大匹配分词需要在已有词典的基础上,从被处理文档的末端开始匹配扫描,每次取最末端的i个字符(分词所确定的阈值i)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。而且选择的阈值越大,分词越慢,但准确性越好。

逆向最大匹配算法python实现:

分词文本示例:

python实现机械分词之逆向最大匹配算法代码示例

分词词典words.xlsx示例:

python实现机械分词之逆向最大匹配算法代码示例

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 
 
''''' 
用逆向最大匹配法分词,不去除停用词 
''' 
import codecs 
import xlrd 
 
#读取待分词文本,readlines()返回句子list 
def readfile(raw_file_path): 
  with codecs.open(raw_file_path,"r",encoding="ANSI") as f: 
    raw_file=f.readlines() 
    return raw_file 
#读取分词词典,返回分词词典list 
def read_dic(dic_path): 
  excel = xlrd.open_workbook(dic_path) 
  sheet = excel.sheets()[0] 
  # 读取第二列的数据 
  data_list = list(sheet.col_values(1))[1:] 
  return data_list 
#逆向最大匹配法分词 
def cut_words(raw_sentences,word_dic): 
  word_cut=[] 
  #最大词长,分词词典中的最大词长,为初始分词的最大词长 
  max_length=max(len(word) for word in word_dic) 
  for sentence in raw_sentences: 
    #strip()函数返回一个没有首尾空白字符(‘\n'、‘\r'、‘\t'、‘')的sentence,避免分词错误 
    sentence=sentence.strip() 
    #单句中的字数 
    words_length = len(sentence) 
    #存储切分出的词语 
    cut_word_list=[] 
    #判断句子是否切分完毕 
    while words_length > 0: 
      max_cut_length = min(words_length, max_length) 
      for i in range(max_cut_length, 0, -1): 
        #根据切片性质,截取words_length-i到words_length-1索引的字,不包括words_length,所以不会溢出 
        new_word = sentence[words_length - i: words_length] 
        if new_word in word_dic: 
          cut_word_list.append(new_word) 
          words_length = words_length - i 
          break 
        elif i == 1: 
          cut_word_list.append(new_word) 
          words_length = words_length - 1 
    #因为是逆向最大匹配,所以最终需要把结果逆向输出,转换为原始顺序 
    cut_word_list.reverse() 
    words="/".join(cut_word_list) 
    #最终把句子首端的分词符号删除,是避免以后将分词结果转化为列表时会出现空字符串元素 
    word_cut.append(words.lstrip("/")) 
  return word_cut 
#输出分词文本 
def outfile(out_path,sentences): 
  #输出模式是“a”即在原始文本上继续追加文本 
  with codecs.open(out_path,"a","utf8") as f: 
    for sentence in sentences: 
      f.write(sentence) 
  print("well done!") 
def main(): 
  #读取待分词文本 
  rawfile_path = r"逆向分词文本.txt" 
  raw_file=readfile(rawfile_path) 
  #读取分词词典 
  wordfile_path = r"words.xlsx" 
  words_dic = read_dic(wordfile_path) 
  #逆向最大匹配法分词 
  content_cut = cut_words(raw_file,words_dic) 
  #输出文本 
  outfile_path = r"分词结果.txt" 
  outfile(outfile_path,content_cut) 
if __name__=="__main__": 
  main()

python实现机械分词之逆向最大匹配算法代码示例

总结

分析分词结果可以知道,机械分词的效果优劣,一方面与分词匹配算法有关,另外一方面极其依赖分词词典。所以若想得到好的分词效果,处理相关领域的文本时,需要在分词词典中加入特定领域的词汇。

以上就是本文关于python实现机械分词之逆向最大匹配算法代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
Python多线程扫描端口代码示例
Feb 09 Python
tensorflow训练中出现nan问题的解决
Feb 10 Python
基于Python列表解析(列表推导式)
Jun 23 Python
python简单操作excle的方法
Sep 12 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
PyTorch实现AlexNet示例
Jan 14 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
python归并排序算法过程实例讲解
Nov 04 Python
Python截图并保存的具体实例
Jan 14 Python
Python语言描述KNN算法与Kd树
Dec 13 #Python
Python xlwt设置excel单元格字体及格式
Apr 18 #Python
Python语言实现百度语音识别API的使用实例
Dec 13 #Python
Python通过matplotlib绘制动画简单实例
Dec 13 #Python
Python数据结构与算法之字典树实现方法示例
Dec 13 #Python
Python数据结构与算法之完全树与最小堆实例
Dec 13 #Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 #Python
You might like
phpMyadmin 用户权限中英对照
2010/04/02 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python实现爬取逐浪小说的方法
2015/07/07 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
Python内建模块struct实例详解
2018/02/02 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
周年庆典邀请函范文
2014/01/23 职场文书
门诊手术室工作制度
2014/01/30 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
财会专业大学生求职信
2014/09/26 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
期末个人总结范文
2015/02/13 职场文书
吴仁宝观后感
2015/06/09 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
使用HttpSessionListener监听器实战
2022/03/17 Java/Android
redis复制有可能碰到的问题汇总
2022/04/03 Redis