目前,在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
我不确定如何让None
到WordNetLemmatizer.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
4条答案
按热度按时间qpgpyjmq1#
@alvations ,我认为我们应该将None的预期行为Map为与pos='n'相同。这是因为如果我们不向WordNetLemmatizer传递pos参数,名词的pos值将自动被假定
1tu0hz3e2#
@alvations 和 @53X,对 pos=None 的更一致的解释可能会很好,但在这种情况下,默认值不应该是 "n",而应该是 "任意词性"。
请考虑 corpus/reader/wordnet.py 中的 morphy() Package 器:它使用 itertools.chain 从所有可能的词性中收集词元,这是用户通常在未指定特定词性时所期望的行为。相反,只想获取名词的用户会指定 pos="n"。
r3i60tvu3#
理想情况下,为了在Wordnet与Morphy相关的 Package 器之间获得一致的行为,"WordNetLemmatizer.lemmatizer()"可以仅仅是wordnet.py中morphy() Package 器的别名。实际上,我发现"WordNetLemmatizer"这个名字不够恰当,因为这个 Package 器最终会撤销由_morphy()完成的WordNet过滤,并最终接受任何垃圾输入。所以虽然"WordNetLemmatizer"使用了_morphy(),但如果它被认为是它的规范 Package 器,那就不太好了。
9udxz4iz4#
PR #3225提议在WordNetLemmatizer类中添加两个标准的"morphy"模式,以便那些希望使用具有更一致的pos参数的标准morphy词形还原器的用户。另一方面,最好保留lemmatize()不变,以适应习惯于其非标准特性的许多用户。