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 IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
python爬虫之百度API调用方法
Jun 11 Python
Python编程之字符串模板(Template)用法实例分析
Jul 22 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
Python3实现腾讯云OCR识别
Nov 27 Python
python代码 输入数字使其反向输出的方法
Dec 22 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
python正则表达式实例代码
Mar 03 Python
python中实现栈的三种方法
Dec 19 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文件上传类实例详解
2016/04/08 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
js动态切换图片的方法
2015/01/20 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python中遍历列表的方法总结
2019/06/27 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
安卓程序员求职信
2014/02/28 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
承诺书格式范文
2014/06/03 职场文书
学校火灾防控方案
2014/06/09 职场文书
免职证明样本
2014/10/23 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
五一劳动节活动总结
2015/02/09 职场文书
行政处罚事先告知书
2015/07/01 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL