10

Ted Dataset Transcript をレンマライズしています。私が気付いた奇妙な点があります。すべての単語が見出し語化されているわけではありません。言う、

selected -> select

どちらが正しいです。

ただし、'v' (動詞) 属性を明示的に入力しない限りinvolved !-> involvehorsing !-> horse

Python端末では、正しい出力が得られますが、コードにはありません:

>>> from nltk.stem import WordNetLemmatizer
>>> from nltk.corpus import wordnet
>>> lem = WordNetLemmatizer()
>>> lem.lemmatize('involved','v')
u'involve'
>>> lem.lemmatize('horsing','v')
u'horse'

コードの関連セクションは次のとおりです。

for l in LDA_Row[0].split('+'):
    w=str(l.split('*')[1])
    word=lmtzr.lemmatize(w)
    wordv=lmtzr.lemmatize(w,'v')
    print wordv, word
    # if word is not wordv:
    #   print word, wordv

コード全体はこちらです。

何が問題ですか?

4

1 に答える 1

22

lemmatizer は、正しい POS タグが正確であることを必要とします。 のデフォルト設定を使用する場合WordNetLemmatizer.lemmatize()、デフォルト タグは名詞です。https://github.com/nltk/nltk/blob/develop/nltk/stem/wordnet.pyを参照してください。 #L39

この問題を解決するには、見出し語化する前に必ずデータに POS タグを付けてください。

>>> from nltk.stem import WordNetLemmatizer
>>> from nltk import pos_tag, word_tokenize
>>> wnl = WordNetLemmatizer()
>>> sent = 'This is a foo bar sentence'
>>> pos_tag(word_tokenize(sent))
[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('foo', 'NN'), ('bar', 'NN'), ('sentence', 'NN')]
>>> for word, tag in pos_tag(word_tokenize(sent)):
...     wntag = tag[0].lower()
...     wntag = wntag if wntag in ['a', 'r', 'n', 'v'] else None
...     if not wntag:
...             lemma = word
...     else:
...             lemma = wnl.lemmatize(word, wntag)
...     print lemma
... 
This
be
a
foo
bar
sentence

'is -> be' であることに注意してください。

>>> wnl.lemmatize('is')
'is'
>>> wnl.lemmatize('is', 'v')
u'be'

あなたの例からの言葉で質問に答えるには:

>>> sent = 'These sentences involves some horsing around'
>>> for word, tag in pos_tag(word_tokenize(sent)):
...     wntag = tag[0].lower()
...     wntag = wntag if wntag in ['a', 'r', 'n', 'v'] else None
...     lemma = wnl.lemmatize(word, wntag) if wntag else word
...     print lemma
... 
These
sentence
involve
some
horse
around

WordNetLemmatizer にはいくつかの癖があることに注意してください。

また、NLTK のデフォルトの POS タガーは、精度を向上させるためにいくつかの大きな変更を受けています。

また、レマタイザーのすぐに使用できる/既製のソリューションについては、 https://github.com/alvations/pywsdと、単語をキャッチするための try-excepts の作成方法をご覧ください。 WordNet にないものについては、https://github.com/alvations/pywsd/blob/master/pywsd/utils.py#L66を参照してください。

于 2015-10-06T00:22:29.837 に答える