verb.exc を開くと、
saw see
コードで見出し語化を使用している間
>>>print lmtzr.lemmatize('saw', 'v')
saw
これはどのように起こりますか?wordNet の改訂で誤解していませんか?
verb.exc を開くと、
saw see
コードで見出し語化を使用している間
>>>print lmtzr.lemmatize('saw', 'v')
saw
これはどのように起こりますか?wordNet の改訂で誤解していませんか?
要するに:
奇妙な例外のようなものです。
I saw the log the into half.
「saw」が現在形の動詞の場合もあります。
提起された問題でより細かいタグを使用するには、@nschneid ソリューションを参照してください: https://github.com/nltk/nltk/issues/1196
長い:
NLTK で WordNet lemmatizer を呼び出す方法を見てみると、次のようになります。
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> wnl.lemmatize('saw', pos='v')
'saw'
>>> wnl.lemmatize('saw')
'saw'
POS タグの指定は冗長に思えます。レマタイザ コード自体を見てみましょう。
class WordNetLemmatizer(object):
def __init__(self):
pass
def lemmatize(self, word, pos=NOUN):
lemmas = wordnet._morphy(word, pos)
return min(lemmas, key=len) if lemmas else word
それが行うことは_moprhy
、単語ネットコーパスのプロパティに依存して、可能な見出し語を返すことです。
nltk.corpus.wordnet
コードをスレッド化すると、https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1679_morphy()
にコードが 表示されます
関数の最初の数行は、wordnet から例外ファイルを読み取りverb.exc
ます。
したがって、レンマタイザー関数の外側で例外のアドホック検索を行うと、次のことがわかります'saw' -> 'see'
。
>>> from nltk.corpus import wordnet as wn
>>> exceptions = wn._exception_map['v']
>>> exceptions['saw']
[u'see']
したがって_morphy()
、レンマタイザーの外で関数を呼び出すと、次のようになります。
>>> from nltk.corpus import wordnet as wn
>>> exceptions = wn._exception_map['v']
>>> wn._morphy('saw', 'v')
['saw', u'see']
WordNetLemmatizer.lemmatize()
コードの戻り行に戻りましょうreturn min(lemmas, key=len) if lemmas else word
。
def lemmatize(self, word, pos=NOUN):
lemmas = wordnet._morphy(word, pos)
return min(lemmas, key=len) if lemmas else word
したがって、関数はwn._morphy()
最小の長さで出力を返すことを意味します。ただし、この場合、 saw と see の両方が同じ長さであるため、 によって返されるリストの最初のものが返されwn._morphy()
ますsaw
。
事実上、WordNetLemmatizer.lemmatize()
はこれを行っています。
>>> from nltk.corpus import wordnet as wn
>>> wn._morphy('saw', 'v')
['saw', u'see']
>>> min(wn._morphy('saw', 'v'), key=len)
'saw'
質問は次のとおりです。
ただし、これは正確には「バグ」ではなく、表面的な単語の他の可能な補題を表す「機能」であることに注意してください (ただし、その特定のコンテキストでのその単語はまれです。たとえば、I saw the log into half
.
NLTK でこの「バグ」を回避するにはどうすればよいですか?
NLTK でこの「バグ」を回避するには、長さでフィルタリングされた補題の代わりに、可能な補題のリストを常に取得する方法nltk.wordnet._morphy()
の代わりに使用します。nltk.stem.WordNetLemmatizer.lemmatize()
レンマタイズするには:
>>> from nltk.corpus import wordnet as wn
>>> exceptions = wn._exception_map['v']
>>> wn._morphy('saw', pos='v')
['saw', 'see']
間違った選択をするよりは、より多くの選択をする方がよい。
NLTK でこの「バグ」を修正するにはどうすればよいですか?
min(lemmas, key=len)
準最適であることを除けば、例外を処理する場合、関数_morphy()
は少し一貫性がありません。これは、それ自体がレンマである可能性がある複数の単語のまれな意味のためです。たとえば、teeth
入れ歯を参照するために使用します。 edu/perl/webwn?s=歯
>>> wn._morphy('teeth', 'n')
['teeth', u'tooth']
>>> wn._morphy('goose', 'n')
['goose']
>>> wn._morphy('geese', 'n')
[u'goose']
したがって、レンマ選択のエラーはnltk.wordnet._morphy()
、例外リストの後の関数に導入されたに違いありません。簡単なハックの 1 つは、入力表面の単語が例外リストにある場合、例外リストの最初のインスタンスをすぐに返すことです。たとえば、次のようになります。
from nltk.corpus import wordnet as wn
def _morphy(word, pos):
exceptions = wn._exception_map[pos]
if word in exceptions:
return exceptions[word]
# Else, continue the rest of the _morphy code.