|
|
|
from .parse_trees import load_trees_from_json
|
|
|
|
from .medialab import crear_base_datos, paso
|
|
|
|
from random import shuffle, random
|
|
|
|
|
|
|
|
# creating Markov Chain in text & trees
|
|
|
|
def path(word, words_tree, words_path, trees):
|
|
|
|
# Collects a list of trees to visit
|
|
|
|
tree_index = {}
|
|
|
|
itinerary = []
|
|
|
|
current_step = word.capitalize() + ' '
|
|
|
|
previous_steps = ''
|
|
|
|
markov_decision_traces = [ ( word, 0, [word]) ]
|
|
|
|
|
|
|
|
posibilities, dice, next_word = paso(word, words_tree, words_path)
|
|
|
|
|
|
|
|
while len(itinerary) < 50 and next_word not in '.!?':
|
|
|
|
if next_word in ',:;\)':
|
|
|
|
current_step = current_step[:-1]
|
|
|
|
current_step += ' '
|
|
|
|
|
|
|
|
breath = random()
|
|
|
|
if breath < 0.1:
|
|
|
|
separator = '\n'
|
|
|
|
else:
|
|
|
|
separator = ' '
|
|
|
|
|
|
|
|
current_step += (next_word + separator)
|
|
|
|
markov_decision_traces.append(( next_word, dice, posibilities ))
|
|
|
|
|
|
|
|
if next_word in words_tree:
|
|
|
|
# Current word is a tree word, this step in the itinerary is 'complete'
|
|
|
|
# Word is not yet in the index, add a tree for this word
|
|
|
|
if next_word not in tree_index:
|
|
|
|
# Add tree to index and remove from list of available trees
|
|
|
|
tree_index[next_word] = trees.pop(0)
|
|
|
|
|
|
|
|
# Retreive tree linked to this word from the index
|
|
|
|
tree = tree_index[next_word]
|
|
|
|
|
|
|
|
# Get a next word from the database
|
|
|
|
word = next_word
|
|
|
|
posibilities, dice, next_word = paso(word, words_tree, words_path)
|
|
|
|
|
|
|
|
# Try to look ahead to the next word, if the next word
|
|
|
|
# is interpunction, add it to the current step
|
|
|
|
# but first remove trailing space
|
|
|
|
if next_word in '.,:;!?\)':
|
|
|
|
current_step = current_step[:-1] + next_word + ' '
|
|
|
|
# Request a new next word to continue generation
|
|
|
|
markov_decision_traces.append(( next_word, dice, posibilities ))
|
|
|
|
|
|
|
|
# Test whether the next word marks the end of a sentence,
|
|
|
|
# thus the end of the itinerary. Then don't touch it so the
|
|
|
|
# while will break.
|
|
|
|
if next_word not in '.!?':
|
|
|
|
word = next_word
|
|
|
|
posibilities, dice, next_word = paso(word, words_tree, words_path)
|
|
|
|
|
|
|
|
|
|
|
|
# Add the current step, and the tree to the itinerary
|
|
|
|
itinerary.append((
|
|
|
|
current_step,
|
|
|
|
previous_steps,
|
|
|
|
tree,
|
|
|
|
markov_decision_traces
|
|
|
|
))
|
|
|
|
|
|
|
|
previous_steps += current_step
|
|
|
|
|
|
|
|
# Clear the current step
|
|
|
|
current_step = ''
|
|
|
|
markov_decision_traces = []
|
|
|
|
else:
|
|
|
|
word = next_word
|
|
|
|
posibilities, dice, next_word = paso(word, words_tree, words_path)
|
|
|
|
|
|
|
|
return itinerary
|
|
|
|
|
|
|
|
# Genera un camino a partir de un texto y una palabra del texto
|
|
|
|
def crear_camino(nombre_archivo, palabra_inicial):
|
|
|
|
trees = load_trees_from_json()
|
|
|
|
shuffle(trees)
|
|
|
|
|
|
|
|
#print("Starting to read text")
|
|
|
|
(palabras_arboles, palabras_camino) = crear_base_datos(nombre_archivo)
|
|
|
|
|
|
|
|
#print("Amount of tree words: ", len(palabras_arboles))
|
|
|
|
|
|
|
|
return path(palabra_inicial, palabras_arboles, palabras_camino, trees)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
import os.path
|
|
|
|
|
|
|
|
basepath = os.path.dirname(__file__)
|
|
|
|
|
|
|
|
#EJECUCIÓN__________________________________________________________________
|
|
|
|
print('Puedes elegir una novela para crear tu Paseo por árboles de Madrid.')
|
|
|
|
print('Opción 1: La novela "La madre naturaleza" de la escritora feminista Emilia Pardo Bazán \
|
|
|
|
fue publicada en 1887. Usa en esta obra una prosa poética y descriptiva, y en sus páginas se \
|
|
|
|
siente el amor que profesa al paisaje gallego, con un conocimiento de la botánica y de \
|
|
|
|
las costumbres rurales muy superior al de sus contemporáneos.')
|
|
|
|
print('Opción 2: La novela "Miau" del escritor Benito Pérez Galdós fue publicada en 1888. \
|
|
|
|
Enmarcada en el género realista, satiriza el Madrid burocrático de finales del siglo XIX \
|
|
|
|
a partir de las vicisitudes vitales de su protagonista, Ramón Villaamil, \
|
|
|
|
un competente exempleado del Ministerio de Hacienda, al que una serie de intrigas \
|
|
|
|
han dejado cesante.')
|
|
|
|
novel = input('Por favor, marca 1 o 2: ')
|
|
|
|
|
|
|
|
first_word = 'un'
|
|
|
|
if novel == '1':
|
|
|
|
novel = os.path.join(basepath, '../data/emilia_prueba.txt')
|
|
|
|
author = 'Emilia Pardo Bazán'
|
|
|
|
title = 'La Madre Naturaleza'
|
|
|
|
else:
|
|
|
|
novel = os.path.join(basepath, '../data/prueba.txt')
|
|
|
|
author = 'Benito Pérez Gáldos'
|
|
|
|
title = 'Miau'
|
|
|
|
|
|
|
|
# Create title/subtitle
|
|
|
|
print('\nPaseo por los árboles de Madrid con', author, 'y', title, '\n')
|
|
|
|
print('-------------------------------------------------------------------------------------------\n')
|
|
|
|
|
|
|
|
# Create chapters
|
|
|
|
path = crear_camino(novel, first_word)
|
|
|
|
|
|
|
|
sentences = []
|
|
|
|
for sentence, concatenated_steps, tree, traces in path:
|
|
|
|
for word, dice, options in traces:
|
|
|
|
print('Dice rolled - {} -'.format(dice))
|
|
|
|
print('New word - {} - chosen from {}'.format(word, options))
|
|
|
|
print('')
|
|
|
|
sentences.append(sentence)
|
|
|
|
print('Itinerary:\n{} \n'.format(''.join(sentences)))
|
|
|
|
print('Tree linked to last word :', tree['properties']['NOMBRE_COMUN'], ' en ', tree['properties']['MINTDIRECCIONAUX'], '\n')
|
|
|
|
print('\n')
|
|
|
|
|