Подтвердить что ты не робот

Как я могу запрограммировать простой бот AI?

Я хочу создать бота, который задает кому-то несколько простых вопросов и ответвлений, основанных на ответе. Я понимаю, что разбор смысла с человеческих ответов будет сложным, но как вы настраиваете программу для "состояния" разговора?

Это будет индивидуальный разговор между человеком и ботом.

4b9b3361

Ответ 1

Вы, вероятно, захотите изучить Markov Chains как основы для бота AI. Я написал что-то давным-давно (код, которому я вообще не горжусь, и мне нужны некоторые моды для запуска на Python > 1.5), который может быть полезным для вас: http://sourceforge.net/projects/benzo/

EDIT: Здесь приведен минимальный пример в 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 и иметь основу типа бота, о котором вы говорите.

Ответ 2

Люди уже упоминали, что состоятельность не является большой составляющей типичных чатов:

  • чистые марковские реализации могут выражать очень разрозненное состояние, если оно вырабатывает свой лексикон и таблицу в режиме реального времени; более ранние высказывания собеседника человека могут быть опрокинуты случайно позже в разговоре, но модель Маркова не имеет какого-либо неотъемлемого механизма для выбора или создания таких ответов.

  • бот на основе синтаксического анализа (например, ELIZA) обычно пытается реагировать на (некоторые) семантические данные самого последнего ввода от пользователя без существенного учета предшествующих обменов.

Тем не менее, вы, несомненно, можете добавить некоторое количество состояний в чатбот, независимо от используемой модели ввода-анализа и формулировки-синтезатора. Как это многое зависит от того, чего вы хотите достичь с вашей состоятельностью, и это не совсем понятно из вашего вопроса. Однако пара общих идей:

  • Создайте стек ключевых слов. Поскольку ваш человек предлагает входные данные, анализируйте ключевые слова из своих заявлений/вопросов и бросайте эти ключевые слова в какой-то стек. Когда ваш чатбот не сможет придумать что-то убедительное, чтобы реагировать на самые последние входные данные или, возможно, просто наугад, чтобы смешать вещи, вернитесь в свой стек, возьмите предыдущее ключевое слово и используйте это, чтобы засеять следующий синтез. Для бонусных очков бот явно признает, что он возвращается к предыдущему вопросу, например. "Подождите, ЧЕЛОВЕК, раньше вы упомянули foo. [Предложение, посеянное foo]".

  • Построить RPG-подобную логику диалога в боте. Как ваш парсинг человеческого ввода, переключение флагов для конкретных разговорных подсказок или контента от пользователя и условное изменение того, о чем может поговорить chatbot, или как он обменивается данными. Например, чатбот, ощетинившийся (или ругающий, или смеющийся) на нецензурном языке, довольно распространен; чатбот, который будет поднят, и условно останется таковым до извинения до, будет интересным вариантом с сохранением состояния. Переключите вывод на ВСЕ CAPS, вставьте конфронтационную риторику или требования или всхлипывание и т.д.

Можете ли вы немного разъяснить, что вы хотите, чтобы государство помогло вам выполнить?

Ответ 3

Представьте себе нейронную сеть с возможностями синтаксического анализа в каждом node или нейроне. В зависимости от правил и результатов анализа, нейроны стреляют. Если некоторые нейроны стреляют, вы получите хорошее представление о теме и семантике вопроса и, следовательно, можете дать хороший ответ.

Память выполняется путем сохранения тем, о которых говорилось в сеансе, добавляя к стрельбе для следующего вопроса и, следовательно, направляя процесс выбора возможных ответов в конце.

Сохраняйте свои правила и шаблоны в базе знаний, но скомпилируйте их в память во время запуска с помощью нейрона за правило. Вы можете создавать синапсы, используя что-то вроде прослушивателей или функций событий.

Ответ 4

Я думаю, вы можете посмотреть код Kooky, а IIRC также использует Марковские цепи.

Также посмотрите kooky quotes, они были показаны на Coding Horror совсем недавно, а некоторые - веселые.

Ответ 5

Я думаю, что для начала этого проекта было бы хорошо иметь базу данных с вопросами (организованными как дерево. В каждом node одном или нескольких вопросах). На эти вопросы можно ответить "да" или "нет".

