我需要将单词分类为其词性。像动词,名词,副词等。
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
我收到了上述错误。
我想要的是将输出作为'NE'类似于之前的'PRP',因此我无法确定哪个词是命名实体。 在python中用NLTK有没有办法做到这一点?如果是这样,请发布命令。或者树库中有一个函数可以执行此操作吗?我需要节点值'NE'
答案 0 :(得分:14)
这个答案可能不合适,在这种情况下我会删除它,因为我没有安装NLTK来试试,但我认为你可以这样做:
>>> sent3[2].node
'NE'
sent3[2][0]
返回树的第一个子节点,而不是节点本身
编辑:我回到家时试过这个,确实有效。
答案 1 :(得分: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()))
答案 2 :(得分:2)
这将有效
for sent in chunked_sentences:
for chunk in sent:
if hasattr(chunk, "label"):
print(chunk.label())
答案 3 :(得分:1)
我同意bdk
sent3[2].node
O / P - 'NE'
我认为nltk中没有任何功能可以执行此操作。以上解决方案可以使用,但作为参考,您可以查看here
您可以执行循环问题: -
for i in range(len(sent3)):
if "NE" in str(sent3[i]):
print sent3[i].node
我已经在nltk中执行了这个并且它工作正常..
答案 4 :(得分:1)
现在发送3 [2] .node已过时。
使用sent3 [2] .label()代替