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

Shu*_*m R 6 python-3.x

我有一根绳子。我想对其应用词形还原。

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)

L3v*_*han 7

您想要的是首先在文本上运行词性标注器以找出词性,然后进行相应的词形还原。

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)

然后您可以检查标签是否以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'
Run Code Online (Sandbox Code Playgroud)


Jam*_*s K 3

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

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

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