我有一根绳子。我想对其应用词形还原。
str = "i want better dogs"
str = str.split(" ")
for w in str: wordnet_lemmatizer.lemmatize(w)
Run Code Online (Sandbox Code Playgroud)
我得到输出:
我想要更好的狗
当我运行这个循环时:
for w in str:
wordnet_lemmatizer.lemmatize(w,pos='a')
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
我想要好狗
块引用
我想要的是两个循环的组合。即 ** i want good dog** 我该怎么做?有没有办法添加多个 pos 之类的v(verb),n(noun)?
您想要的是首先在文本上运行词性标注器以找出词性,然后进行相应的词形还原。
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')]
Run Code Online (Sandbox Code Playgroud)
然后您可以检查标签是否以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'
Run Code Online (Sandbox Code Playgroud)
您需要指定“a”或“n”的原因是该过程需要知道词性才能决定引理。
例如,“building”既可以是动词“build”的现在分词,也可以是名词。所以lemmatize("building",'n') == "building"尽管lemmatize("building",'v') == "build". 如果您应用了所有规则,它会错误地将“我想要一个更好的建筑”更改为“我想要一个好的建筑”,这是不正确的。识别词性无法通过算法完成,因此必须由用户指定。
如果有特定的单词,例如“更好”,您可以在传递到 wordnet 之前自行检查。
| 归档时间: |
|
| 查看次数: |
5575 次 |
| 最近记录: |