Если бот начинает задаваться вопросом, он может начать с любого вопроса из базы данных yuor вопросов, помеченных как начальный вопрос. Ответ - путь к следующему node в дереве.

Изменить: вот краткий, написанный в рубине, который вы можете начать с: rubyBOT

Ответ 6

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

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

Бот выбирает случайное слово из вашего ввода и генерирует ответ, выбирая другое случайное слово, которое считается преемником его слова. Затем он повторяет этот процесс, намереваясь найти преемника этого слова в свою очередь и продолжать итеративно, пока он не подумает, что он сказал достаточно. Он достигает этого вывода, останавливаясь на слове, который был до знака пунктуации в тексте обучения. Затем он снова возвращается в режим ввода, чтобы вы могли ответить, и т.д.

Это не очень реалистично, но я тем самым призываю всех сделать лучше в 71 строке кода! Это большой вызов для любых начинающих питонистов, и я просто хочу, чтобы я мог открыть задачу для более широкой аудитории, чем небольшое количество посетителей, которых я получаю в этом блоге. Чтобы закодировать бота, который всегда гарантированно является грамматическим, наверняка будет ближе к нескольким сотням строк, я очень упростился, просто попытавшись придумать простейшее правило, чтобы дать компьютеру простой удар, чтобы что-то сказать.

Его ответы скорее импрессионистичны, если не сказать больше! Также вы должны указать, что вы говорите, в одинарных кавычках.

Я использовал War and Peace для своего "корпуса", который занял пару часов для тренировочного пробега, используйте более короткий файл, если вы нетерпеливы...

вот тренер

#lukebot-trainer.py
import pickle
b=open('war&peace.txt')
text=[]
for line in b:
    for word in line.split():
        text.append (word)
b.close()
textset=list(set(text))
follow={}
for l in range(len(textset)):
    working=[]
    check=textset[l]
    for w in range(len(text)-1):
        if check==text[w] and text[w][-1] not in '(),.?!':
            working.append(str(text[w+1]))
    follow[check]=working
a=open('lexicon-luke','wb')
pickle.dump(follow,a,2)
a.close()

здесь бот

#lukebot.py
import pickle,random
a=open('lexicon-luke','rb')
successorlist=pickle.load(a)
a.close()
def nextword(a):
    if a in successorlist:
        return random.choice(successorlist[a])
    else:
        return 'the'
speech=''
while speech!='quit':
    speech=raw_input('>')
    s=random.choice(speech.split())
    response=''
    while True:
        neword=nextword(s)
        response+=' '+neword
        s=neword
        if neword[-1] in ',?!.':
            break
    print response

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

Ответ 7

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

Ответ 8

Я не уверен, что это то, что вы ищете, но есть старая программа под названием ELIZA, которая может содержать поговорив, взяв то, что вы сказали, и выплюнул его обратно после выполнения некоторых простых текстовых преобразований.

Если я правильно помню, многие люди были уверены, что они "разговаривают" с настоящим человеком и долго беседовали с ним.

Ответ 9

Если вы просто занимаетесь, я считаю, что Pidgin позволяет вам script поведение стиля чата. Часть фреймворка, вероятно, влияет на состояние отправителя сообщения, и вы хотите сохранить журнал своего внутреннего состояния бота для каждого из последних N сообщений. Будущие решения государства могут быть жестко запрограммированы на основе проверки предыдущих состояний и содержания последних нескольких сообщений. Или вы можете сделать что-то вроде обсуждаемых цепей Маркова и использовать его как для синтаксического анализа, так и для генерации.

Ответ 10

Если вам не нужен учебный бот, использование AIML (http://www.aiml.net/), скорее всего, приведет к желаемому результату, по крайней мере, с по отношению к вводу синтаксического анализа бота и ответа на него.

Вы будете повторно использовать или создавать "мозги" из XML (в формате AIML) и анализировать/запускать их в программе (парсере). Есть парсеры, сделанные на нескольких разных языках, на выбор, и, насколько я могу судить, в большинстве случаев код кажется открытым исходным кодом.