我有一个字符串。我想在其上应用词形还原。
str = "i want better dogs"
str = str.split(" ")
for w in str: wordnet_lemmatizer.lemmatize(w)
我收到了输出:
我想要更好的狗
当我运行此循环时:
for w in str:
wordnet_lemmatizer.lemmatize(w,pos='a')
我收到了这个输出:
我想要好狗
块引用
我想要的是两个循环的组合。即** i want good dog
**
我该怎么做?有没有办法添加多个pos v(verb),n(noun)
?
答案 0 :(得分:0)
您需要指定“a”或“n”的原因是该过程需要知道词性以确定引理。
例如,“building”既可以是动词“build”的现在分词,也可以是名词。所以lemmatize("building",'n') == "building"
而lemmatize("building",'v') == "build"
。如果您应用了所有规则,它会错误地将“我想要一个更好的建筑”改为“我想要一个好的构建”,这是不正确的。识别词性不能通过算法完成,因此必须由用户指定。
如果有特定词,例如“更好”,您可以在传递给wordnet之前自行检查。
答案 1 :(得分:0)
你想要的是首先在文本上运行一个POS标记器,找出词性,然后相应地进行词形变换。
使用nltk.tag
:
>>> from nltk.tag import pos_tag
>>> from nltk.tokenize import word_tokenize
>>> pos_tag(word_tokenize("i want better dogs"))
[('i', 'NN'), ('want', 'VBP'), ('better', 'JJR'), ('dogs', 'NNS')]
然后,您可以检查代码是以NN
,JJ
还是VB
开头,并忽略所有其他代码:
from nltk.stem import WordNetLemmatizer
def lemmatize_all(sentence):
wnl = WordNetLemmatizer()
for word, tag in pos_tag(word_tokenize(sentence)):
if tag.startswith("NN"):
yield wnl.lemmatize(word, pos='n')
elif tag.startswith('VB'):
yield wnl.lemmatize(word, pos='v')
elif tag.startswith('JJ'):
yield wnl.lemmatize(word, pos='a')
else:
yield word
print(' '.join(lemmatize_all("i want better dogs")))
# prints 'i want good dog'