Как сделать этот генератор случайных текстов более эффективным в Python? - PullRequest
3 голосов
/ 29 августа 2010

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

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

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

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

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

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

  6. Назначьте предложение на шаге 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 соответственно. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 20 октября 2010

Если все, что вам нужно, это генерировать случайный текст (я думаю, с требованием, чтобы он содержал содержательные предложения), вы можете сделать это намного проще: просто сгенерируйте случайные числа и используйте их в качестве индекса для извлечения предложений из вашей текстовой базы данных (будь то Проект Гутенберг или что-то еще).

0 голосов
/ 11 октября 2010

Некоторые предлагаемые улучшения:

  1. Цикл while будет работать вечно, вероятно, его следует удалить.
  2. Используйте max и выражения генератора для генерации самого длинного слова с эффективным использованием памяти.
  3. Вы должны сгенерировать список предложений длиной более 40 символов, которые включают longestWord с пониманием списка. Это также следует удалить из цикла while, как это только происходит.

    отправлено = [" ".join(sent) for sent in listOfSents if longestWord in sent and len(sent) > 40]

  4. Если вы хотите распечатать каждое предложение, которое найдено в случайном порядке, то вы можете попробовать перетасовать список, который вы только что создали:

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

Вот как может выглядеть код с этими изменениями:

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
...