2013-07-15 5 views
1

Я использую Python 3.2, и я попытался построить случайно созданное дерево синтаксиса для предложения. Хотя я уверен, что он генерирует предложение, я не уверен, насколько случайным является синтаксический анализ дерево, а также, я не знаю, есть ли лучший/более эффективный способ улучшить этот код. (Я новичок в программировании и Python, как таковой, и я недавно был заинтересован в NLP. Любые советы, решение или исправления приветствуются.)Произвольно сгенерированное дерево разбора с использованием набора исправлений словаря

N=['man','dog','cat','telescope','park'] #noun 
P=['in','on','by','with'] #preposition 
det=['a','an','the','my'] #determinant 
V=['saw','ate','walked'] #verb 
NP=['John','Mary','Bob'] #noun phrase 


from random import choice 
PP=choice(NP)+' '+choice(P) #preposition phrase 
PP=''.join(PP) 
VP=''.join(choice(V)+' '+choice(NP)) or''.join(choice(V)+' '.choice(NP)+(PP)) #verb phrase   
VP=''.join(VP) #verb phrase 
S=choice(NP)+' '+VP #sentence 
print(S) 
+0

[Правильное место на ваш вопрос: обзор кода] (http://codereview.stackexchange.com/?as=1) –

+0

Я отметил свой вопрос для обзора кода. – RamyaV

+0

http://codereview.stackexchange.com/?as=1 –

ответ

2

попробовать NLTK, http://nltk.org/book/ch08.html

import nltk 
from random import choice, shuffle, random 

# Sometimes i find reading terminals as values into a dict of POS helps. 
vocab={ 
'Det':['a','an','the','my'], 
'N':['man','dog','cat','telescope','park'], 
'V':['saw','ate','walked'], 
'P':['in','on','by','with'], 
'NP':['John','Mary','Bob'] 
} 

vocab2string = [pos + " -> '" + "' | '".join(vocab[pos])+"'" for pos in vocab] 

# Rules are simpler to be manually crafted so i left them in strings 
rules = ''' 
S -> NP VP 
VP -> V NP 
VP -> V NP PP 
PP -> NP P 
NP -> Det N 
''' 

mygrammar = rules + "\n".join(vocab2string) 
grammar = nltk.parse_cfg(mygrammar) # Loaded your grammar 
parser = nltk.ChartParser(grammar) # Loaded grammar into a parser 

# Randomly select one terminal from each POS, based on infinite monkey theorem, i.e. selection of words without grammatical order, see https://en.wikipedia.org/wiki/Infinite_monkey_theorem 
words = [choice(vocab[pos]) for pos in vocab if pos != 'P'] # without PP 
words = [choice(vocab[pos]) for pos in vocab] + choice(vocab('NP')) # with a PP you need 3 NPs 

# To make sure that you always generate a grammatical sentence 
trees = [] 
while trees != []: 
    shuffle(words) 
    trees = parser.nbest_parse(words) 

for t in trees: 
    print t 
+0

Спасибо. Я использовал python 3.I не поддерживал nltk version.but, спасибо большое за то, что направил меня к бесконечной теореме обезьяны , – RamyaV

+0

@RamyaV есть версия 3.0alpha, которую вы можете скачать, которая поддерживает python 3. http://nltk.org/nltk3-alpha/ – Xin