Je travaille sur un générateur de texte aléatoire - sans utiliser de chaînes de Markov - et actuellement cela fonctionne sans trop de problèmes - génère effectivement une bonne quantité de phrases aléatoires selon mes critères mais je veux le rendre encore plus précis pour en prévenir autant phrase répète que possible. Tout d'abord, voici mon flux de code:Comment puis-je randomiser encore plus ce générateur de texte?
Entrez une phrase comme entrée -Ce est appelée chaîne de déclenchement, est affecté à un Variable-
Obtenez mot le plus long dans la chaîne de déclenchement
Recherche toute la base de données Project Gutenberg pour les phrases qui contiennent ce mot - sans majuscules minuscules -
Renvoyer la phrase la plus longue contenant le mot dont j'ai parlé à l'étape 3
ajouter la phrase à l'étape 1 et Etape 4 ensemble
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
import smtplib #will be for send e-mail option later
triggerSentence = raw_input("Please enter the trigger sentence: ")#get input str
longestLength = 0
longestString = ""
longestLen2 = 0
longestStr2 = ""
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:#run the loop so long as there is a trigger sentence
sets = []
sets2 = []
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
for sentence in listOfSents:
if sentence.count(longestString):
sents= " ".join(sentence)
if len(sents) > 40:
sets.append(" ".join(sentence))
triggerSentence = choice(sets)
print triggerSentence #the first sentence that comes up after I enter input-
split_str = triggerSentence.split()
for apiece in triggerSentence: #find the longest word in this new sentence
if len(apiece) > longestLen2:
longestStr2 = piece
longestLen2 = len(apiece)
if longestStr2 == longestString:
second_longest = sorted(split_str, key=len)[-2]#this should return the second longest word in the sentence in case it's longest word is as same as the longest word of last sentence
#print second_longest #now get second longest word if first is same
#as longest word in previous sentence
for sentence in listOfSents:
if sentence.count(second_longest):
sents = " ".join(sentence)
if len(sents) > 40:
sets2.append(" ".join(sentence))
triggerSentence = choice(sets2)
else:
for sentence in listOfSents:
if sentence.count(longestStr2):
sents = " ".join(sentence)
if len(sents) > 40:
sets.append(" ".join(sentence))
triggerSentence = choice(sets)
print triggerSentence
Selon mon code, une fois que je rentre un déclencheur phrase, je devrais en obtenir un autre qui contient le mot le plus long de la phrase de déclenchement que je suis entré. Alors cette nouvelle phrase devient la phrase de déclenchement et son mot le plus long est choisi. C'est là que le problème se produit parfois. J'ai observé que malgré les lignes de code que je plaçais - à partir de la ligne 47 jusqu'à la fin -, l'algorithme peut toujours choisir le même mot le plus long dans les phrases qui viennent, ne recherchant pas le second mot le plus long.
Par exemple:
chaîne Trigger = "L'Ecosse est un endroit agréable."
Phrase 1 = -Ce est une phrase au hasard avec le mot Ecosse en it-
Maintenant, c'est là le problème peut se produire dans mon code parfois -doesn't Peu importe si elle est dans la phrase 2 ou 942 ou zillion ou quoi que ce soit, mais je le donne dans send.2 par exemple-
Phrase 2 = Une autre phrase qui a le mot Écosse dans le mot mais pas le deuxième mot le plus long dans la phrase 1. Selon mon code, cette phrase aurait dû être une phrase qui contenait le deuxième mot le plus long de la phrase 1, pas l'Écosse!
Comment puis-je résoudre ce problème? J'essaie d'optimiser le code autant que possible et toute aide est la bienvenue.
Quoi de neuf avec toutes les nouvelles lignes au départ? –
@ Zonda333, quel newlines? –
@ Zonda333, oh, si vous voulez dire pourquoi il y a toujours une ligne vide entre les codes au début - dans l'importation nltk et ainsi de suite -, je l'ai fait exprès. Pendant le copier/coller le code, les lignes ont tendance à se mélanger et j'ai peut-être appuyé un peu trop sur le bouton d'entrée entre les lignes. –