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删除文件示例分享
Jan 28 Python
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 Python
按日期打印Python的Tornado框架中的日志的方法
May 02 Python
详解Django框架中的视图级缓存
Jul 23 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
详解python的ORM中Pony用法
Feb 09 Python
python 调用有道api接口的方法
Jan 03 Python
Python中捕获键盘的方式详解
Mar 28 Python
python打造爬虫代理池过程解析
Aug 15 Python
python pptx复制指定页的ppt教程
Feb 14 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 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
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
php计算税后工资的方法
2015/07/28 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
Python列表推导式的使用方法
2013/11/21 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
python实现扫雷小游戏
2020/04/24 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
劳资人员岗位职责
2013/12/19 职场文书
自我鉴定注意事项
2014/01/19 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
优秀校长事迹材料
2014/12/24 职场文书
歼十出击观后感
2015/06/11 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
php去除deprecated的实例方法
2021/11/17 PHP
python 判断文件或文件夹是否存在
2022/03/18 Python
Python如何使用循环结构和分支结构
2022/04/13 Python
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS