Я работаю над генератором случайных текстов - без использования цепей Маркова - и в настоящее время он работает без особых проблем - фактически генерирует большое количество случайных предложений по моим критериям, но я хочу сделать его еще более точным, чтобы предотвратитьМногие предложения повторяются, насколько это возможно.Во-первых, вот мой поток кода:
Введите предложение в качестве ввода - это называется триггерной строкой, назначенной переменной-
Получить самое длинное слово в строке триггера
Искать во всей базе данных Project Gutenberg предложения, содержащие это слово - независимо от прописных букв -
Возвращать самое длинноепредложение, содержащее слово, о котором я говорил на шаге 3
Добавьте предложение на шаге 1 и шаге 4 вместе
Назначьте предложение на шаге 4как новое «триггерное» предложение и повторите процесс.Обратите внимание, что я должен получить самое длинное слово во втором предложении и продолжать в том же духе и так далее -
И вот мой код:
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
Согласно моемукод, после ввода триггерного предложения я должен получить еще одно, содержащее самое длинное слово из триггерного предложения, которое я ввел.Затем это новое предложение становится триггерным предложением, и выбирается его самое длинное слово.Это где проблема иногда возникает.Я заметил, что, несмотря на строки кода, которые я поместил - начиная со строки 47 до конца, алгоритм по-прежнему может выбирать одно и то же самое длинное слово в предложениях, не ища второе самое длинное слово.
Дляпример:
Trigger string = "Шотландия - хорошее место."
Предложение 1 = -Это случайное предложение со словом Шотландия в нем-
Теперь этогде проблема может возникать в моем коде время от времени - не имеет значения, встречается ли он в предложении 2, или в 942, или в zillion, или что-то в этом роде, но я даю его в sent.2, например, ради -
Предложение 2= Другое предложение, в котором есть слово «Шотландия», но не второе самое длинное слово в предложении 1. Согласно моему коду, это предложение должно было быть каким-то предложением, содержащим второе самое длинное слово в предложении 1, а не «Шотландия»!
Как я могу решить это?Я пытаюсь максимально оптимизировать код, и любая помощь приветствуется.