Pregunta ¿Cómo puedo programar un chat simple bot AI?


Quiero construir un bot que le pregunte a alguien algunas preguntas simples y ramas basadas en la respuesta. Me doy cuenta de que analizar el significado de las respuestas humanas será un desafío, pero ¿cómo configuras el programa para lidiar con el "estado" de la conversación?

Será una conversación uno-a-uno entre un humano y el bot.


32
2017-09-10 19:00


origen


Respuestas:


Es probable que desee examinar Cadenas de Markov como lo básico para el bot AI. Escribí algo hace mucho tiempo (el código del que no estoy orgulloso en absoluto, y necesita algunos mods para ejecutar en Python> 1.5) que puede ser un buen punto de partida para usted: http://sourceforge.net/projects/benzo/

EDITAR: Aquí hay un ejemplo mínimo en Python de una Cadena de Markov que acepta la entrada de stdin y emite texto basado en las probabilidades de palabras que se suceden en la entrada. Está optimizado para registros de chat de estilo IRC, pero si se ejecuta cualquier texto de tamaño decente debería demostrar los conceptos:

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()

Es bastante fácil desde aquí conectar la persistencia y una biblioteca de IRC y tener la base del tipo de bot del que estás hablando.


22
2017-09-10 19:04



La gente ya ha mencionado que la condición de estado no es un gran componente de los chatbots típicos:

  • una implementación pura de Markov puede expresar un tipo de estado muy flexible si crece su léxico y la tabla en tiempo real -las declaraciones anteriores del interlocutor humano pueden ser regurgitadas por casualidad más adelante en la conversación-, pero el modelo de Markov no tiene ninguna consecuencia inherente mecanismo para seleccionar o producir tales respuestas.

  • un bot basado en análisis sintáctico (por ejemplo, ELIZA) generalmente intenta responder a (algunos de) el contenido semántico de la información más reciente del usuario sin tener en cuenta significativamente los intercambios anteriores.

Dicho eso, ciertamente poder agregue cierta cantidad de estado a un chatbot, independientemente del modelo de entrada-análisis y síntesis de afirmaciones que esté utilizando. Cómo hacer eso depende mucho de lo que quiere lograr con su estado, y eso no está claro en su pregunta. Un par de ideas generales, sin embargo:

  • Crea una pila de palabras clave. A medida que su ser humano ofrece información, analice las palabras clave de sus declaraciones / preguntas y las arroje a una pila de algún tipo. Cuando su chatbot no logra encontrar algo convincente para responder en la información más reciente, o quizás, al azar, para mezclar las cosas, vuelva a su pila, tome una palabra clave anterior y utilícela para sembrar su próximo síntesis. Para obtener puntos de bonificación, haz que el bot reconozca explícitamente que se está volviendo a un tema anterior, p. "Espera, HUMANO, antes mencionaste foo. [Sentencia sembrada por foo]".

  • Cree una lógica de diálogo tipo RPG en el bot. A medida que analice las entradas de datos, alternar indicadores para mensajes de conversación específicos o contenido del usuario y alterar de forma condicional lo que el chatbot puede hablar, o cómo se comunica. Por ejemplo, un chatbot erizado (o regaño o risa) en lenguaje grosero es bastante común; un chatbot que lo levantará y condicionalmente permanecer así hasta que se disculpó con, sería una variación interesante con estado en esto. Cambia la salida a TODOS LOS MAYÚSCULAS, lanza retórica de confrontación o demandas o sollozos, etc.

¿Puedes aclarar un poco qué es lo que quieres que el estado te ayude a lograr?


14
2017-09-18 17:53



Imagine una red neuronal con capacidades de análisis en cada nodo o neurona. Dependiendo de las reglas y los resultados del análisis, las neuronas disparan. Si se activan ciertas neuronas, obtendrá una buena idea sobre el tema y la semántica de la pregunta y, por lo tanto, puede dar una buena respuesta.

La memoria se realiza manteniendo los temas de los que se habla en una sesión, añadiendo a la activación de la próxima pregunta y, por lo tanto, guiando el proceso de selección de posibles respuestas al final.

Mantenga sus reglas y patrones en una base de conocimiento, pero compílelos en la memoria al inicio, con una neurona por regla. Puede diseñar sinapsis usando algo así como oyentes o funciones de eventos.


5
2017-10-20 09:20



Creo que puedes mirar el código de Kooky, y IIRC también usa Markov Chains.

