迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

修复 Python 中的 NLTK 词干异常

作者:迹忆客 最近更新:2023/06/18 浏览次数:

词干提取,顾名思义,是将单词简化为其词根形式的方法。 例如,像 happiness、happyly 和 happyer 这样的词都可以分解为词根 happy。

在 Python 中,我们可以借助 Python 的 NLTK 库提供的各种模块来完成此操作,但有时,您可能无法获得预期的结果。 例如,fairly 被简化为 fairli 和 not fair NLTK 库的 PorterStemmer 模块。

本文将讨论为什么会出现这种差异,以及如何解决这些差异以获得我们想要的词根。 所以喝杯咖啡,继续阅读!


修复 Python 中的 NLTK 词干异常

虽然 Python 的 NLTK 库有多种词干提取器,但最常用的是 PorterStemmer。 这是 PorterStemmer 如何工作的示例。

让我们首先了解这段代码中发生了什么。

我们首先从 nltk 库中导入 PorterStemmer,然后创建它的一个实例。 现在,我们可以在 nltk 库中提供的 stem() 函数的帮助下使用这个实例来提取给定的单词列表。

from nltk.stem import PorterStemmer
p = PorterStemmer()

similar_words = ['act', 'acting', 'acts']

for x in similar_words:
    print(x, "comes from", p.stem(x))

输出:

act comes from act
acting comes from act
acts comes from act

在 PorterStemmer 模块的帮助下,此列表中的所有单词都缩减为词根 act。 但这并不是这个模块一直工作的方式。

这是另一个例子。

from nltk.stem import PorterStemmer
p = PorterStemmer()
print(p.stem('loudly'))

输出:

'loudli'

你可以看到这次我们得到的输出是响亮的而不是响亮的。

想知道为什么会这样。 而且,更重要的是,如何解决这个问题?


Python 中 NLTK 的 PorterStemmer 模块中词干提取异常的修复

PorterStemmer 模块分五个阶段工作,每个阶段都有自己的规则和程序。 而且,它通常给出的结果是基于英语的。

这意味着即使单词 loudi 不是我们想要的,但根据 PorterStemmer 模块的规则,它是正确词干的单词。

但有一些好消息——并非所有 NLTK 模块的词干分析器都以相似的方式工作。 这次让我们在 SnowballStemmer 的帮助下大声阻止这个词。

请注意 ,在这里,我们必须将一种语言作为参数传递给 SnowballStemmer() 函数。

from nltk.stem import SnowballStemmer
s = SnowballStemmer('english')
print(s.stem('loudly'))

输出:

'loud'

您可以看到这次我们获得了所需的输出,因为 SnowballStemmer 使用的规则集肯定与 PorterStemmer 不同。 现在这里有一些有趣的事情。

尝试使用这两个模块来提取 actor 这个词。 这是在下面完成的。

from nltk.stem import PorterStemmer
p = PorterStemmer()
print(p.stem('actor'))

from nltk.stem import SnowballStemmer
s = SnowballStemmer('english')
print(s.stem('actor'))

输出:

'actor'
'actor'

您可以看到这两个模块都返回相同的输出 actor,而不是词根 act。 现在让我们用另一个名为 LancasterStemmer 的词干分析器来试试这个。

from nltk.stem import LancasterStemmer
l = LancasterStemmer()
print(l.stem('actor'))

输出:

'act'

你可以看到这次我们得到了想要的输出行为。

您看到了不同的词干分析器如何用不同的词给出不同的输出。

我们可以使用其他各种词干提取器,但由于它们都基于某些算法,因此总是有可能无法获得所需的输出。 此外,这些词干分析器在根据算法截断单词方面非常严格。

此外,词干提取主要作用于后缀部分,并且不够聪明,无法通过删除前缀或中缀来计算单词。 词干提取算法甚至不查找单词的含义和生成的词根。

看看这个例子。

这是一串末尾带有 ing 的随机字母,词干分析器移除此后缀并返回输出。

from nltk.stem import PorterStemmer
p = PorterStemmer()
print(p.stem('wkhfksafking'))

输出:

'wkhfksafk'

