【问题标题】:Why the stem of word "got " is still "got" instead of "get"?为什么单词“got”的词干仍然是“got”而不是“get”?
【发布时间】:2018-08-26 15:02:31
【问题描述】:
from stemming.porter2 import stem

documents = ['got',"get"]

documents = [[stem(word) for word in sentence.split(" ")] for sentence in documents]
print(documents)

结果是:

[['got'], ['get']]

有人可以帮忙解释一下吗? 谢谢!

【问题讨论】:

  • NIT:它是使用的“stemming”库/方法的产物——不是 Python,它只是框架/运行时。 使用的特定库因此应该包含在问题中:是pypi.org/project/stemming/1.0吗?
  • 这是词干分析器功能不足以理解您想要什么的特殊情况之一。考虑先对词进行词形提取,然后再对词条进行词干提取:nltk.WordNetLemmatizer().lemmatize("got","v") - > "get"

标签: python nltk stem


【解决方案1】:

您需要的是词形还原器而不是词干分析器。差异是微妙的。

通常,词干分析器会尽可能多地删除后缀,并且在某些情况下,通过简单地删除后缀来处理无法找到规范化形式的单词的异常列表。

词形还原器试图找到一个单词的“基本”/根/不定式形式,通常,它需要针对不同语言的专门规则。


使用 morphy lemmatizer 的 NLTK 实现的词形化需要正确的词性 (POS) 标记才能相当准确。

避免(或实际上从不)尝试孤立地对单个单词进行词形还原。尝试对一个完全 POS 标记的句子进行词形还原,例如

from nltk import word_tokenize, pos_tag
from nltk import wordnet as wn

def penn2morphy(penntag, returnNone=False, default_to_noun=False):
    morphy_tag = {'NN':wn.NOUN, 'JJ':wn.ADJ,
                  'VB':wn.VERB, 'RB':wn.ADV}
    try:
        return morphy_tag[penntag[:2]]
    except:
        if returnNone:
            return None
        elif default_to_noun:
            return 'n'
        else:
            return ''

使用 penn2morphy 辅助函数,您需要将 POS 标签从 pos_tag() 转换为 morphy 标签,然后您可以:

>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> sent = "He got up in bed at 8am."
>>> [(token, penn2morphy(tag)) for token, tag in pos_tag(word_tokenize(sent))]
[('He', ''), ('got', 'v'), ('up', ''), ('in', ''), ('bed', 'n'), ('at', ''), ('8am', ''), ('.', '')]
>>> [wnl.lemmatize(token, pos=penn2morphy(tag, default_to_noun=True)) for token, tag in pos_tag(word_tokenize(sent))]
['He', 'get', 'up', 'in', 'bed', 'at', '8am', '.']

为方便起见,您也可以试试pywsd lemmatizer

>>> from pywsd.utils import lemmatize_sentence
Warming up PyWSD (takes ~10 secs)... took 7.196984529495239 secs.
>>> sent = "He got up in bed at 8am."
>>> lemmatize_sentence(sent)
['he', 'get', 'up', 'in', 'bed', 'at', '8am', '.']

另见https://stackoverflow.com/a/22343640/610569

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2015-12-30
    • 2011-10-03
    • 1970-01-01
    • 2021-05-23
    • 2015-11-02
    相关资源
    最近更新 更多