Прилагательные, используемые с именованными сущностями

Я использовал приведенный ниже код Python для извлечения именованных сущностей, присутствующих в тексте. Теперь мне нужно получить прилагательные из тех предложений в тексте, где есть именованная сущность. то есть прилагательное, используемое с именованными объектами. Могу ли я изменить свой код, чтобы проверить, есть ли в дереве "JJ", если есть "NE", или есть какой-то другой подход?

def tokenize(text): 
sentences = nltk.sent_tokenize(text) 
sentences = [nltk.word_tokenize(sent) for sent in sentences] 
sentences = [nltk.pos_tag(sent) for sent in sentences] 
return sentences 

text=open("file.txt","r").read() 
sentences=tokenize(text) 
chunk_sent=nltk.batch_ne_chunk(sentences,binary=True)
print chunk_sent[1]

Выход:

Дерево ('S', [("'", "POS"), ("Выполнено", "NNP"), ("in", "IN"), ("речь", "NN"), (",', ','), Tree('NE', [('Gautam', 'NNP')]), (',', ','), ('then ', 'RB'), ('questioned', 'VBD'), (',', ','), ('give', 'VBD'), ('in', 'IN'), ('the', 'DT'), ('midst'), 'NN'), ('of', 'IN'), ('that', 'DT'), ('big', 'JJ'), ('сборка', 'NN'), ('of', 'IN'), ('созерцательный', 'JJ'), ('sages' 'NNP'), ('a', 'DT'), ('full', ' JJ'), ('and', 'CC'), ('Proper', 'NN'), ('answer', 'NN'), ('in', 'IN'), ('words', 'NNS'), ('consonant', 'JJ'), ('with', 'IN'), ('its', 'PRP$'), ('mode', 'NN'), ('of', 'IN'), ('life'), 'NN'), ('.', '.')])

Хотя в этом предложении нет JJ до NE. Как я могу использовать JJ с NE?

def ne(tree):
    names = []
    if hasattr(tree, 'node') and tree.node:
      if tree.node == 'NE':
        names.append(' '.join([child[0] for child in tree]))
    else:
        for child in tree:
            names.extend(ne(child))

return names

names = []
for item in chunk_sent:
   names.extend(ne(item))
print names

1 ответ

Решение
>>> from nltk.corpus import brown
>>> from nltk import batch_ne_chunk as bnc
>>> from nltk.tree import Tree
>>> sentences = brown.tagged_sents()[0:5]
>>> chunk_sents = bnc(sentences)
>>> 
>>> for sent in chunk_sents:
...     for i,j in zip(sent[:-1], sent[1:]):
...             if type(j) is Tree and i[1].startswith("JJ"):
...                     print i,j
... 
('Grand', 'JJ-TL') (PERSON Jury/NN-TL)
('Executive', 'JJ-TL') (ORGANIZATION Committee/NN-TL)
Другие вопросы по тегам