2015-03-10 2 views
0

Я должен разобрать этот меченый предложение с помощью NLTK-х RegexpParser: собака преследовала черная кошка и я использовал следующий grammar:Сменный лист метка Дерево в NLTK

tagged_ = [('the', 'DT'), ('dog', 'NN'), ('chased', 'VBD'), ('the', 'DT'), ('black', 'JJ'), ('cat', 'NN')]

grammar = """NP: {<DT>?<JJ>*<NN>} VP: {<MD>?<VBD>}""" cp = nltk.RegexpParser(grammar) result = cp.parse(tagged_) print(result) result.draw()

это представляет собой выход print(result) и result.draw():

(S (NP the/DT dog/NN) (VP chased/VBD) (NP the/DT black/JJ cat/NN)) Tree

Теперь я хочу, чтобы изменить порядок, в котором листья (VP chased/VBD) и (NP the/DT dog/NN) обменены быть таким:

S (VP chased/VBD) (NP the/DT dog/NN) (NP the/DT black/JJ cat/NN)) затем отобразить ['chased','the','dog','the','black','cat']. Там в любом случае?

+0

Что должно быть Идея алгоритм? Просто сдвиньте глагольную фразу данного предложения в первую позицию? –

+0

Его как * Реорганизация на основе правил *, я не могу найти коды, которые анализируют ** SUBJECT-OBJECT-VERB ** предложения, используя NLTK. Так что я только что сделал, это разобрать сундук и фраза фразы. Моя идея переупорядочить английское правило предложения (SVO) на ** VERB-SUBJECT-OBJECT ** заключается в том, чтобы указать значение входного предложения на другой язык, который не следует правилу SVO, но следуйте правилу VSO. –

ответ

0

Вы можете рассматривать объект nltk.Tree как набор двух значений. Первое значение - это имя корневого узла, а второе значение - список, содержащий дочерние деревья или листья. Вы можете построить сложное дерево по Append дочерних деревьев в списке корня:

>>> from nltk import Tree 
>>> tree = Tree('S', []) 
>>> np = Tree('NP', ['The', 'dog']) 
>>> tree.append(np) 
>>> vp = Tree('VP', ['barks']) 
>>> tree.append(vp) 
>>> print tree 
(S (NP the dog) (VP barks)) 

Вы можете перебрать все вложенные деревья tree.subtrees():

>>> for sub in tree.subtrees(): 
...  print sub 
(S (NP the dog) (VP barks) 
(NP the dog) 
(VP barks) 

Как вы можете видеть, метод выводит все суб деревья, т.е. в сложном дереве вы получаете суб деревья, суб суб деревьев, суб суб суб деревья ... Так что в вашем случае, вы должны лучше получить доступ ломтиков первого уровня дерева:

>>> new = Tree('S', []) 
>>> for i in xrange(len(tree)): 
...  if tree[i].label() == 'VP': 
...   new.insert(0, tree[i]) 
...  else: 
...   new.append(tree[i]) 

>>> print new 
(S (VP barks) (NP the dog)) 
+0

Спасибо, сэр, но что, если входное предложение неизвестно? Моя единственная проблема состоит в том, что из тегов каждого токена писать грамматику, чтобы идентифицировать ** SUBJECT, VERB OBJECT ** в предложении, используя 'nltk.RegexpParser' и' parse', которые возвращают 'Tree', а затем переупорядочивают его до * * VERB-SUBJECT-OBJECT **. –

+0

В стандартной среде nltk нет синтаксического анализатора, который может определять грамматические отношения (предмет, объект и т. Д.). Я полагаю, что нет простой стратегии отделить грамматические отношения от фраз, кроме простых предложений. Standford Dependency Parser, который может использоваться вместе с nltk, способен анализировать объект, объект и так далее. См. Здесь для демонстрации в Интернете: http://nlp.stanford.edu:8080/corenlp/ –

+0

Тогда еще раз спасибо вам, сэр. Я думаю, что я должен использовать корпус. То, что делает моя программа, - это перевод с использованием подхода, основанного на знаниях, но ограничения ограничиваются только простыми предложениями. Есть ли способ, как вы сказали: «Я полагаю, что нет простой стратегии обнаружения грамматических отношений из фраз, кроме ** простых предложений ** _», и, пожалуйста, проверьте мой алгоритм и коды здесь. https://github.com/tomcrack/EYT –

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