nltk 一致的词性参数在wn.synsets()和WordNetLemmatizer.lemmatize()之间

mv1qrgav  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(53)

目前,在wn.synsets()WordNetLemmatizer.lemmatize()中,POS的处理方式存在一些不一致性,例如:

>>> from nltk.corpus import wordnet as wn
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()

# Accepts None and let pos be underspecified.
>>> wn.synsets('running', pos=None)
[Synset('run.n.05'), Synset('run.n.07'), Synset('running.n.03'), Synset('running.n.04'), Synset('track.n.11'), Synset('run.v.01'), Synset('scat.v.01'), Synset('run.v.03'), Synset('operate.v.01'), Synset('run.v.05'), Synset('run.v.06'), Synset('function.v.01'), Synset('range.v.01'), Synset('campaign.v.01'), Synset('play.v.18'), Synset('run.v.11'), Synset('tend.v.01'), Synset('run.v.13'), Synset('run.v.14'), Synset('run.v.15'), Synset('run.v.16'), Synset('prevail.v.03'), Synset('run.v.18'), Synset('run.v.19'), Synset('carry.v.15'), Synset('run.v.21'), Synset('guide.v.05'), Synset('run.v.23'), Synset('run.v.24'), Synset('run.v.25'), Synset('run.v.26'), Synset('run.v.27'), Synset('run.v.28'), Synset('run.v.29'), Synset('run.v.30'), Synset('run.v.31'), Synset('run.v.32'), Synset('run.v.33'), Synset('run.v.34'), Synset('ply.v.03'), Synset('hunt.v.01'), Synset('race.v.02'), Synset('move.v.13'), Synset('melt.v.01'), Synset('ladder.v.01'), Synset('run.v.41'), Synset('running.a.01'), Synset('running.s.02'), Synset('running.a.03'), Synset('running.a.04'), Synset('linear.s.05'), Synset('running.s.06')]

# Doesn't accept None and raise a KeyError
>>> wnl.lemmatize('running', pos=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk/stem/wordnet.py", line 40, in lemmatize
    lemmas = wordnet._morphy(word, pos)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py", line 1774, in _morphy
    exceptions = self._exception_map[pos]
KeyError: None

我不确定如何让NoneWordNetLemmatizer.lemmatize()生效。

**pos=None的预期行为是什么?默认为pos='n'吗?**如果是这样的话,那么我们可以在https://github.com/nltk/nltk/blob/develop/nltk/stem/wordnet.py#L39处进行更改:

from nltk.corpus.reader.wordnet import NOUN
...

    def lemmatize(self, word, pos=None):
        pos = NOUN if pos == None else pos
        lemmas = wordnet._morphy(word, pos)
        return min(lemmas, key=len) if lemmas else word
qpgpyjmq

qpgpyjmq1#

@alvations ,我认为我们应该将None的预期行为Map为与pos='n'相同。这是因为如果我们不向WordNetLemmatizer传递pos参数,名词的pos值将自动被假定

1tu0hz3e

1tu0hz3e2#

@alvations 和 @53X,对 pos=None 的更一致的解释可能会很好,但在这种情况下,默认值不应该是 "n",而应该是 "任意词性"。
请考虑 corpus/reader/wordnet.py 中的 morphy() Package 器:它使用 itertools.chain 从所有可能的词性中收集词元,这是用户通常在未指定特定词性时所期望的行为。相反,只想获取名词的用户会指定 pos="n"。

r3i60tvu

r3i60tvu3#

理想情况下,为了在Wordnet与Morphy相关的 Package 器之间获得一致的行为,"WordNetLemmatizer.lemmatizer()"可以仅仅是wordnet.py中morphy() Package 器的别名。实际上,我发现"WordNetLemmatizer"这个名字不够恰当,因为这个 Package 器最终会撤销由_morphy()完成的WordNet过滤,并最终接受任何垃圾输入。所以虽然"WordNetLemmatizer"使用了_morphy(),但如果它被认为是它的规范 Package 器,那就不太好了。

9udxz4iz

9udxz4iz4#

PR #3225提议在WordNetLemmatizer类中添加两个标准的"morphy"模式,以便那些希望使用具有更一致的pos参数的标准morphy词形还原器的用户。另一方面,最好保留lemmatize()不变,以适应习惯于其非标准特性的许多用户。

相关问题