因此,要解决这个问题,更好的方法是使用词形还原器。 让我们详细看看词形还原器的工作。


在 Python 的 NLTK 中使用 Lemmatizers 而不是词干分析器

与词干分析器不同的是,lemmatizer 可以从形态上分析单词,并根据使用它们的上下文找到最合适的词条。 请注意,引理与词干不同,因为它是所有形式的基本形式,与词干不同。

让我们看一个示例,看看词形还原器如何优于词干提取器。

在这里,我们使用 PorterStemmer 来提取几个词。

from nltk.stem import PorterStemmer
p = PorterStemmer()

w = ['studies', 'studying', 'study']

for i in w:
    print(p.stem(i))

输出:

studi
studi
studi

您可以看到我们得到的输出不是很有帮助。 让我们继续对同一组单词使用词形还原器。

我们首先导入 WordNetLemmatizer 模块并创建它的一个实例。 然后,我们使用带 for 循环的 lemmatize() 函数找出每个单词的引理。

from nltk.stem import WordNetLemmatizer
l = WordNetLemmatizer()

w = ['studies', 'studying', 'study']

for i in w:
    print(l.lemmatize(i))

输出:

study
studying
study

这次我们没有得到荒谬的输出,所有的话都说得通。

这就是使用词形还原器比使用词干分析器更好的原因。

有关词干分析器和词形还原器的更多信息,请参阅此链接。


总结

本文向我们介绍了 Python 中 NLTK 中的词干分析器和词形还原器。 我们看到了词干分析器如何以及为什么有时会给出荒谬的结果,以及我们如何使用词形还原器来获得更好的结果。

上一篇:使用 Jython 在 Java 中运行 Python

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Jython 在 Java 中运行 Python

发布时间:2023/06/18 浏览次数:118 分类:Python

本文将彻底解释使用 Jython 库在 Java 程序中运行 Python 的步骤。 这将是一个包含大量图像的详细分步过程,因此您不必担心“他是怎么做到的”。

Python 图像压缩

发布时间:2023/06/18 浏览次数:157 分类:Python

本篇文章将介绍使用 Python 中的 PIL 库压缩图像。在使用 PIL 库之前,请使用 pip 或 python 安装它。pip install Pillow

在 Python 中调整图像大小同时保持其纵横比

发布时间:2023/06/18 浏览次数:187 分类:Python

这篇 Python 文章的目的是解释我们如何在 Python 中调整图像大小同时保持其纵横比。 在 Python 中调整图像大小的方法还将通过适当的示例程序描述其用法。在 Python 中调整图像大小同时保持其纵横

Python类相等检查

发布时间:2023/06/18 浏览次数:130 分类:Python

本文讨论如何在 Python 中检查类相等性。 为此,本文讨论了如何在 Python 类中实现 eq() 方法。

Python 类工厂

发布时间:2023/06/18 浏览次数:83 分类:Python

本篇文章介绍了创建类工厂的不同方法。如何在 Python 中创建类工厂 有两种设计类工厂的方法; 一个在编码时创建一个类,而另一个在运行时创建一个类。

Python 抽象属性

发布时间:2023/06/18 浏览次数:99 分类:Python

本篇文章将介绍使用 abc 或抽象基类模块在 Python 中创建具有抽象属性的类。Python 抽象属性 面向对象编程中的抽象用于向用户隐藏不必要的信息。

Python 中的数据类继承

发布时间:2023/06/18 浏览次数:122 分类:Python

本文解释了数据类、继承、多级继承、默认和非默认属性等概念。 提供了足够的编码示例以掌握编译过程中展开的概念。

Python 生成器类

发布时间:2023/06/18 浏览次数:185 分类:Python

本篇文章将讨论使用 yield 语句和 next() 函数在 Python 中创建生成器类。要了解生成器,我们首先需要了解下面讨论的迭代器。Python 迭代器是用于逐个访问容器中元素的对象。

在 Python 中实现多个装饰器

发布时间:2023/06/17 浏览次数:95 分类:Python

本文重点介绍多个装饰器的概念。 读者将学习装饰器的基础知识,它是如何创建和实现的,以及如何将它与其他装饰器链接到一个函数上。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便