Pregunta

Quiero crear un bot que le haga a alguien algunas preguntas simples y se ramifique según la respuesta.Me doy cuenta de que analizar el significado de las respuestas humanas será un desafío, pero ¿cómo se configura el programa para abordar el "estado" de la conversación?

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

¿Fue útil?

Solución

Probablemente quieras investigar Cadenas de Markov como los conceptos básicos para la IA del bot.Escribí algo hace mucho tiempo (el código del cual no estoy orgulloso en absoluto y necesita algunas modificaciones para ejecutarse en Python > 1.5) que puede ser un punto de partida útil para usted: http://sourceforge.net/projects/benzo/

EDITAR:Aquí hay un ejemplo mínimo en Python de una cadena de Markov que acepta entradas de la entrada estándar y genera texto en función de las probabilidades de que las palabras se sucedan entre sí en la entrada.Está optimizado para registros de chat estilo IRC, pero ejecutar 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()

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

Otros consejos

La gente ya ha mencionado que el estado no es un componente importante de los chatbots típicos:

  • Una implementación pura de Markov puede expresar un tipo de estado muy vago si aumenta su léxico y su tabla en tiempo real (las expresiones anteriores del interlocutor humano pueden ser regurgitadas por casualidad más adelante en la conversación), pero el modelo de Markov no tiene ninguna característica inherente. mecanismo para seleccionar o producir tales respuestas.

  • un bot basado en análisis (p. ej.ELIZA) generalmente intenta responder a (parte del) contenido semántico de la entrada más reciente del usuario sin tener en cuenta los intercambios anteriores.

Dicho esto, seguro que poder agregue cierta cantidad de estado a un chatbot, independientemente del modelo de análisis de entrada y síntesis de declaraciones que esté utilizando.Cómo hacerlo depende en gran medida de lo que quieras lograr con tu estado, y eso no queda muy claro en tu pregunta.Sin embargo, un par de ideas generales:

  • Crea una pila de palabras clave.A medida que su humano ofrece información, analice las palabras clave de sus declaraciones/preguntas y arroje esas palabras clave en una pila de algún tipo.Cuando su chatbot no logra encontrar algo convincente a lo que responder en la entrada más reciente (o, tal vez, simplemente al azar, para mezclar las cosas), regrese a su pila, tome una palabra clave anterior y úsela para generar la siguiente. síntesis.Para obtener puntos de bonificación, haga que el bot reconozca explícitamente que está volviendo a un tema anterior, p."Espera, HUMANO, antes mencionaste a foo.[Oración sembrada por foo]".

  • Incorpore una lógica de diálogo similar a un juego de rol en el bot.Como análisis de la aportación humana, active indicadores para mensajes de conversación específicos o contenido del usuario y modifique condicionalmente de qué puede hablar el chatbot o cómo se comunica.Por ejemplo, un chatbot que se enoja (o regaña o se ríe) ante un lenguaje soez es bastante común;un chatbot que se calentará y de forma condicional permanecerá así hasta que se disculpe, sería una interesante variación con estado de esto.Cambie la salida a TODO EN MAYÚSCULAS, agregue retórica de confrontación o demandas o sollozos, etc.

¿Puedes aclarar un poco qué quieres que el Estado te ayude a lograr?

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 se activan.Si ciertas neuronas se activan, se obtiene una buena idea sobre el tema y la semántica de la pregunta y, por lo tanto, se puede dar una buena respuesta.

La memoria se logra manteniendo los temas hablados en una sesión, agregándolos a la siguiente 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 conocimientos, pero compílelos en la memoria al inicio, con una neurona por regla.Puedes diseñar sinapsis utilizando algo como oyentes o funciones de eventos.

Creo que puedes mirar el código para chiflado, y IIRC también utiliza cadenas de Markov.

Consulte también el citas excéntricas, aparecieron en Coding Horror no hace mucho y algunos son divertidísimos.

Creo que para iniciar este proyecto sería bueno tener una base de datos con preguntas (organizadas en forma de árbol.En cada nodo una o más preguntas).Estas preguntas deben responderse con "sí" o "no".

Si el bot comienza a hacer preguntas, puede comenzar con cualquier pregunta de su base de datos de preguntas marcadas como pregunta inicial.La respuesta es el camino hacia el siguiente nodo del árbol.

Editar:Aquí hay uno de muestra escrito en Ruby con el que puedes comenzar: rubíBOT

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

Primero se entrena a sí mismo en un texto y luego utiliza los datos de ese entrenamiento para generar respuestas a las aportaciones 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 a esa palabra secuencialmente en cualquier parte del texto de capacitación.Si una palabra aparece más de una vez en esta lista, eso se refleja y es más probable que sea elegida por el bot, no hay necesidad de cosas probabilísticas, solo hágalo con una lista.

El robot elige una palabra aleatoria de su entrada y genera una respuesta eligiendo otra palabra aleatoria que se considera sucesora de la palabra retenida.Luego repite el proceso encontrando un sucesor de esa palabra y continúa iterativamente hasta que cree que ya ha dicho lo suficiente.Llega a esa conclusión deteniéndose en una palabra anterior a un signo de puntuación en el texto de capacitación.Luego vuelve al modo de entrada nuevamente para permitirle responder, y así sucesivamente.

¡No es muy realista, pero por la presente desafío a cualquiera a hacerlo mejor en 71 líneas de código!Este es un gran desafío para cualquier Pythonista en ciernes, y simplemente desearía poder abrir el desafío a una audiencia más amplia que la pequeña cantidad de visitantes que recibo en este blog.Para codificar un bot que siempre se garantiza que sea gramatical seguramente debe estar más cerca de varios cientos de líneas, lo simplifiqué enormemente al tratar de pensar en la regla más simple para darle a la computadora una simple oportunidad de tener algo que decir.

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

Utilicé Guerra y Paz para mi "corpus", que tomó un par de horas para el entrenamiento, usa 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

Suele tener una sensación extraña cuando dice algo que parece tener parcialmente sentido.

Sugeriría mirar las probabilidades bayesianas.Luego simplemente monitoree la sala de chat durante un período de tiempo para crear su árbol de probabilidades.

No estoy seguro de que esto sea lo que estás buscando, pero hay un programa antiguo llamado ELIZA que podría mantener una conversación tomando lo que dijiste y escupiéndolo 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 mantuvieron largas y elaboradas conversaciones con ella.

Si sólo estás incursionando, creo Lengua macarrónica le permite programar el comportamiento del estilo de chat.Parte del marco probablemente aborda el estado de quién envió el mensaje y cuándo, y usted querrá mantener un registro del estado interno de su bot para cada uno de los últimos N mensajes.Las decisiones estatales futuras podrían codificarse basándose en la inspección de estados anteriores y el contenido de los mensajes más recientes.O podría hacer algo como las cadenas de Markov comentadas y usarlas tanto para analizar como para generar.

Si no necesita un robot de aprendizaje, utilice AIML (http://www.aiml.net/) probablemente producirá el resultado que desea, al menos con respecto a la entrada del bot que analiza y responde en función de ella.

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

Puede usar "ChatterBot" y alojarlo localmente usando - 'flask-chatterbot-master'

Enlaces:

  1. [Instalación de ChatterBot]https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Hospeda localmente usando - flask-chatterbot-master]: https://github.com/chamkank/flask-chatterbot

Salud,

Ratnakar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top