修复 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 中的词干分析器和词形还原器。 我们看到了词干分析器如何以及为什么有时会给出荒谬的结果,以及我们如何使用词形还原器来获得更好的结果。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串