web-dev-qa-db-ja.com

Python NLTK:品詞タグの簡略化されたセットで文にタグを付ける方法は?

Python NLTK book の第5章では、文中の単語にタグを付ける例を示しています。

>>> text = nltk.Word_tokenize("And now for something completely different")
>>> nltk.pos_tag(text)
[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]

nltk.pos_tagは、タグのフルセットを使用するデフォルトのタガーを呼び出します。この章の後半で、 簡略化されたタグのセット が紹介されています。

この簡略化された品詞タグのセットで文にタグを付けるにはどうすればよいですか?

また、タガーを正しく理解しました。つまり、タガーが要求するときに使用するタグセットを変更できますか、それが返すタグを簡略化されたセットにマップする必要がありますか、または新しいタガーから新しいタガーを作成する必要があります。単純にタグ付けされたコーパス?

25
Ollie Glass

デフォルトのタガーからタグを単純化するには、次のようにnltk.tag.simplify.simplify_wsj_tagを使用できます。

>>> import nltk
>>> from nltk.tag.simplify import simplify_wsj_tag
>>> tagged_sent = nltk.pos_tag(tokens)
>>> simplified = [(Word, simplify_wsj_tag(tag)) for Word, tag in tagged_sent]
22
Jacob

誰かが同じ問題に遭遇した場合に備えて、更新されました。 NLTKはその後、「ユニバーサル」タグセット、ソース ここ にアップグレードしました。テキストにタグを付けたら、map_tagを使用してタグを簡略化します。

import nltk
from nltk.tag import pos_tag, map_tag

text = nltk.Word_tokenize("And now for something completely different")
posTagged = pos_tag(text)
simplifiedTags = [(Word, map_tag('en-ptb', 'universal', tag)) for Word, tag in posTagged]
print(simplifiedTags)
# [('And', u'CONJ'), ('now', u'ADV'), ('for', u'ADP'), ('something', u'NOUN'), ('completely', u'ADV'), ('different', u'ADJ')]
29
Bridgette

Pos_tagメソッドでtagset属性を「universal」に設定するだけです。

In [39]: from nltk import Word_tokenize, pos_tag
...: 
...: text = Word_tokenize("Here is a simple way of doing this")
...: tags = pos_tag(text, tagset='universal')
...: print(tags)
...: 
[('Here', 'ADV'), ('is', 'VERB'), ('a', 'DET'), ('simple', 'ADJ'), ('way', 'NOUN'), ('of', 'ADP'), ('doing', 'VERB'), ('this', 'DET')]
4