Python中NLTK的命名实体识别.识别NE

Asl*_*506 20 python nlp named-entity-recognition nltk

我需要将单词分类到他们的词性中.像动词,名词,副词等.我用过

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. 
Run Code Online (Sandbox Code Playgroud)

这是一棵树.例如

>>> 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')])])
Run Code Online (Sandbox Code Playgroud)

访问此树中的元素时,我按如下方式执行:

>>> sent3[0]
('I', 'PRP')
>>> sent3[0][0]
'I'
>>> sent3[0][1]
'PRP'
Run Code Online (Sandbox Code Playgroud)

但是在访问命名实体时:

>>> 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
Run Code Online (Sandbox Code Playgroud)

我收到了上述错误.

我想要的是将输出作为'NE'类似于之前的'PRP',因此我无法识别哪个单词是命名实体.在python中用NLTK有没有办法做到这一点?如果是这样,请发布命令.或者树库中有一个函数可以执行此操作吗?我需要节点值'NE'

bdk*_*bdk 14

这个答案可能不合适,在这种情况下我会删除它,因为我没有在这里安装NLTK来尝试它,但我认为你可以这样做:

   >>> sent3[2].node
   'NE'
Run Code Online (Sandbox Code Playgroud)

sent3[2][0] 返回树的第一个子节点,而不是节点本身

编辑:当我回到家的时候,我试过这个,确实有效.

  • 在当前版本(3.1)中,`node`被`label()`取代 (6认同)