NLTK WordNetLemmatizer:未按预期进行词形还原

3

我正在尝试使用NLTK的WordNetLemmatizer来对句子中的所有单词进行词形还原。我有很多句子,但只使用第一句话来确保我正确地完成了这个任务。以下是我的代码:

train_sentences[0]

"Explanation Why edits made username Hardcore Metallica Fan reverted? They vandalisms, closure GAs I voted New York Dolls FAC. And please remove template talk page since I'm retired now.89.205.38.27"

所以现在我尝试将每个单词进行词形还原,方法如下:

lemmatizer = WordNetLemmatizer()
new_sent = [lemmatizer.lemmatize(word) for word in train_sentences[0].split()]
print(new_sent)

我得到了回复:

['Explanation', 'Why', 'edits', 'made', 'username', 'Hardcore', 'Metallica', 'Fan', 'reverted?', 'They', 'vandalisms,', 'closure', 'GAs', 'I', 'voted', 'New', 'York', 'Dolls', 'FAC.', 'And', 'please', 'remove', 'template', 'talk', 'page', 'since', "I'm", 'retired', 'now.89.205.38.27']

一些问题:
1)为什么“edits”没有被转换成“edit”?如果我执行lemmatizer.lemmatize("edits"),我会得到edits,但还是感到惊讶。
2)为什么“vandalisms”没有被转换成“vandalism”?这个非常令人惊讶,因为如果我执行lemmatizer.lemmatize("vandalisms"),我会得到vandalism...
任何澄清/指导都将是非常棒的!

可能是这个SO答案的重复。 - amanb
重复的问题 https://stackoverflow.com/a/49356358/610569 - alvas
2个回答

4

简述

首先标记句子,然后使用词性标注作为额外参数输入进行词形还原。

from nltk import pos_tag
from nltk.stem import WordNetLemmatizer

wnl = WordNetLemmatizer()

def penn2morphy(penntag):
    """ Converts Penn Treebank tags to WordNet. """
    morphy_tag = {'NN':'n', 'JJ':'a',
                  'VB':'v', 'RB':'r'}
    try:
        return morphy_tag[penntag[:2]]
    except:
        return 'n' 

def lemmatize_sent(text): 
    # Text input is string, returns lowercased strings.
    return [wnl.lemmatize(word.lower(), pos=penn2morphy(tag)) 
            for word, tag in pos_tag(word_tokenize(text))]

lemmatize_sent('He is walking to school')

如果想要了解为什么需要POS标签及其详细步骤,请参见https://www.kaggle.com/alvations/basic-nlp-with-nltk


或者您可以使用 pywsd 分词器+词形还原器,它是NLTK的 WordNetLemmatizer 封装:

安装:

pip install -U nltk
python -m nltk.downloader popular
pip install -U pywsd

代码:

>>> from pywsd.utils import lemmatize_sentence
Warming up PyWSD (takes ~10 secs)... took 9.307677984237671 secs.

>>> text = "Mary leaves the room"
>>> lemmatize_sentence(text)
['mary', 'leave', 'the', 'room']

>>> text = 'Dew drops fall from the leaves'
>>> lemmatize_sentence(text)
['dew', 'drop', 'fall', 'from', 'the', 'leaf']

(注意:我无法将此问题标记为nltk:如何在考虑周围单词的上下文时进行词形还原?的重复,因为该答案在那里没有被接受,但它是一个副本)。


1
  1. 这确实是nltk社区能够回答的问题。
  2. 这是因为在vandalisms,的末尾有一个,。要去掉这个逗号,您可以使用.strip(','或使用多个分隔符如此描述

就个人而言,我尽量避免在存储库问题中提出问题,虽然有很多问题都可以在那里解决。Github 应该真正地托管另一个特性,将实际的代码/文档/测试问题与问题分开。 - alvas
@alvas 我同意这一点。但是我不知道其他可以问这个问题的地方了。我真的没有意识到这个问题(只是看到了你的回答)。我以为这是NLTK内部工作中的错误/有意功能。 - Parth Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接