Вы, вероятно, хотите изучить Цепи Маркова как основы для бота AI. Я записал что-то давным-давно (код, к которому я не горжусь вообще и нуждаюсь в некоторых модификациях для работы Python> 1.5), который может быть полезным стартовым местом для Вас: http://sourceforge.net/projects/benzo/
РЕДАКТИРОВАНИЕ: вот минимальный пример в Python Цепи Маркова, которая принимает вход от stdin и выходного текста на основе вероятностей слов, следующих друг за другом во входе. Это оптимизировано для журналов чата стиля IRC, но выполняющий любой текст достойного размера через него должен продемонстрировать понятия:
import random, sys
NONWORD = "\n"
STARTKEY = NONWORD, NONWORD
MAXGEN=1000
class MarkovChainer(object):
def __init__(self):
self.state = dict()
def input(self, input):
word1, word2 = STARTKEY
for word3 in input.split():
self.state.setdefault((word1, word2), list()).append(word3)
word1, word2 = word2, word3
self.state.setdefault((word1, word2), list()).append(NONWORD)
def output(self):
output = list()
word1, word2 = STARTKEY
for i in range(MAXGEN):
word3 = random.choice(self.state[(word1,word2)])
if word3 == NONWORD: break
output.append(word3)
word1, word2 = word2, word3
return " ".join(output)
if __name__ == "__main__":
c = MarkovChainer()
c.input(sys.stdin.read())
print c.output()
Это довольно легко отсюда до, включают персистентность и библиотеку IRC и имеют основание типа бота, о котором Вы говорите.
Вообразите нейронную сеть с парсингом возможностей в каждом узле или нейроне. В зависимости от правил и анализирующих результатов, огня нейронов. Если определенные нейроны стреляют, Вы получаете хорошую идею о теме и семантический из вопроса и поэтому можете дать хороший ответ.
Память сделана путем хранения тем, говорил о на сессии, добавляя к увольнению за следующий вопрос и поэтому руководству процесса выбора возможных ответов в конце.
Сохраняют Ваши правила и шаблоны в базе знаний, но компилируют их в память во время начала, с нейроном на правило. Можно спроектировать синапсы с помощью чего-то как функции события или слушатели.
Люди уже упомянули, что с сохранением информации не большой компонент типичных чат-ботов:
чистый Марков реализации могут выразить очень свободный вид состояния, если это выращивает свой словарь и таблицу в реальном time— более раннее произнесение собеседником - человеком может быть извергнуто случайно позже в conversation— но модель Маркова не имеет никакого свойственного механизма для выбора или создания таких ответов.
основанный на парсинге бот (например, ELIZA) обычно пытается ответить на (часть из) семантическое содержание нового входа от пользователя без значительного отношения к предшествующим обменам.
Тем не менее Вы, конечно можете добавлять некоторую сумму состояния к чат-боту, независимо от модели парсинга входа и синтеза оператора, которую Вы используете. Как сделать, который во многом зависит от того, что Вы хотите выполнить со своим с сохранением информации, и это не действительно ясно из Вашего вопроса. Пара общих представлений, однако:
Создают стопку ключевого слова. Как Ваш человеческий вход предложений, проанализируйте ключевые слова от их операторов/вопросов и броска те ключевые слова на какой-то стек. Когда Вашему чат-боту не удается придумать что-то заставляющее для ответа на в новом input— или, возможно, просто наугад, для смешивания вещей up— вернитесь к своему стеку, захватите предыдущее ключевое слово и использование что отобрать Ваш следующий синтез. Для бонусных очков имейте бота, явно подтверждают, что он возвращается к предыдущему предмету, например, "Ожидают, ЧЕЛОВЕК, ранее Вы упомянули нечто. [Предложение, отобранное нечто]".
Встраивают подобную RPG логику диалога в бота. Как Ваш вход человека парсинга, переключите флаги для определенных диалоговых подсказок или содержания от пользователя и условно измените то, что чат-бот может говорить о, или как это связывается. Например, ощетинивание чат-бота (или выговор или смех) в грязном языке довольно распространено; чат-бот, который станет возмущенным, и условно , остается таким, пока не принес извинения , будет интересная вариация с сохранением информации на это. Вывод переключателя ко ВСЕМ ЗАГЛАВНЫМ БУКВАМ, добавьте конфронтационную риторику или требования или рыдание, и т.д.
можно ли разъяснить немного, что Вы хотите, чтобы состояние помогло Вам выполнить?
Я думаю для запуска этого проекта, было бы хорошо иметь базу данных с вопросами (организованный как дерево. В каждом узле один или несколько вопросов). На эти вопросы нужно ответить с "да" или "нет".
, Если бот начинает подвергать сомнению, он может запуститься с любого вопроса от yuor базы данных вопросов, отмеченных как начинать-вопрос. Ответ является путем к следующему узлу в дереве.
Редактирование: Вот является somple одним записанным в рубине, с которого можно запустить: rubyBOT
Я думаю, что можно посмотреть на код для Идиотский , и IIRC, он также использует Цепи Маркова.
Также проверяют идиотские кавычки , они были показаны на Кодировании Ужаса недавно, и некоторые веселы.
Я не уверен, что это - то, что Вы ищете, но существует старая программа, названная ELIZA, который мог содержать разговор путем взятия того, что Вы сказали и плевание им назад в Вас после выполнения некоторых простых текстовых преобразований.
, Если я помню правильно, многие люди были убеждены, что "говорили" с живым человеком и имели долго тщательно продуманные переговоры с ним.
Я предложил бы смотреть на байесовские вероятности. Затем просто контролируйте чат-комнату сроком на время для создания дерева вероятности.
Если вы просто балуетесь, я считаю, что Pidgin позволяет вам настраивать поведение в стиле чата. Часть структуры, вероятно, фиксирует состояние того, кто и когда отправил сообщение, и вы хотите вести журнал внутреннего состояния вашего бота для каждого из последних N сообщений. Решения о будущих состояниях можно жестко запрограммировать на основе проверки предыдущих состояний и содержимого нескольких последних сообщений. Или вы можете сделать что-то вроде обсуждаемых цепей Маркова и использовать это как для синтаксического анализа, так и для генерации.