Как я могу еще более рандомизировать этот генератор текста? - PullRequest
0 голосов
/ 30 августа 2010

Я работаю над генератором случайных текстов - без использования цепей Маркова - и в настоящее время он работает без особых проблем - фактически генерирует большое количество случайных предложений по моим критериям, но я хочу сделать его еще более точным, чтобы предотвратитьМногие предложения повторяются, насколько это возможно.Во-первых, вот мой поток кода:

  1. Введите предложение в качестве ввода - это называется триггерной строкой, назначенной переменной-

  2. Получить самое длинное слово в строке триггера

  3. Искать во всей базе данных Project Gutenberg предложения, содержащие это слово - независимо от прописных букв -

  4. Возвращать самое длинноепредложение, содержащее слово, о котором я говорил на шаге 3

  5. Добавьте предложение на шаге 1 и шаге 4 вместе

  6. Назначьте предложение на шаге 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, а не «Шотландия»!

Как я могу решить это?Я пытаюсь максимально оптимизировать код, и любая помощь приветствуется.

1 Ответ

0 голосов
/ 31 августа 2010

В вашем алгоритме нет ничего случайного.Это всегда должно быть детерминированным.

Я не совсем уверен, что вы хотите сделать здесь.Если это для генерации случайных слов, просто используйте словарь и случайный модуль.Если вы хотите получить случайные предложения из проекта Гутенберга, используйте случайный модуль, чтобы выбрать работу, а затем предложение из этой работы.

...