Python NLTK WordNetLemmatizer过程“;美国";作为「;u";
如果您将单词Python NLTK WordNetLemmatizer过程“;美国";作为「;u";,python,nltk,lemmatization,Python,Nltk,Lemmatization,如果您将单词“US”(美国)在预处理后(变成“US”,即小写)从packagenltk.stem输入WordNetLemmatizer,它将被翻译成“u”。例如: from nltk.stem import WordNetLemmatizer lmtzr = WordNetLemmatizer() word = "US".lower() # "US" becomes "us" lemma = lmtzr.lemmatize(word) print(lemma) # prints "u"
“US”
(美国)在预处理后(变成“US”
,即小写)从packagenltk.stem
输入WordNetLemmatizer
,它将被翻译成“u”
。例如:
from nltk.stem import WordNetLemmatizer
lmtzr = WordNetLemmatizer()
word = "US".lower() # "US" becomes "us"
lemma = lmtzr.lemmatize(word)
print(lemma) # prints "u"
我甚至尝试使用词性标记对单词进行语法化,结果是根据包nltk
中的POS\u tag()
函数生成一个'NNP'
(NN=noon和p=property,即property noon)。但是'NNP'
是一个wordnet.NOUN
,这是lemmatizer处理单词时的默认行为。因此,lmtzr.lemmatize(word)
和lmtz.lemmatize(word,wordnet.NOUN)
是相同的(其中wordnet
是从包nltk.stem.wordnet
导入的)
除了使用
if
语句将文本中的单词“us”
的处理明确排除在lemmatizer之外,关于如何解决这个问题的任何想法?如果您查看WordNetLemmatizer的源代码
def lemmatize(self, word, pos=NOUN):
lemmas = wordnet._morphy(word, pos)
return min(lemmas, key=len) if lemmas else word
wordnet.\u morphy
返回['us','u']
min(引理,key=len)
返回最短的单词,即u
wordnet.\u morphy
对名词使用一条规则,将结尾“s”
替换为“
以下是替换列表
[('s',''),
(‘ses’、‘s’),
('ves','f'),
('x','x'),
('zes','z'),
("ches","ch"),,
(‘shes’、‘sh’),
(‘男人’、‘男人’),
('yes','y')]
我看不出一条干净的出路
1) 你可以写一条排除所有大写单词的特殊规则
2) 或者您可以添加一行us
到文件nltk_data/corpora/wordnet/noon.exc
3) 您可以编写自己的函数来选择最长的单词(这对于其他单词可能是错误的)
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