从生成自定义文本随机句子Python的NLTK?(Generating random sentenc

2019-06-26 08:00发布

我在与Python下NLTK,特别是.generate()方法的麻烦。

生成(个体,长度= 100)

打印随机文本,利用三元语言模型生成。

参数:

  * length (int) - The length of text to generate (default=100) 

下面是我在尝试的简化版本。

import nltk

words = 'The quick brown fox jumps over the lazy dog'
tokens = nltk.word_tokenize(words)
text = nltk.Text(tokens)
print text.generate(3)

这将始终产生

Building ngram index...
The quick brown
None

而不是建立一个随机短语出来的话。

这里是我的输出,当我做

print text.generate()

Building ngram index...
The quick brown fox jumps over the lazy dog fox jumps over the lazy
dog dog The quick brown fox jumps over the lazy dog dog brown fox
jumps over the lazy dog over the lazy dog The quick brown fox jumps
over the lazy dog fox jumps over the lazy dog lazy dog The quick brown
fox jumps over the lazy dog the lazy dog The quick brown fox jumps
over the lazy dog jumps over the lazy dog over the lazy dog brown fox
jumps over the lazy dog quick brown fox jumps over the lazy dog The
None

重新再出发文字相同,但随后改变它。 我已经使用从奥威尔的1984年同样的第一章,它始终与第3代币(其中之一是一个空间在这种情况下), 然后接着随机生成的文字也开始尝试。

我在做什么错在这里?

Answer 1:

要生成随机文本,U需要用马尔可夫链

代码做到这一点: 从这里开始

import random

class Markov(object):

  def __init__(self, open_file):
    self.cache = {}
    self.open_file = open_file
    self.words = self.file_to_words()
    self.word_size = len(self.words)
    self.database()


  def file_to_words(self):
    self.open_file.seek(0)
    data = self.open_file.read()
    words = data.split()
    return words


  def triples(self):
    """ Generates triples from the given data string. So if our string were
    "What a lovely day", we'd generate (What, a, lovely) and then
    (a, lovely, day).
    """

    if len(self.words) < 3:
      return

    for i in range(len(self.words) - 2):
      yield (self.words[i], self.words[i+1], self.words[i+2])

  def database(self):
    for w1, w2, w3 in self.triples():
      key = (w1, w2)
      if key in self.cache:
    self.cache[key].append(w3)
      else:
    self.cache[key] = [w3]

  def generate_markov_text(self, size=25):
    seed = random.randint(0, self.word_size-3)
    seed_word, next_word = self.words[seed], self.words[seed+1]
    w1, w2 = seed_word, next_word
    gen_words = []
    for i in xrange(size):
      gen_words.append(w1)
      w1, w2 = w2, random.choice(self.cache[(w1, w2)])
    gen_words.append(w2)
    return ' '.join(gen_words)

释: 生成与使用Python马尔可夫链伪随机文本



Answer 2:

你应该是“培训”的马尔可夫模型与多个序列,让你准确地品尝起始状态概率以及(称为马氏发言“PI”)。 如果你使用一个单一的序列,那么你将在相同的状态始终启动。

在奥威尔1984年的情况下,你会想先用句子切分(NLTK是它非常好),然后字标记化(产生令牌列表的列表,而不仅仅是一个单一的令牌列表),然后分别喂每个句子马尔可夫模型。 这将使其能够正常模型而不是被卡在一个单一的方式开始每个序列序列开始。



Answer 3:

你的样品语料库是最有可能是太小。 我不知道NLTK究竟是如何建立其三元模式,但它通常的做法是开始和句子的末尾以某种方式处理。 由于只有一个在你的阴茎开始句话的,这可能是为什么每个句子具有相同的开始的原因。



Answer 4:

也许你可以将令牌阵列随机产生一个句子之前排序。



Answer 5:

你确定使用word_tokenize是正确的做法?

此谷歌组页面有例如:

>>> import nltk
>>> text = nltk.Text(nltk.corpus.brown.words()) # Get text from brown
>>> text.generate() 

但我从来没有使用NLTK,所以我不能说这是否运作的,你想要的方式。



文章来源: Generating random sentences from custom text in Python's NLTK?