Я работаю над генератором случайных текстов - без использования цепей Маркова - и в настоящее время он работает без особых проблем. Во-первых, вот мой поток кода:
Введите предложение в качестве ввода - это называется триггерной строкой, присваивается переменной-
Получить самое длинное слово в строке триггера
Поиск во всей базе данных Project Gutenberg предложений, содержащих это слово - независимо от прописных букв -
Верните самое длинное предложение со словом, о котором я говорил на шаге 3
Добавить предложение в Шаг 1 и Шаг 4 вместе
Назначьте предложение на шаге 4 как новое «триггерное» предложение и повторите процесс. Обратите внимание, что я должен получить самое длинное слово во втором предложении и продолжать в том же духе и так далее -
А вот и мой код:
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
Меня беспокоит то, что цикл в основном достигает точки, где одно и то же предложение печатается снова и снова. Так как это самое длинное предложение, которое имеет самое длинное слово. Чтобы противостоять получению одного и того же предложения снова и снова, я подумал о следующем:
* Если самое длинное слово в текущем предложении такое же, как и в последнем предложении, просто удалите это самое длинное слово из текущего предложения и найдите следующее самое длинное слово.
Я попробовал несколько реализаций для этого, но не смог применить вышеупомянутое решение, так как оно включает списки и список списков - из-за слов и предложений из модуля Гутенберга -. Любые предложения о том, как найти второе самое длинное слово? Кажется, я не могу сделать это с помощью парсинга простого строкового ввода, поскольку функции .sents () и .words () модуля Gutenberg из NLTK выдают список list и list соответственно. Заранее спасибо.