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 生成不重复的随机数的代码
May 15 Python
Python生成pdf文件的方法
Aug 04 Python
Python3.x中自定义比较函数
Apr 24 Python
python清除字符串里非字母字符的方法
Jul 02 Python
使用python生成目录树
Mar 29 Python
python数字图像处理之高级形态学处理
Apr 27 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
python中的getter与setter你了解吗
Mar 24 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中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
php实现socket推送技术的示例
2017/12/20 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
python实现kMeans算法
2017/12/21 Python
python3+PyQt5实现柱状图
2018/04/24 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
python使用requests.session模拟登录
2019/08/09 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
Weblogc domain问题
2014/01/27 面试题
中餐厅主管的职责范文
2014/02/04 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
奖金申请报告模板
2015/05/15 职场文书
行政处罚告知书
2015/07/01 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers