Frage

Ich möchte einen Bot bauen, der jemandem ein paar einfache Fragen stellt und basierend auf der Antwort verzweigt.Mir ist klar, dass es eine Herausforderung sein wird, die Bedeutung menschlicher Antworten zu analysieren, aber wie richtet man das Programm so ein, dass es mit dem „Status“ der Konversation umgeht?

Es wird ein Eins-zu-eins-Gespräch zwischen einem Menschen und dem Bot sein.

War es hilfreich?

Lösung

Sie wollen wahrscheinlich in Markov-Ketten, wie die Grundlagen KI für den Bot . Ich schrieb etwas vor langer Zeit (der Code, den ich bin nicht von überhaupt stolz, und brauche einige Mods auf Python ausführen> 1.5), die ein nützlicher Ausgangspunkt für Sie sein: http: // Source. net / projects / Benzo /

EDIT: Hier ist ein minimales Beispiel in Python einer Markov-Kette, die auf den Wahrscheinlichkeiten von Worten basierte Eingabe von stdin und Ausgängen Text akzeptieren sie im Eingang Erfolg. Es ist optimiert für die IRC-Stil Chat-Protokolle, aber jeden anständigen Größe Fließtext durch sollte es die Konzepte zeigen:

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()

Es ist ziemlich von hier leicht in Persistenz und eine IRC-Bibliothek zu stecken und hat die Grundlage der Art von Bot über Sie reden.

Andere Tipps

Die Leute haben schon erwähnt, dass Statusbehaftung ist keine große Komponente typischer Chatbots:

  • eine reine Markov Implementierungen kann eine sehr lockere Art Zustand ausdrücken, wenn sie ihr Lexikon und Tabelle vom menschlichen Gesprächspartner in Echtzeit-frühere Äußerungen wachsen kann zufällig später im Gespräch, aber erbrochen bekommt das Markov-Modell keinen inhärenten Mechanismus zum Auswählen oder solche Reaktionen zu erzeugen.

  • a-Parsing-basierten bietet (z.B. ELIZA) versucht, im allgemeinen auf (ein Teil des) semantischen Inhalts der letzten Eingabe des Benutzer ohne nennenswerte Rücksicht auf vorherigen Austausch.

  • zu reagieren

Das heißt, Sie sicherlich können fügen eine gewisse Menge an Zustand zu einem chatbot, unabhängig von der Input-Parsing und statement-Synthesemodell Sie verwenden. Wie man das macht viel hängt davon ab, was Sie mit Ihrer Statusbehaftung erreichen wollen, und das ist nicht wirklich klar, aus Ihrer Frage. Ein paar allgemeine Ideen, aber:

  • Erstellen Sie eine Keyword-Stack. Als Ihr menschliches Zutun bietet, analysieren Schlüsselwörter aus ihren Aussagen / Fragen und diese Keywords auf einen Stapel von einer Art werfen. Wenn Ihr chatbot irgendwie etwas Zwingendes zu reagieren, die in der jüngsten Eingabe-oder vielleicht nur zufällig zu kommen, zu mischen, Dinge-gehen Sie zurück zu Ihrem Stapel, eine vorherige Stichwort greifen, und das verwenden, um Ihren nächsten Saatgut Synthese. Für Bonuspunkte, explizit den Bot erkennt an, dass es zu einem früheren Thema geht zurück, z.B. "Warte, Mensch, früher erwähnten Sie foo. [Satz von foo ausgesät]".

  • Build RPG-ähnliche Dialog-Logik in dem bietet. Als Ihr Parsen menschlichen Input, wechseln Flags für bestimmte Gesprächsaufforderungen oder Inhalte vom Benutzer und bedingt verändern, was die chatbot darüber reden kann, oder wie es in Verbindung steht. Zum Beispiel kann ein chatbot (oder schalt oder Lachen) bei Schimpfworte gespickt ist ziemlich verbreitet; ein chatbot, die het up und bedingt bleiben so bis entschuldigte bekommen , wäre eine interessante Stateful Variante davon sein. Schaltausgang zu ALL CAPS, wirft in konfrontative Rhetorik oder Forderungen oder Schluchzen, etc.

Können Sie ein wenig klären, was Sie den Zustand wollen Sie erreichen helfen?

Stellen Sie sich ein neuronales Netz mit Parsing-Fähigkeiten in jedem Knoten oder Neuronen. Je nach Regeln und Analyseergebnisse, Neuronen feuern. Wenn bestimmte Neuronen feuern, erhalten Sie eine gute Idee, über Thema und Semantik der Frage und damit eine gute Antwort geben kann.

Der Speicher wird, indem sie Themen getan gesprochen in einer Sitzung, für die nächste Frage an das Brennen Hinzufügen und damit den Auswahlprozess der möglichen Antworten am Ende zu führen.

Halten Sie Ihre Regeln und Muster in einer Wissensbasis, sondern sie in dem Speicher zur Startzeit kompilieren, mit einem Neuronen pro Regel. Sie können Synapsen Ingenieur so etwas wie Zuhörer oder Event-Funktionen verwenden.

Ich glaube, Sie den Code anschauen können für Kooky und IIRC es nutzt auch Markov-Ketten.

Auch die Besuche kooky zitiert , sie auf Coding Horror nicht lange vorgestellten wurden vor und einige sind urkomisch.

