Question

Je veux construire un bot qui demande à quelqu'un à quelques questions simples et des branches en fonction de la réponse.Je me rends compte de l'analyse du sens de l'humain, les réponses seront difficiles, mais comment voulez-vous configurer le programme pour faire face à "l'état" de la conversation?

Ce sera un one-to-one de la conversation entre l'homme et le robot.

Était-ce utile?

La solution

Vous voudrez probablement regarder dans Chaînes De Markov ce qui est la base pour le bot de l'IA.J'ai écrit quelque chose il y a longtemps (le code à qui je n'en suis pas fier du tout, et les besoins de certains mods pour s'exécuter sur Python > 1.5) qui peut être un utile point de départ pour vous: http://sourceforge.net/projects/benzo/

EDIT:Voici un exemple minimal en Python d'une Chaîne de Markov qui accepte entrée à partir de stdin et sorties de texte basé sur les probabilités des mots qui se succèdent dans l'entrée.Il est optimisé pour l'IRC-chat de style des journaux, mais l'exécution de toute taille décente du texte à travers elle doit 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()

C'est assez facile à partir d'ici pour brancher la persistance et de la CEI, de la bibliothèque et les principes de base de la type de bot, vous êtes en train de parler.

Autres conseils

Les gens ont déjà mentionné que statefulness n'est pas une grosse composante de typique chatbots:

  • un pur Markov implémentations peuvent exprimer une très lâche de sorte d'état si elle est croissante de son lexique et de la table en temps réel—plus tôt les énonciations de l'homme, l'interlocuteur peut obtenir régurgité par chance plus tard dans la conversation, mais le modèle de Markov n'ont pas de mécanisme intrinsèque de la sélection ou de la production de ces réponses.

  • une analyse basée sur bot (par ex.ELIZA) essaie généralement de répondre à (certains) contenu sémantique de la plus récente entrée de l'utilisateur, sans égard pour l'avant des échanges.

Cela dit, vous avez certainement peut ajouter un peu de quantité d'état à un chatbot, quelle que soit l'entrée d'analyse et de synthèse du modèle que vous utilisez.La façon de le faire dépend beaucoup de ce que vous voulez accomplir avec votre statefulness, et ce n'est pas vraiment clair à partir de votre question.Quelques idées générales, cependant:

  • Créer un mot-clé de la pile.Que votre homme offre une entrée, d'analyser les mots clés de leurs déclarations et des questions et jeter ces mots-clés sur une pile de quelque sorte.Lorsque votre chatbot ne parvient pas à venir avec quelque chose de convaincant pour répondre à la plus récente d'entrée—ou, peut-être, juste au hasard, de mélanger les choses reviennent à votre pile, de saisir un mot-clé précédent, et l'utiliser pour les semences de votre prochain synthèse.Pour les points de bonus, le bot reconnaissent explicitement qu'il va revenir à un précédent sujet, par exemple"Attendez, l'HOMME, vous avez mentionné plus tôt foo.[Phrase ensemencées par foo]".

  • Construire des RPG-comme le dialogue de la logique dans le bot.Votre analyse de l'homme de l'entrée, de la bascule drapeaux spécifiques de la conversation des messages ou du contenu de l'utilisateur, et à condition de modifier ce que le chatbot peut parler, ou comment il communique.Par exemple, un chatbot hérissée (ou reproches, ou de rire) à un langage grossier est assez commun;un chatbot qui va vous énerver, et à condition le demeurent jusqu'a présenté des excuses à, serait intéressant stateful variation sur ce.Sortie de l'interrupteur à TOUS les CHAPEAUX, les jeter dans la confrontation à la rhétorique ou à des demandes ou à sanglots, etc.

Pouvez-vous préciser un peu ce que vous voulez l'état pour vous aider à accomplir?

Imaginez un réseau de neurones avec l'analyse des capacités de chaque nœud ou du neurone.Selon les règles et l'analyse des résultats, les neurones feu.Si certains neurones feu, vous obtenez une bonne idée sur le sujet et sémantique de la question et, par conséquent, peut donner une bonne réponse.

La mémoire est de faire en gardant sujets parlé dans une session, l'ajout de tir pour la prochaine question, et, par conséquent, de guider le processus de sélection des réponses possibles à la fin.

Garder vos règles et les structures dans une base de connaissances, mais de les compiler dans la mémoire à l'heure de début, avec un neurone par la règle.Vous pouvez ingénieur synapses en utilisant quelque chose comme auditeurs ou les fonctions d'événement.

