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 相关文章推荐
bpython 功能强大的Python shell
Feb 16 Python
50行Python代码实现人脸检测功能
Jan 23 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
Dec 05 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
Flask框架模板继承实现方法分析
Jul 31 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
TensorFlow tensor的拼接实例
Jan 19 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
PyTorch的torch.cat用法
Jun 28 Python
详解python第三方库的安装、PyInstaller库、random库
Mar 03 Python
Python中的 No Module named ***问题及解决
Jul 23 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
php模板中出现空行解决方法
2011/03/08 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
javascript的this关键字详解
2019/05/20 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
python实现将元祖转换成数组的方法
2015/05/04 Python
python中使用序列的方法
2015/08/03 Python
python文本数据处理学习笔记详解
2019/06/17 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
Python sys模块常用方法解析
2020/02/20 Python
详解Python3中的 input() 函数
2020/03/18 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
公司活动邀请函
2014/01/24 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
2014年团总支工作总结
2014/11/21 职场文书
优秀教师个人材料
2014/12/15 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis