NLTK WordNetLemmatizer 将 "US" 处理为 "u"

NLTK WordNetLemmatizer processes "US" as "u"

如果您将单词 "US"(美国)在预处理后(变为 "us",即小写)输入包 nltk.stem 中的 WordNetLemmatizer , 它被翻译成 "u"。例如:

from nltk.stem import WordNetLemmatizer
lmtzr = WordNetLemmatizer()
word = "US".lower()  #  "US" becomes "us"
lemma = lmtzr.lemmatize(word)
print(lemma)  # prints "u"

我什至尝试使用 POS 标记对单词进行词形还原,根据包中的 pos_tag() 函数得到 'NNP'(NN=名词和 P=专有名词,即专有名词) nltk。但是 'NNP'wordnet.NOUN,这是词形还原器处理单词时的默认行为。因此,lmtzr.lemmatize(word)lmtz.lemmatize(word, wordnet.NOUN) 是相同的(其中 wordnet 是从包 nltk.stem.wordnet 导入的)。

关于如何解决这个问题的任何想法,除了使用 if 语句从词形还原器中明确排除对文本中单词 "us" 的处理的笨拙方法?

如果你看一下 WordNetLemmatizer 的源代码

def lemmatize(self, word, pos=NOUN):
    lemmas = wordnet._morphy(word, pos)
    return min(lemmas, key=len) if lemmas else word

wordnet._morphy returns ['us', 'u']

min(lemmas, key=len) returns 最短的单词 u

wordnet._morphy 对名词使用规则,将结尾 "s" 替换为 "".

这是替补名单

[('s', ''), ('ses', 's'), ('ves', 'f'), ('xes', 'x'), ('zes', 'z'), ('ches', 'ch'), ('shes', 'sh'), ('men', 'man'), ('ies', 'y')]

我没有看到一个非常干净的出路。

1) 你可以写一个特殊的规则来排除所有大写的单词。

2) 或者您可以添加一行 us us

到文件nltk_data/corpora/wordnet/noun.exc

3) 你可以自己写函数去select最长的单词(其他单词可能不对)

from nltk.corpus.reader.wordnet import NOUN
from nltk.corpus import wordnet
def lemmatize(word, pos=NOUN):
    lemmas = wordnet._morphy(word, pos)
    return max(lemmas, key=len) if lemmas else word