Je pense que vous pouvez regarder le code pour Kooky, et autant que je me souvienne, il utilise également des Chaînes de Markov.

Découvrez également les kooky citations, ils ont été présentés sur le code de l'Horreur il n'ya pas longtemps, et certains sont hilarants.

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).Ces questions doivent être répondu par "oui" ou "non".

Si le bot commence à la question, il peut commencer avec n'importe quelle question de yuor base de données de questions marquées comme une start-question.La réponse est le chemin vers le prochain nœud dans l'arbre.

Edit:Voici un somple un écrit en ruby, vous pouvez commencer avec: rubyBOT

naïf chatbot programme.Aucune analyse, aucune intelligence, juste un fichier d'entraînement et de sortie.

D'abord les trains de lui-même sur un texte, puis plus tard, utilise les données de cette formation pour générer des réponses de l'interlocuteur de l'entrée.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 la parole de manière séquentielle 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 susceptible d'être choisi par le bot, pas besoin d'probabiliste des trucs juste le faire avec une liste.

Le bot choisit un mot au hasard à partir de votre entrée et génère une réponse en choisissant un autre mot aléatoire qui a été vu pour être un successeur à son lieu de mots.Il répète ensuite le processus par trouver un successeur de la parole tour à tour et de manière itérative jusqu'à ce qu'il pense que c'est assez dit.Il parvient à cette conclusion en s'arrêtant à un mot qui était avant un signe de ponctuation dans le texte de formation.Il retourne ensuite en mode d'entrée à nouveau pour vous permettre de répondre, et ainsi de suite.

Il n'est pas très réaliste, mais par la présente, je mets quiconque au défi de faire mieux en 71, lignes de code !!C'est un grand défi pour toute herbe Pythonists, et je souhaite juste que je pouvais ouvrir le défi à un public plus large que le petit nombre de visiteurs que je reçois sur ce blog.Pour coder un bot qui est toujours la garantie d'être grammaticale doit sûrement être plus près de plusieurs centaines de lignes, j'ai simplifié très simplement en essayant de penser à la règle la plus simple pour donner à l'ordinateur d'un simple coup de couteau à avoir quelque chose à dire.

Ses réponses sont plutôt impressionniste, pour dire le moins !Aussi, vous devez mettre ce que vous dites dans des guillemets simples.

J'ai utilisé de la Guerre et de la Paix pour mon “corpus” qui a pris une couple d'heures pour le parcours de formation, l'utilisation d'un fichier 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 un sentiment étrange quand il dit quelque chose qui semble partiellement à faire sens.

Je suggère de regarder à Bayésienne des probabilités.Puis il suffit de surveiller la salle de chat pour une période de temps pour créer votre arbre de probabilité.

Je ne suis pas sûr que c'est ce que vous cherchez, mais il y a un vieux programme appelé ELIZA ce qui pourrait tenir une conversation en prenant ce que vous avez dit et de cracher à vous après avoir effectué quelques simples transformations textuelles.

Si je me souviens bien, beaucoup de gens étaient convaincus qu'ils étaient le fait de "parler" à une personne réelle et avait de longs élaborer des conversations avec elle.

Si vous êtes juste à barboter, je crois Pidgin vous permet de script de chat style de comportement.Partie du cadre probablement les clous de l'etat qui a envoyé le message lors de l', et que vous souhaitez tenir un journal de votre bot interne de l'état pour chacun des N derniers messages.Les futures décisions de l'état pourrait être codé en dur basé sur l'inspection du précédent les états et le contenu le plus récent de quelques messages.Ou vous pourriez faire quelque chose comme les chaînes de Markov discuté et l'utiliser à la fois pour l'analyse et la génération.

Si vous n'avez pas besoin d'un apprentissage bot, à l'aide de AIML (http://www.aiml.net/) seront les plus susceptibles de produire les résultats que vous voulez, au moins en ce qui concerne le bot entrée lors de l'analyse et de réponse basées sur elle.

Vous réutilisation ou de créer des "cerveaux" de XML (dans l'AIML-format) et parse/exécuter dans un programme (analyseur).Il y a des analyseurs dans plusieurs langues différentes à choisir, et aussi loin que je peux dire que le code semble être open source dans la plupart des cas.

Vous pouvez utiliser "agent conversationnel", et l'héberger localement à l'aide d' - 'flacon-agent conversationnel-maître"

Liens:

  1. [Agent Conversationnel De L'Installation]. https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Hôte Localement à l'aide d' - flacon-agent conversationnel-maître]: https://github.com/chamkank/flask-chatterbot

Cheers,

Ratnakar

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top