¿Cómo hacer que este generador de texto aleatorio sea más eficiente en Python?

Estoy trabajando en un generador de texto aleatorio, sin usar cadenas de Markov, y actualmente funciona sin demasiados problemas. En primer lugar, aquí está mi flujo de código:

  1. Ingrese una oración como entrada, esto se llama cadena de activación, se asigna a una variable

  2. Obtener la palabra más larga en la cadena de activación

  3. Busque en la base de datos de Project Gutenberg las oraciones que contengan esta palabra, independientemente de las mayúsculas y minúsculas

  4. Devuelva la oración más larga que tenga la palabra de la que hablé en el paso 3

    • Agregue la oración en el Paso 1 y Paso 4 juntos

    • Asigne la oración en el Paso 4 como la nueva oración ‘desencadenante’ y repita el proceso. Tenga en cuenta que tengo que escribir la palabra más larga en la segunda oración y continuar así y así sucesivamente.

    Y aquí está mi código:

    import nltk from nltk.corpus import gutenberg from random import choice triggerSentence = raw_input("Please enter the trigger sentence: ")#get input str longestLength = 0 longestString = "" listOfSents = gutenberg.sents() #all sentences of gutenberg are assigned -list of list format- listOfWords = gutenberg.words()# all words in gutenberg books -list format- while triggerSentence: #so this is run every time through the loop split_str = triggerSentence.split()#split the sentence into words #code to find the longest word in the trigger sentence input for piece in split_str: if len(piece) > longestLength: longestString = piece longestLength = len(piece) #code to get the sentences containing the longest word, then selecting #random one of these sentences that are longer than 40 characters sets = [] for sentence in listOfSents: if sentence.count(longestString): sents= " ".join(sentence) if len(sents) > 40: sets.append(" ".join(sentence)) triggerSentence = choice(sets) print triggerSentence 

    Mi preocupación es que el bucle alcanza principalmente un punto donde la misma oración se imprime una y otra vez. Ya que es la oración más larga la que tiene la palabra más larga. Para contrarrestar el obtener la misma frase una y otra vez, pensé en lo siguiente:

    * Si la palabra más larga en la oración actual es la misma que en la oración anterior, simplemente elimine esta palabra más larga de la oración actual y busque la siguiente palabra más larga.

    Probé algunas implementaciones para esto, pero no pude aplicar la solución anterior ya que involucra listas y listas de listas (debido a las palabras y oraciones del módulo gutenberg). ¿Alguna sugerencia sobre cómo encontrar la segunda palabra más larga? Parece que no puedo hacer esto con el análisis de una entrada de cadena simple ya que las funciones .sents () y .words () del módulo Gutenberg de NLTK producen la lista de listas y listas, respectivamente. Gracias por adelantado.

    Algunas mejoras sugeridas:

    1. El bucle while se ejecutará para siempre, probablemente deberías eliminarlo.
    2. Use max y las expresiones generadoras para generar la palabra más larga de una manera eficiente en memoria.
    3. Debe generar una lista de oraciones con una longitud superior a 40 caracteres que incluyan la longestWord más longestWord con una lista de comprensión. Esto también debe eliminarse del bucle while, ya que solo sucede.

      sents = [" ".join(sent) for sent in listOfSents if longestWord in sent and len(sent) > 40]

    4. Si desea imprimir cada oración que se encuentra en un orden aleatorio, entonces podría intentar barajar la lista que acaba de crear:

      for sent in random.shuffle(sents): print sent

    Así es como podría verse el código con estos cambios:

     import nltk from nltk.corpus import gutenberg from random import shuffle listOfSents = gutenberg.sents() triggerSentence = raw_input("Please enter the trigger sentence: ") longestWord = max(triggerSentence.split(), key=len) longSents = [" ".join(sent) for sent in listOfSents if longestWord in sent and len(sent) > 40] for sent in shuffle(longSents): print sent 

    Si todo lo que necesita es generar texto aleatorio (supongo que, con el requisito de que contenga oraciones significativas), puede hacerlo mucho más simple: solo genere números aleatorios y utilícelos como índice para recuperar oraciones de su base de datos de texto (ya sea Proyecto Gutenberg o lo que sea).