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
如果您将单词 "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