迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 中的词干分析器和词形还原器。 我们看到了词干分析器如何以及为什么有时会给出荒谬的结果,以及我们如何使用词形还原器来获得更好的结果。

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

本文地址:

相关文章

Pandas read_csv()函数

发布时间:2024/04/24 浏览次数:254 分类:Python

Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。

Pandas 追加数据到 CSV 中

发布时间:2024/04/24 浏览次数:352 分类:Python

本教程演示了如何在追加模式下使用 to_csv()向现有的 CSV 文件添加数据。

Pandas 多列合并

发布时间:2024/04/24 浏览次数:628 分类:Python

本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。

Pandas loc vs iloc

发布时间:2024/04/24 浏览次数:837 分类:Python

本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便