在Python中使用NLTK库实现对词干的提取的教程


Posted in Python onApril 08, 2015

什么是词干提取?

在语言形态学和信息检索里,词干提取是去除词缀得到词根的过程─—得到单词最一般的写法。对于一个词的形态词根,词干并不需要完全相同;相关的词映射到同一个词干一般能得到满意的结果,即使该词干不是词的有效根。从1968年开始在计算机科学领域出现了词干提取的相应算法。很多搜索引擎在处理词汇时,对同义词采用相同的词干作为查询拓展,该过程叫做归并。

一个面向英语的词干提取器,例如,要识别字符串“cats”、“catlike”和“catty”是基于词根“cat”;“stemmer”、“stemming”和“stemmed”是基于词根“stem”。一根词干提取算法可以简化词 “fishing”、“fished”、“fish”和“fisher” 为同一个词根“fish”。
技术方案的选择

Python和R是数据分析的两种主要语言;相对于R,Python更适合有大量编程背景的数据分析初学者,尤其是已经掌握Python语言的程序员。所以我们选择了Python和NLTK库(Natual Language Tookit)作为文本处理的基础框架。此外,我们还需要一个数据展示工具;对于一个数据分析师来说,数据库的冗繁安装、连接、建表等操作实在是不适合进行快速的数据分析,所以我们使用Pandas作为结构化数据和分析工具。
环境搭建

我们使用的是Mac OS X,已预装Python 2.7.

安装NLTK

sudo pip install nltk

安装Pandas

sudo pip install pandas

对于数据分析来说,最重要的是分析结果,iPython notebook是必备的一款利器,它的作用在于可以保存代码的执行结果,例如数据表格,下一次打开时无需重新运行即可查看。

安装iPython notebook

sudo pip install ipython

创建一个工作目录,在工作目录下启动iPython notebook,服务器会开启http://127.0.0.1:8080页面,并将创建的代码文档保存在工作目录之下。

mkdir Codes
cd Codes
ipython notebook

文本处理

数据表创建

使用Pandas创建数据表 我们使用得到的样本数据,建立DataFrame——Pandas中一个支持行、列的2D数据结构。

from pandas import DataFrame
import pandas as pd
d = ['pets insurance','pets insure','pet insurance','pet insur','pet insurance"','pet insu']
df = DataFrame(d)
df.columns = ['Words']
df

显示结果

在Python中使用NLTK库实现对词干的提取的教程

NLTK分词器介绍

RegexpTokenizer:正则表达式分词器,使用正则表达式对文本进行处理,就不多作介绍。
PorterStemmer:波特词干算法分词器,原理可看这里:http://snowball.tartarus.org/algorithms/english/stemmer.html
第一步,我们创建一个去除标点符号等特殊字符的正则表达式分词器:

import nltk
tokenizer = nltk.RegexpTokenizer(r'w+')

接下来,对准备好的数据表进行处理,添加词干将要写入的列,以及统计列,预设默认值为1:

df["Stemming Words"] = ""
df["Count"] = 1

读取数据表中的Words列,使用波特词干提取器取得词干:

j = 0
while (j <= 5):
  for word in tokenizer.tokenize(df["Words"][j]):
    df["Stemming Words"][j] = df["Stemming Words"][j] + " " + nltk.PorterStemmer().stem_word(word)
  j += 1
df

Good!到这一步,我们已经基本上实现了文本处理,结果显示如下:

在Python中使用NLTK库实现对词干的提取的教程

分组统计

在Pandas中进行分组统计,将统计表格保存到一个新的DataFrame结构uniqueWords中:

uniqueWords = df.groupby(['Stemming Words'], as_index = False).sum().sort(['Count'])
uniqueWords

在Python中使用NLTK库实现对词干的提取的教程

注意到了吗?依然还有一个pet insu未能成功处理。

拼写检查

对于用户拼写错误的词语,我们首先想到的是拼写检查,针对Python我们可以使用enchant:

sudo pip install enchant

使用enchant进行拼写错误检查,得到推荐词:

import enchant
from nltk.metrics import edit_distance
class SpellingReplacer(object):
  def __init__(self, dict_name='en', max_dist=2):
    self.spell_dict = enchant.Dict(dict_name)
    self.max_dist = 2
  def replace(self, word):
    if self.spell_dict.check(word):
      return word
    suggestions = self.spell_dict.suggest(word)
    if suggestions and edit_distance(word, suggestions[0]) <=
      self.max_dist:
      return suggestions[0]
    else:
      return word

from replacers import SpellingReplacer
replacer = SpellingReplacer()
replacer.replace('insu')

'insu'

但是,结果依然不是我们预期的“insur”。能不能换种思路呢?
算法特殊性

用户输入非常重要的特殊性来自于行业和使用场景。采取通用的英语大词典来进行拼写检查,无疑是行不通的,并且某些词语恰恰是拼写正确,但本来却应该是另一个词。但是,我们如何把这些背景信息和数据分析关联起来呢?

经过一番思考,我认为最重要的参考库恰恰就在已有的数据分析结果中,我们回来看看:

在Python中使用NLTK库实现对词干的提取的教程

已有的5个“pet insur”,其实就已经给我们提供了一份数据参考,我们已经可以对这份数据进行聚类,进一步除噪。

相似度计算

对已有的结果进行相似度计算,将满足最小偏差的数据归类到相似集中:

import Levenshtein
minDistance = 0.8
distance = -1
lastWord = ""
j = 0
while (j < 1):
   lastWord = uniqueWords["Stemming Words"][j]
   distance = Levenshtein.ratio(uniqueWords["Stemming Words"][j], uniqueWords["Stemming Words"][j + 1])
   if (distance > minDistance):
    uniqueWords["Stemming Words"][j] = uniqueWords["Stemming Words"][j + 1]
  j += 1
uniqueWords

查看结果,已经匹配成功!

在Python中使用NLTK库实现对词干的提取的教程

最后一步,重新对数据结果进行分组统计:

uniqueWords = uniqueWords.groupby(['Stemming Words'], as_index = False).sum()
uniqueWords

到此,我们已经完成了初步的文本处理。

在Python中使用NLTK库实现对词干的提取的教程

Python 相关文章推荐
python字符串连接的N种方式总结
Sep 17 Python
浅析Python中的多进程与多线程的使用
Apr 07 Python
python开发简易版在线音乐播放器
Mar 03 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
python使用递归的方式建立二叉树
Jul 03 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
python绘制BA无标度网络示例代码
Nov 21 Python
Python vtk读取并显示dicom文件示例
Jan 13 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
Mar 10 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
PyTorch中的拷贝与就地操作详解
Dec 09 Python
Python可视化神器pyecharts绘制水球图
Jul 07 Python
使用Python操作Elasticsearch数据索引的教程
Apr 08 #Python
用Python实现协同过滤的教程
Apr 08 #Python
在Python中调用ggplot的三种方法
Apr 08 #Python
Python字符串和文件操作常用函数分析
Apr 08 #Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 #Python
python smtplib模块发送SSL/TLS安全邮件实例
Apr 08 #Python
python复制与引用用法分析
Apr 08 #Python
You might like
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
windows系统下Python环境搭建教程
2017/03/28 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
翻译学院毕业生自荐书
2014/02/02 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
社区食品安全实施方案
2014/03/28 职场文书
学校领导班子对照检查材料
2014/09/24 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
诚信教育主题班会
2015/08/13 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP
Python日志模块logging用法
2022/06/05 Python