修复 Python 中的 NLTK 词干异常
词干提取,顾名思义,是将单词简化为其词根形式的方法。 例如,像 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
发布时间: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
-
本文重点介绍多个装饰器的概念。 读者将学习装饰器的基础知识,它是如何创建和实现的,以及如何将它与其他装饰器链接到一个函数上。