2016-08-17 3 views
2

У меня есть пример предложения. "Открой дверь." что я разобрал предложение, чтобы получить результат синтаксического разбора в виде скобок, как показано ниже.Как извлечь правила грамматики, заданные в квадратных скобках?

(S (VP (VB открыть) (НП (Д.Т.) (НН двери))) (..))

мне нужно извлечь правила грамматики CFG, которые производят разобранную выход , я могу вручную записывать их как таковые:

grammar = CFG.fromstring(""" 
S -> VP NP 
NP -> Det N 
VP -> V 
Det ->'the ' 
N -> 'door' 
V -> 'Open' 
""") 

Но это отнимает много времени, как я произвожу правила грамматики, данные заключенные в квадратных скобках анализируются автоматически?

+0

Пожалуйста, отредактируйте свой вопрос, чтобы уточнить, что вам нужно: в первом предложении вам нужна форма в скобках, вторая предполагает, что вы хотите вывести части базовой грамматики, которые были выпущены для этого предложения. – lenz

+0

Здесь может быть некоторая путаница, судя по тому, что вы последовательно набираете «formstring» вместо «fromstring». Формат, который вы ищете, не является деревом разбора, а скорее спецификацией грамматики (это один из входных данных парсера, а не его вывод). Поэтому я сомневаюсь, что это уже есть автоматическое решение. – lenz

+0

Да, я исправил путаницу. Это из строки. Я понимаю, что это грамматическая спецификация, которая используется для ввода. Есть ли способ создать такую ​​спецификацию с учетом дерева синтаксического анализа? Это сэкономит мне время и силы. Не только NLTK, но и любым другим способом. Если такого готового решения не существует; Можно ли создать его? –

ответ

2

Вы можете использовать Tree.productions() метод получения правил CFG с дерева.

Пример:

from nltk import Tree 

t = Tree.fromstring("(S (VP (VB open) (NP (DT the) (NN door))) (. .))") 
print t.productions() 

Выход:

[S -> VP ., VP -> VB NP, VB -> 'open', NP -> DT NN, DT -> 'the', 
NN -> 'door', . -> '.'] 

Для получения дополнительной информации проверки - NLTK Tree Productions

+0

Спасибо за помощь. –

2

Если вы хотите создать правила с заключенным в скобки разобран, вы можете использовать Tree.productions()

>>> from nltk import Tree 
>>> t = Tree.fromstring("(S (NP (D the) (N dog)) (VP (V chased) (NP (D the) (N cat))))") 
>>> t.productions() 
[S -> NP VP, NP -> D N, D -> 'the', N -> 'dog', VP -> V NP, V -> 'chased', NP -> D N, D -> 'the', N -> 'cat'] 

Tree.productions() возвращает список nltk.grammar.Productions объектов:

>>> type(t.productions()[0]) 
<class 'nltk.grammar.Production'> 

Чтобы получить правила в виде строки, используйте Production.unicode_repr:

>>> t.productions()[0].unicode_repr() 
u'S -> NP VP' 

к получить строковое представление грамматика, полученная в результате разборки в квадратных скобках:

>>> from nltk import Tree 
>>> t = Tree.fromstring("(S (NP (D the) (N dog)) (VP (V chased) (NP (D the) (N cat))))") 
>>> grammar_from_parse = "\n".join([rule.unicode_repr() for rule in t.productions()]) 
>>> print grammar_from_parse 
S -> NP VP 
NP -> D N 
D -> 'the' 
N -> 'dog' 
VP -> V NP 
V -> 'chased' 
NP -> D N 
D -> 'the' 
N -> 'cat' 
+0

Пятно на. Решилась проблема, подобная магии. –

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