singlepost

Алгоритмы генерации текста << На главную или назад  

Друзья-товарищи, если у кого-нибудь есть какая-нибудь информация по этой теме, скидывайте ссылки сюда
Просто получил задачу разработать бот для аськи. Уже реализовал алгоритм цепей Маркова (но если у кого-нибудь есть еще какие-нибудь материалы по нему – все равно кидайте – посмотрю, как там) на C#

Мне нужно найти побольше алгоритмов, связанных с генерацией текста
Спасибо заранее!

45 ответов в теме “Алгоритмы генерации текста”

  1. 20
    Кристиан Баринов ответил:

    Михаил
    Может быть, это то, что мне нужно тоже. Если не сложно, подбрось ссылки

  2. 19
    Михаил Шаханов ответил:

    Нейронные сети?

  3. 18
    Кристиан Баринов ответил:

    А мне это сделать надо ))

  4. 17
    Кристиан Баринов ответил:

    Да, конечно на худой конец сделать такую базу ))

    Но мы ведь программисты. Вот у Маркова эта "база" формируется с нуля. И это уже интелект, он строит цепочки

    Надо сделать его умного – бота-то!

  5. 16
    Влад Темный ответил:

    << разработать бот для аськи. >>
    упс.. только прочитал :)
    миранда плагин болтун в комплекте база на несколько метров текста
    работает вроде по принципу ищем вопрос в базе там же ответ.

    Зато осмысленно и хоть гдето прменить можно в отличии от этих цепей… если соединить подходы можно по идее решить проблему бедного словарного запаса.

    и да хочу услышать про новые алгоритмы :)

  6. 15
    Кристиан Баринов ответил:

    > текущее – curr
    > предыдущее – prev (ну и его индекс)
    > если твое слово находится в словаре – получаешь его индекс, если же еготам еще нету – добавляешь в конец и индекс у тебя опять же есть и markov[indexOf(prev)][] = indexOf(curr)

    Разумеется, ты проверяешь не только cur на наличие в словаре, но и prev. И индекс prev тоже получаешь из словаря, если слово prev есть в нем

  7. 14
    Кристиан Баринов ответил:

    В принципе, идея понятна…
    Идея та же. У меня хэш

    Там суффиксы добавляются в конец списка ) То есть, грубо говоря, где у тебя markov[1] (преффикс)== array (2, 12) (список суффиксов) Керниган и Пайк сделали по-другому:

    class state
    {
    public string[] pref; // преффикс из двух слов
    public suffix suf; // "переходим" на суффиксы
    public state next; // следующий в списке префиксов
    public state()
    {
    pref = new string[Constants.npref];
    }
    }

    class suffix
    {
    public string word; // слово – суффикс
    public suffix next; // следующий в списке суффиксов
    }

    И имеется хэш со своей хэш-функцией для префиксов:
    private state[] statetab; (уже в другом классе)

    Это C#, как ты уже понял, авторы же предлагали на Си, С++ и Яве

  8. 13
    Кристиан Баринов ответил:

    Конечно, лучше не фильтровать. Частота хоть примерно сохранится…

  9. 12
    Алексей Сторожев ответил:

    может это и не самый оптимальный способ хранения, но зато очень удобный

    представим себе предложение
    "да помогут тебе ассоциативные массивы. съешь еще этих французских булок да выпей чаю."
    примерный состав твоего массива будет таким:
    markov["да"] == array ("помогут", "выпей"),
    markov["помогут"] == array ("тебе")
    ….

    согласен, этот способ хранения ужасно избыточен, но ты же можешь хранить словарь отдельно, а в этом массиве хранить только ссылки на элементы в массиве словаря. ну или их индексы. тогда, собственно, в жопу мои ассоциативные массивы =)))
    просто я сто лет назад писал этот алгоритм, тогда как-то даже не подумал об оптимизации

    тогда имеем
    markov[1] == array (2, 12),
    markov[2] == array (3)

    при анализе текста ты проходишь по каждому слову и в каждый момент времени у тебя такая ситуация: у тебя есть текущее слово и предыдущее
    текущее – curr
    предыдущее – prev (ну и его индекс)
    если твое слово находится в словаре – получаешь его индекс, если же его там еще нету – добавляешь в конец и индекс у тебя опять же есть
    и markov[indexOf(prev)][] = indexOf(curr)
    тут можно обратить внимание на такой момент – ты можешь проверять, добавлял ли ты слово curr в "словарь слова" =)) имеется в виду что "markov[1] == array (2, 12)" здесь ты можешь фильтровать одинаковые, а можешь и не фильтровать. мне кажется что лучше не фильтровать, так как у тебя создастся некая распределенность по частоте вхождения слов в текст, т.е. когда ты уже будешь генерировать случайным выбором – слова, наиболее часто встречающиеся будут иметь больший шанс выпада

    генерация происходит примерно так
    words = 0; // число сгенерированных слов
    text = "";
    markov = array (…);
    voc = array (…); // словарь
    curr = …; // выбираем случайный индекс из словаря voc
    while (words < 100)
    {
    text = text + curr + " ";
    curr = markov[curr][случайный индекс];
    }

    на выходе получим текст из 100 слов

  10. 11
    Алексей Сторожев ответил:

    //www.cyberguru.ru/programming/cpp/cpp-language...

    да помогут тебе ассоциативные массивы

  11. 10
    Кристиан Баринов ответил:

    Хэш-таблица

    В принципе, вариантов реализации может быть не один. На пхп видел массивы

    Я взял тот, где используется хэш. Так предложили авторы. В принципе, иных вариантов-то они и не предлагали

    Книжка: Керниган, Пайк – "Практика программирования"

  12. 9
    Алексей Сторожев ответил:

    какой еще к чертям хэш? о_О

  13. 8
    Кристиан Баринов ответил:

    Ага, хорошо
    В пхп, по-моему, массивы используют как внутр. стр-ру

  14. 7
    Кристиан Баринов ответил:

    У Маркова хэш. Причем приличный хэш, я бы сказал, – там ногу сломать можно )
    Я его с С на C# переводил – код ))

  15. 6
    Алексей Сторожев ответил:

    да я еще лет пять назад его юзал

    у меня где-то валялся мой генератор на php.. если найду то выложу

  16. 5
    Влад Темный ответил:

    подпишусь на комменты

  17. 4
    Кристиан Баринов ответил:

    Если есть ссылки – кидай
    Хотя у меня есть уже алгоритм, но может у тебя вариант Маркова покруче.

    Ребята, оказывается, Марков – это ужедревний алгоритм… (((

  18. 3
    Алексей Сторожев ответил:

    цепи Маркова

  19. 2
    Кристиан Баринов ответил:

    Ну я, честно говоря, не знаю, относятся ли боты к искуственному интелекту (но можно кидать и все, что есть и по искуственному!!!)
    В любом случае есть какой-то входной текст и программа на основе него выдает выходной

  20. 1
    Александр Васюченко ответил:

    искуственный интелект?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.