20

単語を品詞に分類する必要があります。動詞、名詞、副詞などのように。私は

nltk.word_tokenize() #to identify word in a sentence 
nltk.pos_tag()       #to identify the parts of speech
nltk.ne_chunk()      #to identify Named entities. 

これの出力は木です。例えば

>>> sentence = "I am Jhon from America"
>>> sent1 = nltk.word_tokenize(sentence )
>>> sent2 = nltk.pos_tag(sent1)
>>> sent3 =  nltk.ne_chunk(sent2, binary=True)
>>> sent3
Tree('S', [('I', 'PRP'), ('am', 'VBP'), Tree('NE', [('Jhon', 'NNP')]), ('from', 'IN'), Tree('NE', [('America', 'NNP')])])

このツリーの要素にアクセスするとき、私は次のようにアクセスしました。

>>> sent3[0]
('I', 'PRP')
>>> sent3[0][0]
'I'
>>> sent3[0][1]
'PRP'

ただし、名前付きエンティティにアクセスする場合:

>>> sent3[2]
Tree('NE', [('Jhon', 'NNP')])
>>> sent3[2][0]
('Jhon', 'NNP')
>>> sent3[2][1]    
Traceback (most recent call last):
  File "<pyshell#121>", line 1, in <module>
    sent3[2][1]
  File "C:\Python26\lib\site-packages\nltk\tree.py", line 139, in __getitem__
    return list.__getitem__(self, index)
IndexError: list index out of range

上記のエラーが発生しました。

私が欲しいのは、前の「PRP」と同様の「NE」として出力を取得することです。そのため、どの単語が名前付きエンティティであるかを識別できません。PythonのNLTKでこれを行う方法はありますか?もしそうなら、コマンドを投稿してください。または、これを行うための関数がツリーライブラリにありますか?ノード値「NE」が必要です

4

6 に答える 6

14

この回答はベースから外れている可能性があります。その場合は、試してみるためにここにNLTKをインストールしていないため、削除しますが、次のことができると思います。

   >>> sent3[2].node
   'NE'

sent3[2][0]ノード自体ではなく、ツリーの最初の子を返します

編集:家に帰ってこれを試してみましたが、実際に機能します。

于 2011-04-18T20:58:10.060 に答える
4

以下は私のコードです:

chunks = ne_chunk(postags, binary=True)
for c in chunks:
  if hasattr(c, 'node'):
    myNE.append(' '.join(i[0] for i in c.leaves()))
于 2013-02-15T05:11:49.800 に答える
1

私はbdkに同意します

sent3[2].node

O/P - 'NE'

nltk にはそれを行う機能がないと思います。上記の解決策は機能しますが、参考のためにここで確認できます

あなたができるループ問題のために:-

 for i in range(len(sent3)):
     if "NE" in str(sent3[i]):
          print sent3[i].node

これをnltkで実行しましたが、正常に動作します..

于 2013-10-09T11:18:15.053 に答える