python中文分词教程之前向最大正向匹配算法详解


Posted in Python onNovember 02, 2017

前言

大家都知道,英文的分词由于单词间是以空格进行分隔的,所以分词要相对的容易些,而中文就不同了,中文中一个句子的分隔就是以字为单位的了,而所谓的正向最大匹配和逆向最大匹配便是一种分词匹配的方法,这里以词典匹配说明。

最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的。

正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配。

首先我们可以规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到或者成为单字。

下面话不多说了,来一起看看详细的介绍吧。

实例:

S1="计算语言学课程是三个课时" ,设定最大词长MaxLen = 5 ,S2= " "

字典中含有三个词:[计算语言学]、[课程]、[课时]

    (1)S2="";S1不为空,从S1左边取出候选子串W="计算语言学";

    (2)查词表,“计算语言学”在词表中,将W加入到S2中,S2=“计算语言学/ ”, 并将W从S1中去掉,此时S1="课程是三个课时";

    (3)S1不为空,于是从S1左边取出候选子串W="课程是三个";

    (4)查词表,W不在词表中,将W最右边一个字去掉,得到W="课程是三";

    (5)查词表,W不在词表中,将W最右边一个字去掉,得到W="课程是";

    (6)查词表,W不在词表中,将W最右边一个字去掉,得到W="课程"

    (7)查词表,W在词表中,将W加入到S2中,S2=“计算语言学/ 课程/ ”,并 将W从S1中去掉,此时S1="是三个课时";

    (8)S1不为空,于是从S1左边取出候选子串W="是三个课时";

    (9)查词表,W不在词表中,将W最右边一个字去掉,得到W="是三个课";

    (10)查词表,W不在词表中,将W最右边一个字去掉,得到W="是三个";

    (11)查词表,W不在词表中,将W最右边一个字去掉,得到W="是三"

    (12)查词表,W不在词表中,将W最右边一个字去掉,得到W=“是”,这时 W是单字,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ ”,并将 W从S1中去掉,此时S1="三个课时";

    (13)S1不为空,从S1左边取出候选子串W="三个课时";

    (14)查词表,W不在词表中,将W最右边一个字去掉,得到W="三个课";

    (15)查词表,W不在词表中,将W最右边一个字去掉,得到W="三个";

    (16)查词表,W不在词表中,将W最右边一个字去掉,得到W=“三”,这时 W是单字,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ 三/ ”,并 将W从S1中去掉,此时S1="个课时";

    (17)S1不为空,从S1左边取出候选子串W="个课时";

    (18)查词表,W不在词表中,将W最右边一个字去掉,得到W="个课";

    (19)查词表,W不在词表中,将W最右边一个字去掉,得到W=“个”, 这时W是单字,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ 三/ 个/ ",并将W从S1中去掉,此时S1="课时";

    (20)S1不为空,从S1左边取出候选子串W="课时";

    (21)查词表,W在词表中,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ 三/ 个/ 课时/ ",并将W从S1中去掉,此时S1=""。

    (22)S1为空,输出S2作为分词结果,分词过程结束。

而至于为什么选择python这个语言呢?大概是因为我周围人用得少吧,我就想尝试突破,不过我也不讳言,我的C/C++,java等等高级语言用的也不多,虽说编程语言这个东西,基本上只要熟悉一个,其他的都好学,不过我在python上尝到了甜头,索性就用这个语言了。

中文分词算法的Python实现:

脚本接受两个参数,一个是输入文件的路径,另一个是词典的路径。

它的运行方法如下:

python max-match.py <data> <dict>
#!/usr/bin/env python
import cPickle as pickle
import sys

# 词语最大长度为5
window_size=5

def max_match_segment(line, dic):
 # write your code here
 chars = line.decode("utf8")
 words = []
 idx = 0
 # 判断索引是否超过chars的长度
 while idx < len(chars):
  matched = False
  for i in xrange(window_size, 0, -1):
   cand=chars[idx:idx+i].encode("utf8")
   if cand in dic:
    words.append(cand)
    matched = True
    break
  # 判断for中是否匹配到数据
  if not matched:
   i = 1
   words.append(chars[idx].encode("utf8"))
  idx += i

 return words

if __name__=="__main__":

 try:
  fpi=open(sys.argv[1], "r")
 except:
  print >> sys.stderr, "failed to open file"
  sys.exit(1)

 try:
  dic = pickle.load(open(sys.argv[2], "r"))
 except:
  print >> sys.stderr, "failed to load dict %s" % sys.argv[2]
  sys.exit(1)
 try:
  fpo = open("out.txt","w")
 except:
  print >> sys.stderr, "failed to load out.txt"
  sys.exit(1)
 for line in fpi:
  fpo.write("\t".join( max_match_segment(line.strip(), dic) ))

当然,这只是最基础的,还可以有很多高级的优化,比如说改成Trie树版本的,控制最大词长度的等等。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python爬取网站数据保存使用的方法
Nov 20 Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
python中p-value的实现方式
Dec 16 Python
Python-opencv 双线性插值实例
Jan 17 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python根据指定文件生成XML的方法
Jun 29 Python
举例讲解Python装饰器
Dec 24 Python
OpenCV-Python实现轮廓的特征值
Jun 09 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 #Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
Nov 02 #Python
python中实现精确的浮点数运算详解
Nov 02 #Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 #Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 #Python
Python安装Numpy和matplotlib的方法(推荐)
Nov 02 #Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 #Python
You might like
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
js闭包的用途详解
2014/11/09 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
从0开始学Vue
2016/10/27 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
JS实现百度搜索框
2021/02/25 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
python按比例随机切分数据的实现
2019/07/11 Python
python中如何进行连乘计算
2020/05/28 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
产品设计开发计划书
2014/05/07 职场文书
全运会口号
2014/06/20 职场文书
环境科学专业求职信
2014/08/04 职场文书
春游踏青活动方案
2014/08/14 职场文书
委托书的写法
2014/08/30 职场文书
房产协议书范本
2014/10/18 职场文书
老干部座谈会主持词
2015/07/03 职场文书
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android