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 多进程通信模块的简单实现
Feb 20 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
详解Python网络爬虫功能的基本写法
Jan 28 Python
利用python批量修改word文件名的方法示例
Oct 17 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
Python动态语言与鸭子类型详解
Jul 01 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 Python
Python 居然可以在 Excel 中画画你知道吗
Feb 15 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 信息采集程序代码
2009/03/17 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
PHP目录操作实例总结
2016/09/27 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
Python中的Numpy入门教程
2014/04/26 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
工程业务员岗位职责
2013/12/31 职场文书
安全保证书范文
2014/04/29 职场文书
节水倡议书
2015/01/19 职场文书
2015个人半年总结范文
2015/03/09 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python