2014-11-11 3 views
1

Я проверил предыдущие связанные темы, но не решил свою проблему. Я написал код, чтобы получить NER из текста.nltk NER word extract

text = "Stallone jason's film Rocky was inducted into the National Film Registry as well as having its film props placed in the Smithsonian Museum." 

tokenized = nltk.word_tokenize(text) 
tagged = nltk.pos_tag(tokenized) 
namedEnt = nltk.ne_chunk(tagged, binary = True) 
print namedEnt 
namedEnt = nltk.ne_chunk(tagged, binary = False) 

, который дает этот короткий результата

(S 
    (NE Stallone/NNP) 
    jason/NN 
    's/POS 
    film/NN 
    (NE Rocky/NNP) 
    was/VBD 
    inducted/VBN 
    into/IN 
    the/DT 
    (NE National/NNP Film/NNP Registry/NNP) 
    as/IN 
    well/RB 
    as/IN 
    having/VBG 
    its/PRP$ 
    film/NN 
    props/NNS 
    placed/VBN 
    in/IN 
    the/DT 
    (NE Smithsonian/NNP Museum/NNP) 
    ./.) 

в то время как я ожидаю только NE в результате, как

Stallone 
Rockey 
National Film Registry 
Smithsonian Museum 

, как добиться этого?

UPDATE

result = ' '.join([y[0] for y in x.leaves()]) for x in namedEnt.subtrees() if x.node == "NE" 
print result 

дает ошибку Syntext, что правильный способ, чтобы написать это?

UPDATE2

текст = «фильм Сталлоне Ясона Рокки был введен в Национальный реестр кинокартин, а также с его фильма реквизит помещается в Смитсоновском музее.»

tokenized = nltk.word_tokenize(text) 
tagged = nltk.pos_tag(tokenized) 
namedEnt = nltk.ne_chunk(tagged, binary = True) 
print namedEnt 
np = [' '.join([y[0] for y in x.leaves()]) for x in namedEnt.subtrees() if x.node == "NE"] 
print np 

ошибка:

np = [' '.join([y[0] for y in x.leaves()]) for x in namedEnt.subtrees() if x.node == "NE"] 
    File "/usr/local/lib/python2.7/dist-packages/nltk/tree.py", line 198, in _get_node 
    raise NotImplementedError("Use label() to access a node label.") 
NotImplementedError: Use label() to access a node label. 

поэтому я попытался с

np = [' '.join([y[0] for y in x.leaves()]) for x in namedEnt.subtrees() if x.label() == "NE"] 

, которая дает пуста результата

ответ

3

namedEnt вернулся на самом деле Tree объект, который является подклассом list. Вы можете сделать следующее, чтобы разобрать его:

[' '.join([y[0] for y in x.leaves()]) for x in namedEnt.subtrees() if x.node == "NE"] 

Выход:

['Stallone', 'Rocky', 'National Film Registry', 'Smithsonian Museum'] 

binary флаг установлен в True будет указывать поддерево только ли NE или нет, что это то, что нам нужно выше. Когда установлено значение False, оно даст больше информации, например, как NE является организацией, человеком и т. Д. По какой-то причине результат с включенным и выключенным флагом, похоже, не согласуется между собой.

+0

Большое спасибо, но как это использовать? Я обновил вопрос, по-прежнему получаю ошибку с этим – puncrazy

+1

Его понимание списка, поэтому вам нужно встроить его в '[]', как 'result = ['. .Join ([y [0] для y в x.leaves ()]) для x в namedEnt.subtrees(), если x.node == "NE"] ' – Phani

+1

Также используйте это с' binary = True' – Phani

Смежные вопросы