4

我正在开发一个随机文本生成器——不使用马尔可夫链——目前它没有太多问题。首先,这是我的代码流程:

  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

我担心的是,循环主要到达了一遍又一遍地打印同一个句子的地步。因为它是最长的句子有最长的单词。为了反击一遍又一遍地重复同一句话,我想到了以下几点:

*如果当前句子中最长的单词与上一个句子中的相同,只需从当前句子中删除这个最长的单词并寻找下一个最长的单词。

我为此尝试了一些实现,但未能应用上述解决方案,因为它涉及列表和列表列表-由于古腾堡模块中的单词和句子-。关于如何找到第二长的单词有什么建议吗?我似乎无法通过解析简单的字符串输入来做到这一点,因为 NLTK 的 Gutenberg 模块的 .sents() 和 .words() 函数分别产生了 list 和 list 的列表。提前致谢。

4

2 回答 2

1

一些建议的改进:

  1. 循环将while永远运行,您可能应该将其删除。
  2. 使用max和生成器表达式以节省内存的方式生成最长的单词。
  3. longestWord您应该生成一个包含列表理解的长度大于 40 个字符的句子列表。这也应该从 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
于 2010-10-11T06:18:56.303 回答
1

如果您只需要生成随机文本(我猜,要求它应该包含有意义的句子),您可以更简单地做到这一点:只需生成随机数并将它们用作从文本数据库中检索句子的索引(无论是 Project Gutenberg 还是任何)。

于 2010-10-20T09:41:44.873 回答