2010-08-29 23 views
3

Je travaille sur un générateur de texte aléatoire - sans utiliser de chaînes de Markov - et cela fonctionne actuellement sans trop de problèmes. Tout d'abord, voici mon flux de code:Comment rendre ce générateur de texte aléatoire plus efficace en Python?

  1. Entrez une phrase comme entrée -Ce est appelée chaîne de déclenchement, est affecté à un Variable-

  2. Obtenez mot le plus long dans la chaîne de déclenchement

  3. Recherche toute la base de données Project Gutenberg pour les phrases qui contiennent ce mot - sans majuscules minuscules -

  4. Renvoyer la phrase la plus longue contenant le mot dont j'ai parlé à l'étape 3

  5. ajouter la phrase à l'étape 1 et Etape 4 ensemble

  6. Affecter la phrase à l'étape 4 comme la nouvelle phrase « gâchette » et répéter le processus. Notez que je dois obtenir le mot le plus long dans la deuxième phrase et continuer comme ça et ainsi ON-

Et voici mon code:

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 

Ma préoccupation est, la boucle atteint la plupart du temps à un point où la même phrase est imprimée encore et encore. Puisque c'est la phrase la plus longue qui a le mot le plus long. Pour contrer la répétition de la même phrase, j'ai pensé aux éléments suivants:

* Si le mot le plus long de la phrase actuelle est le même que dans la dernière phrase, supprimez simplement ce mot le plus long de la phrase en cours et cherchez le prochain mot le plus long.

J'ai essayé quelques implémentations pour cela mais je n'ai pas réussi à appliquer la solution ci-dessus car elle implique des listes et une liste de listes - en fonction des mots et des phrases du module gutenberg-. Des suggestions sur la façon de trouver le deuxième mot le plus long? Il semble que je ne puisse pas faire cela en analysant une simple entrée de chaîne puisque les fonctions .sents() et .words() du module Gutenberg de NLTK donnent respectivement la liste des listes et des listes. Merci d'avance.

+0

La balise '[process]' n'ajoute aucune information utile. La balise '[random]' serait plus appropriée. – Zaz

+0

@Josh Aye, monsieur! – jensgram

+0

Ces variablesNames seraient beaucoup plus pythoniques que [noms_variable] (http://www.python.org/dev/peps/pep-0008/) – Daenyth

Répondre

0

Quelques améliorations suggérées:

  1. La boucle while fonctionnera toujours, vous devez supprimer probablement.
  2. Utilisez max et les expressions de générateur pour générer le mot le plus long d'une manière efficace pour la mémoire.
  3. Vous devez générer une liste de phrases d'une longueur supérieure à 40 caractères comprenant longestWord avec une compréhension de la liste. Cela devrait également être retiré de la boucle while, car cela arrive seulement.

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

  4. Si vous voulez imprimer chaque phrase qui se trouve dans un ordre aléatoire, alors vous pouvez essayer brouiller la liste que vous venez de créer:

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

Voici comment le code pourrait ressembler à ces changements:

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 
+1

Builtin max() prend une fonction. longestWord = max (triggerSentence.split(), key = len) – kevpie

+0

+1 merci @kevpie, ne connaissait pas l'argument 'key' –

1

Si tout ce dont vous avez besoin est de générer du texte aléatoire (je suppose, avec des phrases significatives), vous pouvez le faire beaucoup plus simplement: Générez des nombres aléatoires et utilisez-les comme index pour extraire des phrases de votre base de données. Gutenberg ou autre).