Друзья-товарищи, если у кого-нибудь есть какая-нибудь информация по этой теме, скидывайте ссылки сюда
Просто получил задачу разработать бот для аськи. Уже реализовал алгоритм цепей Маркова (но если у кого-нибудь есть еще какие-нибудь материалы по нему – все равно кидайте – посмотрю, как там) на C#
Мне нужно найти побольше алгоритмов, связанных с генерацией текста
Спасибо заранее!
24 июля 2009 в 14:00
Михаил
Может быть, это то, что мне нужно тоже. Если не сложно, подбрось ссылки
24 июля 2009 в 1:04
Нейронные сети?
21 июля 2009 в 16:02
А мне это сделать надо ))
21 июля 2009 в 16:02
Да, конечно на худой конец сделать такую базу ))
Но мы ведь программисты. Вот у Маркова эта "база" формируется с нуля. И это уже интелект, он строит цепочки
Надо сделать его умного – бота-то!
21 июля 2009 в 16:01
<< разработать бот для аськи. >>
упс.. только прочитал
миранда плагин болтун в комплекте база на несколько метров текста
работает вроде по принципу ищем вопрос в базе там же ответ.
Зато осмысленно и хоть гдето прменить можно в отличии от этих цепей… если соединить подходы можно по идее решить проблему бедного словарного запаса.
и да хочу услышать про новые алгоритмы
21 июля 2009 в 15:01
> текущее – curr
> предыдущее – prev (ну и его индекс)
> если твое слово находится в словаре – получаешь его индекс, если же еготам еще нету – добавляешь в конец и индекс у тебя опять же есть и markov[indexOf(prev)][] = indexOf(curr)
Разумеется, ты проверяешь не только cur на наличие в словаре, но и prev. И индекс prev тоже получаешь из словаря, если слово prev есть в нем
21 июля 2009 в 14:00
В принципе, идея понятна…
Идея та же. У меня хэш
Там суффиксы добавляются в конец списка ) То есть, грубо говоря, где у тебя 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#, как ты уже понял, авторы же предлагали на Си, С++ и Яве
21 июля 2009 в 14:00
Конечно, лучше не фильтровать. Частота хоть примерно сохранится…
21 июля 2009 в 8:01
может это и не самый оптимальный способ хранения, но зато очень удобный
представим себе предложение
"да помогут тебе ассоциативные массивы. съешь еще этих французских булок да выпей чаю."
примерный состав твоего массива будет таким:
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 слов
21 июля 2009 в 7:05
//www.cyberguru.ru/programming/cpp/cpp-language...
да помогут тебе ассоциативные массивы
20 июля 2009 в 23:02
Хэш-таблица
В принципе, вариантов реализации может быть не один. На пхп видел массивы
Я взял тот, где используется хэш. Так предложили авторы. В принципе, иных вариантов-то они и не предлагали
Книжка: Керниган, Пайк – "Практика программирования"
20 июля 2009 в 23:00
какой еще к чертям хэш? о_О
20 июля 2009 в 22:04
Ага, хорошо
В пхп, по-моему, массивы используют как внутр. стр-ру
20 июля 2009 в 22:04
У Маркова хэш. Причем приличный хэш, я бы сказал, – там ногу сломать можно )
Я его с С на C# переводил – код ))
20 июля 2009 в 20:02
да я еще лет пять назад его юзал
у меня где-то валялся мой генератор на php.. если найду то выложу
20 июля 2009 в 18:03
подпишусь на комменты
20 июля 2009 в 15:05
Если есть ссылки – кидай
Хотя у меня есть уже алгоритм, но может у тебя вариант Маркова покруче.
Ребята, оказывается, Марков – это ужедревний алгоритм… (((
20 июля 2009 в 0:05
цепи Маркова
19 июля 2009 в 21:03
Ну я, честно говоря, не знаю, относятся ли боты к искуственному интелекту (но можно кидать и все, что есть и по искуственному!!!)
В любом случае есть какой-то входной текст и программа на основе него выдает выходной
19 июля 2009 в 20:03
искуственный интелект?