2017-05-29 9 views
1

nltkでne_chunkとpos_tagを使用して文をチャンクしようとしています。NLTKでpos_tagのないne_chunk

from nltk import tag 
from nltk.tag import pos_tag 
from nltk.tree import Tree 
from nltk.chunk import ne_chunk 

sentence = "Michael and John is reading a booklet in a library of Jakarta" 
tagged_sent = pos_tag(sentence.split()) 

print_chunk = [chunk for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)] 

print print_chunk 

と、これが結果です:

[Tree('GPE', [('Michael', 'NNP')]), Tree('PERSON', [('John', 'NNP')]), Tree('GPE', [('Jakarta', 'NNP')])] 

私の質問は、それが(上記のNNPのような)pos_tagが含まれており、唯一のツリー 'GPE'、 'PERSON' を含まないようにすることができますか? 「GPE」とは何ですか?事前

答えて

2

おかげ固有表現チャンカは、あなたのチャンクとタグの両方を含むツリーを与えるだろう。これを変更することはできませんが、タグを削除することはできます。あなたのtagged_sent最低料金:あなたが唯一のチャンクをしたい場合は

chunks = nltk.ne_chunk(tagged_sent) 
simple = [] 
for elt in chunks: 
    if isinstance(elt, Tree): 
     simple.append(Tree(elt.label(), [ word for word, tag in elt ])) 
    else: 
     simple.append(elt[0]) 

は、上記にelse:句を省略します。チャンクを任意の方法でラップするようにコードを調整できます。変更を最小限に抑えるためにnltk Treeを使用しました。いくつかのチャンクは複数の単語で構成されています(例に "New York"を追加してください)。そのため、チャンクの内容は単一の要素ではなくリストでなければなりません。

PS。 「GPE」は「地政学的エンティティ」(明らかにチャンクミス)を表します。 nltkの本でよく使われるタグのリスト、hereを見ることができます。

+0

感謝を参照してください!私はいくつかの特別なNEを訓練することができますか?マイケルのようなものは人名なので「GPE」ではなく「人」でなければなりません。 – sang

+0

nltk本を読んでください。あなたがまだ不思議であれば、ここに新しい質問をしてください。簡単な答えは、統計的手がかりを無効にするために人名の辞書を追加することができますが、一般的にはあなたができることはあまりありません。あまり手作業で修正しようとすると、修正した以上に壊れます。 (例:ニュージャージー州の人や都市である「エリザベス」ですか?) – alexis

1

ほとんどの場合、タグ付きのhttps://stackoverflow.com/a/31838373/610569のコードが少し変更されています。

上記のNNPのようなpos_tagは含まれておらず、ツリー 'GPE'、 'PERSON'のみを含む可能性がありますか?

はい、単にHow to Traverse an NLTK Tree object?

>>> from nltk import Tree, pos_tag, ne_chunk 
>>> sentence = "Michael and John is reading a booklet in a library of Jakarta" 
>>> tagged_sent = ne_chunk(pos_tag(sentence.split())) 
>>> tagged_sent 
Tree('S', [Tree('GPE', [('Michael', 'NNP')]), ('and', 'CC'), Tree('PERSON', [('John', 'NNP')]), ('is', 'VBZ'), ('reading', 'VBG'), ('a', 'DT'), ('booklet', 'NN'), ('in', 'IN'), ('a', 'DT'), ('library', 'NN'), ('of', 'IN'), Tree('GPE', [('Jakarta', 'NNP')])]) 

>>> from nltk.sem.relextract import NE_CLASSES 
>>> ace_tags = NE_CLASSES['ace'] 

>>> for node in tagged_sent: 
...  if type(node) == Tree and node.label() in ace_tags: 
...   words, tags = zip(*node.leaves()) 
...   print node.label() + '\t' + ' '.join(words) 
... 
GPE Michael 
PERSON John 
GPE Jakarta 

何GPE "手段を参照してください)=ツリーオブジェクトをトラバース?

GPEは "地政学的エンティティ" を意味

関連する問題