Python自然语言处理之词干,词形与最大匹配算法代码详解


Posted in Python onNovember 16, 2017

本文主要对词干提取及词形还原以及最大匹配算法进行了介绍和代码示例,Python实现,下面我们一起看看具体内容。

自然语言处理中一个很重要的操作就是所谓的stemming和lemmatization,二者非常类似。它们是词形规范化的两类重要方式,都能够达到有效归并词形的目的,二者既有联系也有区别。

1、词干提取(stemming)

定义:Stemmingistheprocessforreducinginflected(orsometimesderived)wordstotheirstem,baseorrootform—generallyawrittenwordform.

解释一下,Stemming是抽取词的词干或词根形式(不一定能够表达完整语义)。

NLTK中提供了三种最常用的词干提取器接口,即Porterstemmer,LancasterStemmer和SnowballStemmer。

PorterStemmer基于Porter词干提取算法,来看例子

>>> from nltk.stem.porter import PorterStemmer 
>>> porter_stemmer = PorterStemmer() 
>>> porter_stemmer.stem(‘maximum') 
u'maximum' 
>>> porter_stemmer.stem(‘presumably') 
u'presum' 
>>> porter_stemmer.stem(‘multiply') 
u'multipli' 
>>> porter_stemmer.stem(‘provision') 
u'provis' 
>>> porter_stemmer.stem(‘owed') 
u'owe'

Lancaster Stemmer 基于Lancaster 词干提取算法,来看例子

>>> from nltk.stem.lancaster import LancasterStemmer 
>>> lancaster_stemmer = LancasterStemmer() 
>>> lancaster_stemmer.stem(‘maximum') 
‘maxim' 
>>> lancaster_stemmer.stem(‘presumably') 
‘presum' 
>>> lancaster_stemmer.stem(‘presumably') 
‘presum' 
>>> lancaster_stemmer.stem(‘multiply') 
‘multiply' 
>>> lancaster_stemmer.stem(‘provision') 
u'provid' 
>>> lancaster_stemmer.stem(‘owed') 
‘ow'

Snowball Stemmer基于Snowball 词干提取算法,来看例子

>>> from nltk.stem import SnowballStemmer 
>>> snowball_stemmer = SnowballStemmer(“english”) 
>>> snowball_stemmer.stem(‘maximum') 
u'maximum' 
>>> snowball_stemmer.stem(‘presumably') 
u'presum' 
>>> snowball_stemmer.stem(‘multiply') 
u'multipli' 
>>> snowball_stemmer.stem(‘provision') 
u'provis' 
>>> snowball_stemmer.stem(‘owed') 
u'owe'

2、词形还原(lemmatization)

定义:Lemmatisation(orlemmatization)inlinguistics,istheprocessofgroupingtogetherthedifferentinflectedformsofawordsotheycanbeanalysedasasingleitem.

可见,Lemmatisation是把一个任何形式的语言词汇还原为一般形式(能表达完整语义)。相对而言,词干提取是简单的轻量级的词形归并方式,最后获得的结果为词干,并不一定具有实际意义。词形还原处理相对复杂,获得结果为词的原形,能够承载一定意义,与词干提取相比,更具有研究和应用价值。

我们会在后面给出一个同MaxMatch算法相结合的更为复杂的例子。

这里介绍下词干提取和词形还原的联系与区别:

词形还原(lemmatization),是把一个任何形式的语言词汇还原为一般形式(能表达完整语义),而词干提取

(stemming)是抽取词的词干或词根形式(不一定能够表达完整语义)。词形还原和词干提取是词形规范化的两类

重要方式,都能够达到有效归并词形的目的,二者既有联系也有区别

现将共同点和联系总结为以下4方面:

(1)目标一致。词干提取和词形还原的目标均为将词的屈折形态或派生形态简化或归并为词干(stem)

或原形的基础形式,都是一种对词的不同形态的统一归并的过程。

(2)结果部分交叉。词干提取和词形还原不是互斥关系,其结果是有部分交叉的。一部分词利用这两类方法都能达到相同的词形转换效果。如“dogs”的词

干为“dog”,其原形也为“dog”。

(3)主流实现方法类似。目前实现词干提取和词形还原的主流实现方法均是利用语言中存在的规则或利用词典映射提取词干或获得词的原形。

(4)应用领域相似。主要应用于信息检索和文本、自然语言处理等方面,二者均是这些应用的基本步骤

二者的区别归纳为以下5方面:

(1)在原理上,词干提取主要是采用“缩减”的方法,将词转换为词干,如将“cats”处理为“cat”,将“effective”处理为“effect”。而词形还原主要采用“转变”

的方法,将词转变为其原形,如将“drove”处理为“drive”,将“driving”处理为“drive”。

(2)在复杂性上,词干提取方法相对简单,词形还原则需要返回词的原形,需要对词形进行分析,不仅要进行词缀的转化,还要进行词性识别,区分相同词形但

原形不同的词的差别。词性标注的准确率也直接影响词形还原的准确率,因此,词形还原更为复杂。

(3)在实现方法上,虽然词干提取和词形还原实现的主流方法类似,但二者在具体实现上各有侧重。词干提取的实现方法主要利用规则变化进行词缀的去除和缩减,从而达到词的简化效果。词形还原则相对较复杂,有复杂的形态变化,单纯依据规则无法很好地完成。其更依赖于词典,进行词形变化和原形的映射,生成词典中的有效词。

(4)在结果上,词干提取和词形还原也有部分区别。词干提取的结果可能并不是完整的、具有意义的词,而只是词的一部分,如“revival”词干提取的结果为“reviv”,“ailiner”词干提取的结果为“airlin”。而经词形还原处理后获得的结果是具有一定意义的、完整的词,一般为词典中的有效词。

(5)在应用领域上,同样各有侧重。虽然二者均被应用于信息检索和文本处理中,但侧重不同。词干提取更多被应用于信息检索领域,如Solr、Lucene等,用于扩展检索,粒度较粗。词形还原更主要被应用于文本挖掘、自然语言处理,用于更细粒度、更为准确的文本分析和表达

相对而言,词干提取是简单的轻量级的词形归并方式,最后获得的结果为词干,并不一定具有实际意义。词形还原处理相对复杂,获得结果为词的原形,能够承载一定意义,与词干提取相比,更具有研究和应用价值

3、最大匹配算法(MaxMatch)

MaxMatch算法在中文自然语言处理中常常用来进行分词(或许从名字上你已经能想到它是基于贪婪策略设计的一种算法)。通常,英语中一句话里的各个词汇之间通过空格来分割,这是非常straightforward的,但是中文却没有这个遍历。例如“我爱中华人民共和国”,这句话被分词的结果可能是这样的{‘我',‘爱',‘中华',‘人民',‘共和国'},又或者是{‘我',‘爱',‘中华人民共和国'},显然我们更倾向于后者的分词结果。因为‘中华人民共和国'显然是一个专有名词(把这样一个词分割来看显然并不明智)。我们选择后者的策略就是所谓的MaxMatch,即最大匹配。因为‘中华人民共和国'这个词显然要比‘中华',‘人民',‘共和国'这些词都长。

我们可以通过一个英文的例子来演示MaxMatch算法(其实中文处理的道理也是一样的)。算法从右侧开始逐渐减少字符串长度,以此求得可能匹配的最大长度的字符串。考虑到我们所获得的词汇可能包含有某种词型的变化,所以其中使用了Lemmatisation,然后在词库里进行匹配查找。

from nltk.stem import WordNetLemmatizer 
from nltk.corpus import words 
 
wordlist = set(words.words()) 
wordnet_lemmatizer = WordNetLemmatizer() 
 
def max_match(text): 
  pos2 = len(text) 
  result = '' 
  while len(text) > 0:     
    word = wordnet_lemmatizer.lemmatize(text[0:pos2]) 
    if word in wordlist: 
      result = result + text[0:pos2] + ' ' 
      text = text[pos2:] 
      pos2 = len(text) 
    else: 
      pos2 = pos2-1         
  return result[0:-1]

来看看算法的实现效果

>>> string = 'theyarebirds' 
>>> print(max_match(string)) 
they are birds

当然,上述代码尚有一个不足,就是当字符串中存在非字母字符时(例如数字标点等),它可能会存在一些问题。有兴趣的读者不妨自己尝试完善改进这个版本的实现。

总结

以上就是本文关于Python自然语言处理之词干,词形与MaxMatch算法代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。

Python 相关文章推荐
python使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
Python同时向控制台和文件输出日志logging的方法
May 26 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
在Django下创建项目以及设置settings.py教程
Dec 03 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python新手学习装饰器
Jun 04 Python
Pygame框架实现飞机大战
Aug 07 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
用不到50行的Python代码构建最小的区块链
Nov 16 #Python
python内置函数:lambda、map、filter简单介绍
Nov 16 #Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 #Python
高质量Python代码编写的5个优化技巧
Nov 16 #Python
python使用fork实现守护进程的方法
Nov 16 #Python
详解Python map函数及Python map()函数的用法
Nov 16 #Python
python中lambda()的用法
Nov 16 #Python
You might like
注册页面之前先验证用户名是否存在的php代码
2012/07/14 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
jquery trim() 功能源代码
2011/02/14 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
js点击选择文本的方法
2015/02/09 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
Python字典实现伪切片功能
2020/10/28 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
大学生农村教师实习自我鉴定
2013/09/21 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
节水倡议书范文
2014/04/15 职场文书
烟台的海导游词
2015/02/02 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js