2015-08-11 4 views
1

Я хочу анализировать предложения с помощью NLTK и отображать их куски как дерево. NLTK предлагает метод tree.draw() рисовать дерево. Это следующий код рисует дерево для предложения «маленькая желтая собака залаяла на кошку»:Рисование сглаживания дерева NLTK с кусками NP

import nltk 
sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"), ("dog", "NN"), ("barked","VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")] 

pattern = "NP: {<DT>?<JJ>*<NN>}" 
NPChunker = nltk.RegexpParser(pattern) 
result = NPChunker.parse(sentence) 
result.draw() 

В результате это дерево:

example tree

Как я получить дерево с еще одним уровнем?

deeper tree

+0

@alvas , почему вы изменили название на «Flatten»? Я бы не сказал, что вопрос OPs о уплощении - ветвление деревьев одинаково в обоих примерах. Скорее, ОП запрашивает отдельный уровень для тегов PoS (кстати, не только для слов, отличных от NP) ...). – lenz

+0

@ lenz, потому что, скорее всего, это то, что ему нужно. Поскольку шаблон NP, который он использовал, - это то, что люди делают с извлечением термина, извлечением существительных/сущностей и т. Д. И '.draw()' является чисто представлением, поэтому он не изменит большую часть результатов синтаксического анализа =) Просто удвоить check, @raxer, это то, о чем вы просите? – alvas

+0

@alvas, моя цель - еще одна презентация. Возьмем, к примеру, слово «желтый». У него есть pos tag 'JJ'. На первом рисунке «JJ» находится на том же слое, что и желтый. Но на второй картине 'JJ' имеет слой над словом желтый. Как я могу отобразить его, как на втором изображении? – raxer

ответ

2

Вы должны "на уровне" ваш не-NP слова, вот хак:

import nltk 
sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"), ("dog", "NN"), ("barked","VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")] 

pattern = """NP: {<DT>?<JJ>*<NN>} 
VBD: {<VBD>} 
IN: {<IN>}""" 
NPChunker = nltk.RegexpParser(pattern) 
result = NPChunker.parse(sentence) 
result.draw() 

[выход]:

enter image description here


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