También mira el citas chistosas, fueron presentados en Coding Horror no hace mucho y algunos son divertidísimos.


3
2017-09-10 19:09



Creo que para comenzar este proyecto, sería bueno tener una base de datos con preguntas (organizada como un árbol. En cada nodo, una o más preguntas). Estas preguntas se pueden responder con "sí" o "no".

Si el robot comienza a cuestionarse, puede comenzar con cualquier pregunta de su base de datos de preguntas marcadas como una pregunta de inicio. La respuesta es el camino al siguiente nodo en el árbol.

Editar: Aquí hay un texto escrito en ruby ​​con el que puedes comenzar: rubyBOT


2
2017-09-10 19:11



programa de chatbot ingenuo Sin análisis, sin inteligencia, solo un archivo de entrenamiento y salida.

Primero se entrena en un texto y luego utiliza los datos de ese entrenamiento para generar respuestas a la entrada del interlocutor. El proceso de capacitación crea un diccionario donde cada clave es una palabra y el valor es una lista de todas las palabras que siguen esa palabra secuencialmente en cualquier parte del texto de capacitación. Si una palabra aparece más de una vez en esta lista, entonces eso refleja y es más probable que sea elegido por el bot, no hay necesidad de cosas probabilísticas simplemente hazlo con una lista.

El bot elige una palabra aleatoria de su entrada y genera una respuesta al elegir otra palabra aleatoria que se haya visto como sucesora de su palabra retenida. Luego repite el proceso encontrando un sucesor de esa palabra y continuando iterativamente hasta que crea que ya se dijo lo suficiente. Llega a esa conclusión deteniéndose en una palabra que era anterior a un signo de puntuación en el texto de entrenamiento. Luego vuelve al modo de entrada nuevamente para que pueda responder, y así sucesivamente.

¡No es muy realista, pero por la presente desafío a cualquiera a mejorar en 71 líneas de código! Este es un gran desafío para cualquier incipiente Pythonists, y solo desearía poder abrir el desafío a un público más amplio que la pequeña cantidad de visitantes que recibo en este blog. Para codificar un bot que siempre está garantizado que es gramatical seguramente debe estar más cerca de varios cientos de líneas, simplifiqué enormemente al tratar de pensar en la regla más simple para darle a la computadora una mera puñalada para tener algo que decir.

¡Sus respuestas son bastante impresionistas por decir lo menos! También debes poner lo que dices entre comillas simples.

Utilicé War and Peace para mi "corpus", que tardó un par de horas en el entrenamiento, utiliza un archivo más corto si estás impaciente ...

aquí está el entrenador

#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()

aquí está el bot

#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

Tiendes a tener una sensación extraña cuando dice algo que parece tener sentido en parte.


1
2018-05-28 01:31



Sugeriría mirar las probabilidades Bayesianas. Luego simplemente supervise la sala de chat por un período de tiempo para crear su árbol de probabilidades.


0
2017-09-10 19:03



No estoy seguro de que esto es lo que estás buscando, pero hay un viejo programa llamado ELIZA que podría mantener una conversación tomando lo que dijiste y escupiéndote después de realizar algunas transformaciones textuales simples.

Si mal no recuerdo, muchas personas estaban convencidas de que estaban "hablando" con una persona real y tenían largas conversaciones elaboradas con ella.


0
2017-09-10 23:03



Si solo estás incursionando, creo Lengua macarrónica le permite guiar el comportamiento del estilo de chat. Parte del marco probablemente corrige el estado de quién envió el mensaje cuando, y desea mantener un registro del estado interno de su bot para cada uno de los últimos N mensajes. Las futuras decisiones estatales podrían codificarse en función de la inspección de los estados anteriores y el contenido de los mensajes más recientes. O podría hacer algo como las cadenas de Markov discutidas y usarlo tanto para analizar como para generar.


0
2017-08-05 20:40



Si no necesita un bot de aprendizaje, use AIML (http://www.aiml.net/) lo más probable es que produzca el resultado que desea, al menos con respecto a la entrada de análisis de bot y la respuesta en función de ello.

Reutilizaría o crearía "cerebros" hechos de XML (en formato AIML) y los analizaría en un programa (analizador). Hay analizadores hechos en varios idiomas diferentes para elegir, y hasta donde puedo decir que el código parece ser de código abierto en la mayoría de los casos.


0
2017-10-09 00:45