Генерация случайных предложений из пользовательского текста в NLTK Python?

Мне удалось решить эту проблему в Visual Studio 2010, VB.net (ASP.NET) 4.0.

Во время работы мастера модели сущностей вы сможете увидеть строку подключения сущности. Оттуда вы можете скопировать и вставить в строку подключения.

Единственное, чего мне не хватало, это «App_Code». в строке соединений.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
7
задан James McMahon 19 July 2009 в 20:20
поделиться

5 ответов

Чтобы сгенерировать случайный текст, 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

12
ответ дан 6 December 2019 в 10:52
поделиться

Скорее всего, ваш образец слишком мал. Я не знаю, как именно nltk строит свою модель триграммы, но это обычная практика, когда начало и конец предложений каким-то образом обрабатываются. Поскольку в вашем корпусе есть только одно начало предложения, это может быть причиной того, что каждое предложение имеет одинаковое начало.

1
ответ дан 6 December 2019 в 10:52
поделиться

Вы уверены, что использование word_tokenize является правильным подходом?

На этой странице групп Google есть пример:

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

Но я никогда не использовал nltk, поэтому не могу сказать, работает ли это так, как вы хотите.

-1
ответ дан 6 December 2019 в 10:52
поделиться

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

-1
ответ дан 6 December 2019 в 10:52
поделиться

Вы должны «обучать» марковскую модель с помощью нескольких последовательностей, чтобы вы также точно выбирали вероятности начального состояния (называемые «пи» на языке Маркова). Если вы используете одну последовательность, вы всегда будете начинать в одном и том же состоянии.

В случае с 1984 Оруэлла вы захотите сначала использовать токенизацию предложений (NLTK очень хорош в этом), а затем токенизацию слов (с получением списка списки токенов, а не просто один список токенов), а затем передать каждое предложение отдельно в модель Маркова. Это позволит ему правильно моделировать запуски последовательности, вместо того, чтобы останавливаться на одном способе запуска каждой последовательности.

7
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: