artificial intelligence - pricing - ¿Cómo funciona Markov Chain Chatbots?
chatbot white label (3)
Estaba pensando en crear un chatbot usando algo así como cadenas de markov, pero no estoy del todo seguro de cómo hacerlo funcionar. Por lo que entiendo, creas una tabla a partir de datos con una palabra dada y luego palabras que siguen. ¿Es posible adjuntar algún tipo de probabilidad o contador mientras entrenas al robot? ¿Es eso incluso una buena idea?
La segunda parte del problema es con palabras clave. Suponiendo que ya puedo identificar las palabras claves de la entrada del usuario, ¿cómo puedo generar una oración que use esa palabra clave? No siempre quiero comenzar la oración con la palabra clave, entonces, ¿cómo sembrar la cadena de markov?
Creé un chatbot de cadena de Markov para IRC en Python hace unos años y puedo arrojar algo de luz sobre cómo lo hice. El texto generado no necesariamente tiene sentido, pero puede ser realmente divertido de leer. Vamos a descomponerlo en pasos. Asumiendo que tienes una entrada fija, un archivo de texto, (puedes usar la entrada del texto del chat o de la letra o simplemente usar tu imaginación)
Pasa por el texto y crea un diccionario, es decir, un contenedor de valores clave. Y pon todos los pares de palabras como claves y la palabra siguiente como un valor. Por ejemplo: si tiene un texto "abcabk", comienza con "ab" como clave y "c" como valor, luego "bc" y "a" como valor ... el valor debe ser una lista o cualquier colección que contenga 0 .. muchos ''elementos'' ya que puede tener más de un valor para un par de palabras dado. En el ejemplo anterior, tendrá "ab" dos veces seguido del puño por "c" y al final por "k". Así que al final tendrás un diccionario / hash con el siguiente aspecto: {''a b'': [''c'',''k''], ''b c'': [''a''], ''c a'': [''b'']}
Ahora tiene la estructura necesaria para construir su texto funky. ¡Puedes elegir comenzar con una llave al azar o un lugar fijo! Entonces, dada la estructura que tenemos, podemos comenzar guardando "ab" y luego aleatoriamente tomando una palabra siguiente del valor, c o k, por lo que la primera guarda en el ciclo, "abk" (si "k" fue el valor aleatorio elegido) luego continúas moviéndote un paso hacia la derecha que en nuestro caso es "bk" y guardas un valor aleatorio para ese par si tienes, en nuestro caso no, para que salgas del ciclo (o puedes decidir otras cosas como empezar de nuevo). Cuando se realiza el ciclo, imprime la cadena de texto guardada.
Cuanto mayor sea la entrada, más valores tendrá para las claves (par de palabras) y luego tendrá un "bot más inteligente" para que pueda "entrenar" a su bot agregando más texto (¿tal vez entrada de chat?). Si tiene un libro como entrada, puede construir algunas oraciones aleatorias agradables. Tenga en cuenta que no tiene que tomar solo una palabra que sigue a un par como valor, puede tomar 2 o 10. La diferencia es que su texto aparecerá más preciso si utiliza bloques de construcción "más largos". Comience con un par como una clave y la siguiente palabra como valor.
Entonces ves que básicamente puedes tener dos pasos, primero crea una estructura donde elijas al azar una clave para comenzar, luego toma esa tecla e imprime un valor aleatorio de esa tecla y continúa hasta que no tengas un valor o alguna otra condición. Si lo desea, puede "inicializar" un par de palabras de una entrada de chat de su estructura clave-valor para tener un inicio. Depende de tu imaginación cómo comenzar tu cadena.
Ejemplo con palabras reales:
"hi my name is Al and i live in a box that i like very much and i can live in there as long as i want"
"hi my" -> ["name"]
"my name" -> ["is"]
"name is" -> ["Al"]
"is Al" -> ["and"]
........
"and i" -> ["live", "can"]
........
"i can" -> ["live"]
......
Ahora construye un ciclo:
Elija una clave aleatoria, diga "hola mi" y elija aleatoriamente un valor, solo uno aquí, por lo que su "nombre" (AHORRANDO "hola mi nombre") .
Ahora avance un paso hacia la derecha tomando "my name" como la siguiente clave y elija un valor aleatorio ... "is" (SAVING "hola mi nombre es") .
Ahora muévete y toma "nombre es" ... "Al" (AHORRANDO "hola mi nombre es AL") .
Ahora tome "is Al" ... "y" (SAVING) hola mi nombre es Al y ") .
...
Cuando vengas a "yi" elegirás aleatoriamente un valor, digamos "puede", luego se hará la palabra "sí puedo", etc ... cuando llegues a tu condición de detención o que no tengas valores imprimirá la construcción cadena en nuestro caso:
"hola mi nombre es Al y puedo vivir allí todo el tiempo que quiera"
Si tiene más valores, puede saltar a cualquier tecla. Cuantos más valores, más combinaciones tendrá y más aleatorio y divertido será el texto.
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.
Podrías hacer esto: Hacer un pedido 1 generador de cadena de markov, usando palabras y no letras. Cada vez que alguien publica algo, lo que publica se agrega a la base de datos del robot. También bot ahorraría cuando fuera al chat y cuando un chico publicara la primera publicación (en múltiplos de 10 segundos), entonces salvaría la cantidad de tiempo que este mismo tipo esperaba publicar nuevamente (en múltiplos de 10 segundos) ... Esta segunda parte se usaría para ver cuándo el chico publicará, así que se unirá al chat y después de un tiempo basado en una tabla con "después de cuántos 10 segundos publicó el tipo después de unirse al chat", entonces continuaría publicar con la misma tabla pensando "cómo fue la cantidad de tiempo utilizada para escribir la publicación que se publicó después de una publicación que usó X segundos para pensar y escribir"