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基础教程之缩进介绍
Aug 29 Python
在Django的视图中使用form对象的方法
Jul 18 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
python mysql中in参数化说明
Jun 05 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
python中doctest库实例用法
Dec 31 Python
Python制作一个随机抽奖小工具的实现
Jul 07 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
PHP的explode和implode的使用说明
2011/07/17 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
PHP中设置时区方法小结
2012/06/03 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
jquery 将disabled的元素置为enabled的三种方法
2009/07/25 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
JS作用域深度解析
2016/12/29 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python合并文本文件示例
2014/02/07 Python
Python实现在线程里运行scrapy的方法
2015/04/07 Python
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Django 实现图片上传和下载功能
2020/12/31 Python
python 对xml解析的示例
2021/02/27 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
投标承诺书怎么写
2014/05/24 职场文书
留学生求职信
2014/06/03 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
中标通知书
2015/04/17 职场文书
交心谈心活动总结
2015/05/11 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
初中生物教学反思
2016/02/20 职场文书