如何阻止NLTK词干提取器去掉结尾的“e”?

7 投票
3 回答
4821 浏览
提问于 2025-04-18 11:46

我正在使用NLTK的词干提取器来去掉一个词的语法变化。不过,Porter或Snowball这两种词干提取器会把名词或动词原形后面的“e”去掉,比如“Profile”会变成“Profil”。

我该怎么防止这种情况发生呢?我知道可以用条件语句来避免这个问题,但这样在不同情况下可能会出错。

有没有什么选项或者其他的API可以满足我的需求呢?

3 个回答

4

词干提取器的目的是尽可能去掉一个单词的多余部分,以便能够适应更多的情况,同时保留单词的核心部分。比如,"profile"这个词可能会变成"profil",这样可以涵盖"profiling"这个词的情况。为了避免这种情况,你可能需要使用条件判断或者其他的词干提取器。不过,我想大多数情况下,它们会去掉单词末尾的'e'。尤其是考虑到很多'e'变成'ing'的情况。

9

试试这个:

>>> from nltk.stem import WordNetLemmatizer, PorterStemmer
>>> porter = PorterStemmer()
>>> wnl = WordNetLemmatizer()
>>> word = 'profile'
>>> porter.stem(word)
'profil'
>>> wnl.lemmatize(word)
'profile'
>>> wnl.lemmatize(word) if wnl.lemmatize(word).endswith('e') else porter.stem(word)
'profile'
8

我同意Philip的看法,词干提取器的目标是只保留词干。对于这个特定的情况,你可以试试词形还原器,而不是词干提取器。词形还原器可以保留更多的单词信息,专门用来去掉单词的不同形式,比如把'profiles'变成'profile'。在NLTK库中有一个类可以做到这一点——你可以试试nltk.stem里的WordNetLemmatizer()。

不过要注意,这个方法也不是完美的(处理文本时没有什么是完美的),因为我曾经把'physics'还原成了'physic'。

撰写回答