在词形还原中应用多个pos参数

时间:2016-09-07 05:43:20

标签: python-3.x

我有一个字符串。我想在其上应用词形还原。

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)

2 个答案:

答案 0 :(得分:0)

您需要指定“a”或“n”的原因是该过程需要知道词性以确定引理。

例如,“building”既可以是动词“build”的现在分词,也可以是名词。所以lemmatize("building",'n') == "building"lemmatize("building",'v') == "build"。如果您应用了所有规则,它会错误地将“我想要一个更好的建筑”改为“我想要一个好的构建”,这是不正确的。识别词性不能通过算法完成,因此必须由用户指定。

如果有特定词,例如“更好”,您可以在传递给wordnet之前自行检查。

答案 1 :(得分:0)

你想要的是首先在文本上运行一个POS标记器,找出词性,然后相应地进行词形变换。

使用nltk.tag

的POS代码
>>> 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')]

然后,您可以检查代码是以NNJJ还是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'