NLTK:摆脱括号和pos-tagger

时间:2014-03-20 20:10:24

标签: python nlp nltk pos-tagger

我有这段代码。

from nltk import pos_tag, ne_chunk
import nltk.chunk
from nltk.corpus import names
qry = "who is Ronald Avon"
tokens = nltk.tokenize.word_tokenize(qry)
pos = nltk.pos_tag(tokens)
sentt = nltk.ne_chunk(pos, binary = False)
person = []
for subtree in sentt.subtrees(filter=lambda t: t.node == 'PERSON'):
    for leave in subtree.leaves():
        person.append(leave)
print "person=", person

它在一个句子中得到名字。这是我得到的结果。

person= [('Ronald', 'NNP'), ('Avon', 'NNP')]

我如何得到这样的结果:

Ronald
Avon

没有'NNP'和括号。感谢。

4 个答案:

答案 0 :(得分:2)

使用列表理解。

获取一系列名称:

names = [name for name, tag in person]

以您给出的格式输出字符串:

# Python 2 (print is a statement)
print "\n".join([name for name, tag in person])

# Python 3 (print is a function)
print("\n".join([name for name, tag in person]))

这实际上是一个基本的Python数据结构问题 - 它并不特定于NLTK。您可能会发现像An informal guide to Python这样的介绍性指南很有用。

答案 1 :(得分:1)

那样的东西?

>>>for z in [i for i,y in person]: print z
Ronald
Avon
>>>

答案 2 :(得分:1)

for subtree in sentt.subtrees(filter=lambda t: t.node == 'PERSON'):
    for name, tag in subtree.leaves():
        person.append(name)

print('\n'.join(person))

答案 3 :(得分:1)

在不知道NLTK的情况下,您似乎不得不对返回数据的结构做出一些假设,即它是否始终是2元素元组的2元素列表。从它的外观来看,你可以这样做:

person.append("%s %s" % (leave[0][0], leave[1][0]))

如果你想打印" Ronald Avon"。