programa de chatbot naive. Sin análisis, sin inteligencia, solo un archivo de entrenamiento y salida.
Primero se entrena en un texto y luego usa los datos de esa capacitación 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 eligiendo otra palabra aleatoria que se ha 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 el presente desafío a cualquiera a que lo haga mejor 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 más bien impresionistas por decir lo menos! También debes poner lo que dices entre comillas simples.
Solía Guerra y Paz para mi “corpus”, que tuvo un par de horas para el recorrido de entrenamiento, utilice un archivo más corto si está impaciente ...
aquí es 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í es 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 parcialmente tener sentido.
No estoy del todo convencido de que los bots de chat existentes tengan algo así como 'estado'. Sus respuestas parecen depender solo de la última pregunta que hizo. Es solo una coincidencia que los humanos haremos una serie de preguntas relacionadas. –
http://search.cpan.org/search?query=bot&mode=all –
Hay bots con estado, trabajé en uno yo mismo. Era un bot de análisis contra una base de conocimiento que usa una red neuronal. –