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

什么是词干提取?

在语言形态学和信息检索里,词干提取是去除词缀得到词根的过程─—得到单词最一般的写法。对于一个词的形态词根,词干并不需要完全相同;相关的词映射到同一个词干一般能得到满意的结果,即使该词干不是词的有效根。从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

立即学习“Python免费学习笔记(深入)”;

sudo pip install pandas

登录后复制

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

安装iPython notebook

sudo pip install ipython

登录后复制

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

mkdir Codescd Codesipython notebook

登录后复制

文本处理

数据表创建

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

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

登录后复制

显示结果

201548161158999.jpg (303×307)

NLTK分词器介绍

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

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

登录后复制

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

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

登录后复制

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

j = 0while (j 

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

201548161224388.jpg (747×299)

分组统计

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

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

登录后复制

201548161257262.jpg (718×127)

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

拼写检查

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

sudo pip install enchant

登录后复制

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

import enchantfrom nltk.metrics import edit_distanceclass 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]) 

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

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

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

201548161325135.jpg (724×132)

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

相似度计算

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

import LevenshteinminDistance = 0.8distance = -1lastWord = ""j = 0while (j  minDistance):    uniqueWords["Stemming Words"][j] = uniqueWords["Stemming Words"][j + 1]  j += 1uniqueWords

登录后复制

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

201548161441655.jpg (689×144)

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

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

登录后复制

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

201548161529041.jpg (643×103)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2294236.html

(0)
上一篇 2025年2月28日 02:37:02
下一篇 2025年2月28日 02:37:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 详解Python中的循环语句的用法

    一、简介       Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性。须重要理解,if、while、for以及与它们相搭配的 else、 elif、break、continue和pass语句。二、详解1、if语句   …

    编程技术 2025年2月28日
    000
  • 在Python中使用CasperJS获取JS渲染生成的HTML内容的教程

    文章摘要:其实这里casperjs与python没有直接关系,主要依赖casperjs调用phantomjs webkit获取html文件内容。长期以来,爬虫抓取 客户端javascript渲染生成的html页面 都极为 困难, java里…

    编程技术 2025年2月28日
    200
  • 详解Python中的多线程编程

    一、简介        多线程编程技术可以实现代码并行性,优化处理能力,同时功能的更小划分可以使代码的可重用性更好。Python中threading和Queue模块可以用来实现多线程编程。二、详解1、线程和进程       进程(有时被称为…

    2025年2月28日 编程技术
    200
  • 用Python解析XML的几种常见方法的介绍

    一、简介        XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web发展到一定阶段的必然产物,既具有S…

    2025年2月28日 编程技术
    200
  • python uuid模块使用实例

    uuid是一种唯一标识,在许多领域作为标识用途。python的uuid模块就是用来生成它的。闲话不说,python提供的生成uuid的方法一共有4种,分别是: 1.从硬件地址和时间生成2.从md5算法生成3.随机生成4.从SHA-1算法生成…

    编程技术 2025年2月28日
    200
  • python内存管理分析

    本文较为详细的分析了python内存管理机制。分享给大家供大家参考。具体分析如下: 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的…

    2025年2月28日
    200
  • python集合类型用法分析

    本文实例分析了python集合类型用法。分享给大家供大家参考。具体分析如下: python的集合类型和其他语言类似, 是一个无序不重复元素集,我在之前学过的其他的语言好像没有见过这个类型,基本功能包括关系测试和消除重复元素. 集合对象还支持…

    编程技术 2025年2月28日
    200
  • 在Python中使用Mako模版库的简单教程

    Mako是一个高性能的Python模板库,它的语法和API借鉴了很多其他的模板库,如Django、Jinja2等等。基本用法 创建模板并渲染它的最基本的方法是使用 Template 类:  from mako.template import…

    编程技术 2025年2月28日
    200
  • python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法。分享给大家供大家参考。具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合性的功能。相比于urllib2,Kenn…

    编程技术 2025年2月28日
    200
  • python自然语言编码转换模块codecs介绍

    python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。 有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的: 复制代码 代码如下…

    编程技术 2025年2月28日
    200

发表回复

登录后才能评论