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制作简单的钢琴程序的教程
Apr 01 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
了解不常见但是实用的Python技巧
May 23 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 Python
django API 中接口的互相调用实例
Apr 01 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
python math模块的基本使用教程
Jan 16 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
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
javascript初学者常用技巧
2014/09/02 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python聊天室实例程序分享
2016/01/05 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
​如何愉快地迁移到 Python 3
2019/04/28 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
使用Python的turtle模块画国旗
2019/09/24 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
乌鸦喝水教学反思
2014/02/07 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
党员目标管理责任书
2014/07/25 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
档案接收函格式
2015/01/30 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android