2017-06-06 17 views
1

NLTKを使用して、異なる単語が同音異義語を持つ可能性があることを考慮して、単一文字列の可能な品詞を得る方法はありますか?例えばNLTK単一単語品詞タグ付け

:レポート - 一種> {名詞、動詞} - > {形容詞、名詞}

Iは外の単語を品詞をタグPOS-トークナイザを見つけることができませんでした完全な文脈の文脈。これはNLTKの非常に基本的な要求のように思われるので、なぜ私はそれを見つけるのが大変なのか混乱しています。

答えて

1

はい。最も簡単な方法は、タグを使用することではなく、1つ以上のコーパスを読み込み、興味のある単語のすべてのタグの集合を収集することです。複数の単語に興味がある場合は、タグを収集するのが最も簡単ですコーパス内のすべての単語に対して、必要なものを検索します。私は可能なので、周波数カウントを追加します。たとえば、茶色のコーパスと単純な「ユニバーサル」タグセットを使用すると、次のようになります。

>>> wordtags = nltk.ConditionalFreqDist((w.lower(), t) 
     for w, t in nltk.corpus.brown.tagged_words(tagset="universal")) 
>>> wordtags["report"] 
FreqDist({'NOUN': 135, 'VERB': 39}) 
>>> list(wordtags["kind"]) 
['ADJ', 'NOUN'] 
2

POSモデルは文/文書ベースのデータで訓練されるため、事前に訓練されたモデルへの予想される入力は文/ドキュメントです。単語が1つだけの場合、それは1つの単語の文として扱われるため、その1つの単語の文脈には1つのタグしか存在しません。

英語の単語ごとにすべての可能性のあるPOSタグを見つけようとしている場合は、単語をさまざまに使い分けるコーパスが必要になり、コーパスにタグを付け、noを数えます。 1単語あたりのタグ数例えば。

>>> from nltk import pos_tag 
>>> sent1 = 'The coaches are going from Singapore to Frankfurt' 
>>> sent2 = 'He coaches the football team' 
>>> pos_tag(sent1.split()) 
[('The', 'DT'), ('coaches', 'NNS'), ('are', 'VBP'), ('going', 'VBG'), ('from', 'IN'), ('Singapore', 'NNP'), ('to', 'TO'), ('Frankfurt', 'NNP')] 
>>> pos_tag(sent2.split()) 
[('He', 'PRP'), ('coaches', 'VBZ'), ('the', 'DT'), ('football', 'NN'), ('team', 'NN')] 

>>> from collections import defaultdict, Counter 
>>> counts = defaultdict(Counter) 
>>> tagged_sents = [pos_tag(sent) for sent in [sent1.split(), sent2.split()]] 

>>> for word, pos in chain(*tagged_sents): 
...  counts[word][pos] += 1 
... 

>>> counts 
defaultdict(<class 'collections.Counter'>, {'from': Counter({'IN': 1}), 'to': Counter({'TO': 1}), 'Singapore': Counter({'NNP': 1}), 'football': Counter({'NN': 1}), 'coaches': Counter({'VBZ': 1, 'NNS': 1}), 'going': Counter({'VBG': 1}), 'are': Counter({'VBP': 1}), 'team': Counter({'NN': 1}), 'The': Counter({'DT': 1}), 'Frankfurt': Counter({'NNP': 1}), 'the': Counter({'DT': 1}), 'He': Counter({'PRP': 1})}) 

>>> counts['coaches'] 
Counter({'VBZ': 1, 'NNS': 1}) 

また、WordNetのがあります:

>>> from nltk.corpus import wordnet as wn 
>>> wn.synsets('coaches') 
[Synset('coach.n.01'), Synset('coach.n.02'), Synset('passenger_car.n.01'), Synset('coach.n.04'), Synset('bus.n.01'), Synset('coach.v.01'), Synset('coach.v.02')] 
>>> [ss.pos() for ss in wn.synsets('coaches')] 
[u'n', u'n', u'n', u'n', u'n', u'v', u'v'] 
>>> Counter([ss.pos() for ss in wn.synsets('coaches')]) 
Counter({u'n': 5, u'v': 2}) 

しかし、あなたはすべての英語の単語がそれであることを期待することはできませんので、WordNetのは手動で作られたリソースであることに注意してください。