Ich denke, dieses Projekt zu starten, es wäre gut, eine Datenbank mit Fragen zu haben (als Baum organisiert. In jedem Knoten einer oder mehr Fragen). Diese Fragen sould mit „ja“ oder „nein“ beantwortet werden.

Wenn der Bot in Frage zu stellen beginnt, kann es mit jeder Frage aus yuor Datenbank von Fragen als Start Frage markiert starten. Die Antwort ist der Weg zum nächsten Knoten im Baum.

Edit: Hier ist ein somple ein in Ruby geschrieben mit denen Sie beginnen können: rubyBOT

naives chatbot Programm. Kein Parsing, keine Klugheit, nur eine Trainingsdatei und Ausgabe.

Es ersten Züge sich auf einen Text und verwendet dann später die Daten von diesem Training Antworten auf die Gesprächspartner der Eingang zu erzeugen. Der Trainingsprozess erstellt ein Wörterbuch, in dem jeder Schlüssel ist ein Wort, und der Wert ist eine Liste aller Worte, die diesem Wort sequentiell überall in dem Trainingstext folgen. Wenn ein Wort mehr als einmal in dieser Liste kennzeichnet dann das reflektiert und es ist wahrscheinlicher, durch den Bot gewählt werden, nur keine Notwendigkeit für probabilistische Sachen tut es mit einer Liste an.

Der Bot wählt ein zufälliges Wort aus Ihrer Eingabe und erzeugt eine Antwort durch ein anderes zufälliges Wort wählen, das gesehen wurde ein Nachfolger seines gehaltenen Wort. Er wiederholt dann den Prozess durch einen Nachfolger für dieses Wort wiederum zu finden und trägt auf iterativ, bis er denkt, dass es genug gesagt. Er erreicht diese Schlussfolgerung durch auf einem Wort zu stoppen, die vor einem Satzzeichen im Trainingstext war. Er kehrt dann in den Eingabemodus wieder, damit Sie antworten, und so weiter.

Es ist nicht sehr realistisch ist, aber ich hiermit fordere jeden besseren Code in 71 Zeilen zu tun !! Dies ist eine große Herausforderung für jeden angehenden Pythonists, und ich wünschte nur, ich die Herausforderung an ein breiteres Publikum als die kleine Zahl der Besucher öffnen konnte ich in diesem Blog zu bekommen. Um ein Bot-Code, der immer garantiert, grammatische sein muss sicherlich näher sein, mehr hundert Zeilen, ich vereinfachte enorm von nur versuchen, der einfachste Regel zu denken, dem Computer einen bloßen Stich zu geben, um etwas zu sagen zu haben.

Die Antworten sind eher impressionistisch, gelinde gesagt! Außerdem müssen Sie setzen, was Sie in einfachen Anführungszeichen sagen.

Ich habe Krieg und Frieden für meine „Corpus“, die ein paar Stunden für den Trainingslauf nahm, verwenden Sie eine kürzere Datei, wenn Sie ungeduldig sind ...

Hier ist der Trainer

#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()

Hier ist der 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

Sie neigen dazu, ein unheimliches Gefühl zu bekommen, wenn es sagt etwas, das teilweise Sinn zu machen scheint.

Ich würde vorschlagen, auf Bayes-Wahrscheinlichkeiten suchen. Dann überwacht nur den Chatraum für einen bestimmten Zeitraum Ihres Wahrscheinlichkeitsbaum zu erstellen.

Ich bin nicht sicher, ob dies ist, was Sie suchen, aber es ist ein altes Programm namens ELIZA die könnte ein Gespräch halten, indem sie, was Sie gesagt und es zurück an Sie spucken nach ein paar einfache Texttransformationen durchführen.

Wenn ich mich richtig erinnere, waren viele Leute davon überzeugt, dass sie „sprechen“ mit einer realen Person und hatten lange aufwendige Gespräche mit ihm.

Wenn Sie gerade Dilettantismus, ich glaube Pidgin können Sie Skript Verhalten Chat-Stil. Ein Teil des Rahmens wahrscheinlich heftet den Zustand, der die Nachricht gesendet wird, wenn, und Sie würden ein Protokoll Ihrer bot den internen Zustand für jedes der letzten N Nachrichten behalten möchten. Zukünftige Zustand Entscheidungen könnten basierend auf Inspektion von früheren Zuständen und dem Inhalt der letzten paar Nachrichten fest einprogrammiert werden. Oder Sie könnten etwas tun, wie die Markov-Ketten diskutiert und es sowohl für das Parsen und Generieren verwenden.

Wenn Sie keinen Lernbot benötigen, verwenden Sie AIML (http://www.aiml.net/) wird höchstwahrscheinlich das gewünschte Ergebnis liefern, zumindest im Hinblick auf das Parsen der Eingabe durch den Bot und die darauf basierende Antwort.

Sie würden „Gehirne“ aus XML (im AIML-Format) wiederverwenden oder erstellen und sie in einem Programm (Parser) analysieren/ausführen.Es stehen Parser in verschiedenen Sprachen zur Auswahl, und soweit ich das beurteilen kann, scheint der Code in den meisten Fällen Open Source zu sein.

Sie können mit "Chatterbot", und Gastgeber es lokal mit - ‚flaschen chatterbot-Master“

Links:

  1. [Chatterbot Installation] https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Host-Lokal mit - Kolben-Chat-Roboter-master]: https://github.com/chamkank / Kolben-chatterbot

Cheers,

Ratnakar

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top