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获取目录下所有文件的方法
Jun 01 Python
Python计算三维矢量幅度的方法
Jun 15 Python
Python基于有道实现英汉字典功能
Jul 25 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
python处理html转义字符的方法详解
Jul 01 Python
对python的文件内注释 help注释方法
May 23 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
keras中的卷积层&池化层的用法
May 22 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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数据库连接
2006/10/09 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
Python中functools模块函数解析
2017/03/12 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
Python实现完整的事务操作示例
2017/06/20 Python
pytorch 预训练层的使用方法
2019/08/20 Python
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
清明节扫墓活动方案
2014/03/02 职场文书
党员承诺践诺书
2014/05/20 职场文书
干部对照检查材料范文
2014/08/26 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
2015年工程师工作总结
2015/04/30 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js