Comment puis-je programmer un simple chat bot AI?
je veux construire un bot qui pose à quelqu'un quelques questions simples et branches basées sur la réponse. Je me rends compte que l'analyse du sens des réponses humaines sera difficile, mais comment configurer le programme pour gérer l ' "état" de la conversation?
ce sera une conversation en tête-à-tête entre un humain et le robot.
11 réponses
Vous voudrez probablement regarder dans Chaînes Markov comme base pour le bot AI. J'ai écrit quelque chose il y a longtemps (le code dont je ne suis pas fier du tout, et qui nécessite quelques mods pour fonctionner en Python > 1.5) qui peut être un point de départ utile pour vous: http://sourceforge.net/projects/benzo/
EDIT: voici un exemple minimal en Python d'une chaîne Markov qui accepte les entrées de stdin et les sorties de texte basées sur les probabilités de des mots qui se succèdent dans l'entrée. Il est optimisé pour les logs de chat de style IRC, mais l'exécution de n'importe quel texte de taille convenable à travers lui devrait démontrer les concepts:
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()
il est assez facile à partir d'ici de brancher persistence et une bibliothèque IRC et d'avoir la base du type de bot dont vous parlez.
les gens ont déjà mentionné que l'état d'esprit n'est pas une grande composante des chatbots typiques:
une implémentation Markov pure peut exprimer une sorte d'état très lâche si elle développe son lexique et sa table en temps réel-les déclarations antérieures de l'interlocuteur humain peuvent être régurgitées par hasard plus tard dans la conversation-mais le modèle Markov n'a pas de mécanisme inhérent pour sélectionner ou produire de telles réponses.
un parsing-basé bot (par exemple ELIZA) tente généralement de répondre à (une partie du) contenu sémantique de l'entrée la plus récente de l'utilisateur sans considération significative pour les échanges préalables.
cela dit, vous avez certainement ajouter une certaine quantité d'État à un chatbot, quel que soit le modèle d'analyse des entrées et de synthèse des énoncés que vous utilisez. Comment faire cela dépend beaucoup de ce que vous voulez accomplir avec votre statessness, et ce n'est pas vraiment clair de votre question. Quelques idées générales, cependant:
créer une pile de mots-clés. Comme votre humain offre entrée, analysent des mots-clés de leurs énoncés/questions et jeter ces mots-clés sur une pile d'une certaine sorte. Lorsque votre chatbot ne parvient pas à trouver quelque chose de convaincant à répondre dans l'entrée la plus récente-ou, peut-être, juste au hasard, pour mélanger les choses-retournez à votre pile, saisissez un mot-clé précédent, et utilisez cela pour lancer votre prochaine synthèse. Pour les points bonus, avoir le bot reconnaît explicitement qu'il remonte à un sujet précédent, par exemple "attendez, humain, plus tôt vous avez mentionné foo. [Phrase ensemencées par foo]".
intégrer la logique de dialogue RPG-like dans le bot. En tant que votre parsing entrée humaine, bascule les drapeaux pour des messages conversationnels spécifiques ou le contenu de l'utilisateur et de modifier conditionnellement ce que le chatbot peut parler, ou la façon dont il communique. Par exemple, un chatbot hérissé (ou grondement, ou rire) au langage grossier est assez commun; un chatbot qui va vous énerver, et à condition reste ainsi jusqu'à ce que tu t'excuses auprès de serait intéressant stateful variation sur ce. Basculer la sortie sur tous les CAPS, jeter dans la rhétorique de confrontation ou des demandes ou sanglots, etc.
pouvez-vous clarifier un peu ce que vous voulez que l'état vous aide à accomplir?
Imaginez un réseau neuronal avec des capacités d'analyse dans chaque noeud ou neurone. Selon les règles et les résultats de l'analyse, les neurones tirent. Si certains neurones se déclenchent, vous avez une bonne idée du sujet et de la sémantique de la question et pouvez donc donner une bonne réponse.
la mémoire se fait en gardant les sujets abordés dans une session, en ajoutant au tir pour la question suivante, et donc en guidant le processus de sélection des réponses possibles à la fin.
respectez vos règles et modèles dans une base de connaissances, mais les compiler dans la mémoire au moment du début, avec un neurone par règle. Vous pouvez concevoir des synapses en utilisant quelque chose comme des écouteurs ou des fonctions d'événement.
je pense que vous pouvez regarder le code pour Kooky
vérifiez aussi le kooky citations
je pense que pour commencer ce projet, il serait bon d'avoir une base de données avec des questions (organisé comme un arbre. Dans chaque noeud une ou plusieurs questions). Il convient de répondre à ces questions par "oui" ou "non".
si le bot commence à poser des questions, il peut commencer avec n'importe quelle question de la base de données yuor des questions marquées comme une question de départ. La réponse est le chemin vers le prochain nœud dans l'arbre.
Edit: voici un exemple écrit en ruby que vous pouvez commencer par: rubyBOT
programme de chat naïf. Aucune analyse, aucune intelligence, juste un fichier d'entraînement et de sortie.
il s'entraîne d'abord sur un texte et ensuite utilise les données de cette formation pour générer des réponses à l'entrée de l'interlocuteur. Le processus de formation crée un dictionnaire où chaque clé est un mot et la valeur est une liste de tous les mots qui suivent ce mot séquentiellement n'importe où dans le texte de formation. Si un mot de fonctionnalités plus d'une fois dans cette liste alors que reflète et il est plus probablement choisi par le bot, pas besoin de truc probabiliste juste le faire avec une liste.
le bot choisit un mot aléatoire à partir de votre entrée et génère une réponse en choisissant un autre mot aléatoire qui a été considéré comme un successeur à son mot retenu. Il répète ensuite le processus en trouvant un successeur à ce mot à tour de rôle et en continuant de façon itérative jusqu'à ce qu'il pense que c'est assez dit. Elle en arrive à cette conclusion en s'arrêtant sur un mot qui était antérieur à une marque de ponctuation dans la formation texte. Il retourne ensuite en mode d'entrée à nouveau pour vous permettre de répondre, et ainsi de suite.
ce n'est pas très réaliste mais je défie quiconque de faire mieux en 71 lignes de code !! C'est un grand défi pour tous les pythonistes en herbe, et je souhaite juste que je pourrais ouvrir le défi à un public plus large que le petit nombre de visiteurs que je reçois à ce blog. Pour coder un bot qui est toujours garanti d'être grammatical doit sûrement être plus proche de plusieurs centaines de lignes, j'ai simplifié considérablement en essayant juste de pensez à la règle la plus simple pour donner à l'ordinateur un simple coup de pouce d'avoir quelque chose à dire.
ses réponses sont pour le moins impressionnistes ! Aussi, vous devez mettre ce que vous dites dans des guillemets simples.
J'ai utilisé la guerre et la paix pour mon "corpus" qui a pris quelques heures pour la course d'entraînement, utilisez un dossier plus court si vous êtes impatient...
voici le formateur
#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()
voici le 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
Vous avez tendance à obtenir une étrange sentiment quand il dit quelque chose qui semble partiellement à faire sens.
je suggère d'examiner les probabilités bayésiennes. Ensuite, il suffit de surveiller le salon de chat pendant une période de temps pour créer votre arbre de probabilité.
Je ne suis pas sûr que ce soit ce que vous cherchez, mais il y a un vieux programme appelé ELIZA qui pourrait tenir une conversation en prenant ce que vous avez dit et en vous le recrachant après avoir effectué quelques transformations textuelles simples.
si je me souviens bien, beaucoup de gens étaient convaincus qu'ils" parlaient " à une personne réelle et avaient des conversations longues et élaborées avec elle.
Si vous êtes juste à barboter, je crois Pidgin vous permet de configurer le comportement de style chat. Une partie du cadre correspond probablement à l'état de qui a envoyé le message quand, et vous voudriez garder un journal de l'état interne de votre bot pour chacun des derniers messages N. Les décisions futures des États pourraient être codifiées sur la base de l'inspection des états précédents et du contenu des messages les plus récents. Ou vous pouvez faire quelque chose comme les chaînes de Markov discuté et l'utiliser à la fois pour l'analyse et générer.
si vous n'avez pas besoin d'un bot d'apprentissage, utilisez AIML (http://www.aiml.net/) va très probablement produire le résultat que vous voulez, au moins en ce qui concerne le bot parsing input et la réponse basée sur elle.
vous pouvez réutiliser ou créer des "cerveaux" en XML (dans le format AIML) et les analyser/les exécuter dans un programme (analyseur). Il y a des analyseurs faits dans plusieurs langues différentes à choisir, et pour autant que je puisse dire le code semble être open source dans la plupart des cas.
vous pouvez utiliser "ChatterBot", et l'héberger localement en utilisant - 'flask-chatterbot-master"
Liens:
- [Installation ChatterBot] https://chatterbot.readthedocs.io/en/stable/setup.html
- [Hôte Localement à l'aide d' - flacon-agent conversationnel-maître]: https://github.com/chamkank/flask-chatterbot
Cheers,
Ratnakar