Ich habe darüber nachgedacht, einen Chatbot mit Markov-Ketten zu erstellen, bin mir aber nicht ganz sicher, wie ich ihn zum Laufen bringen soll. Soweit ich weiß, erstellen Sie eine Tabelle aus Daten mit einem bestimmten Wort und den folgenden Wörtern. Ist es möglich, während des Trainings des Bots irgendeine Wahrscheinlichkeit oder einen Zähler anzuhängen? Ist das überhaupt eine gute Idee?
Der zweite Teil des Problems betrifft Schlüsselwörter. Angenommen, ich kann Schlüsselwörter bereits anhand von Benutzereingaben identifizieren. Wie generiere ich einen Satz, der dieses Schlüsselwort verwendet? Ich möchte den Satz nicht immer mit dem Schlüsselwort beginnen. Wie setze ich also die Markov-Kette?
Antworten:
Ich habe vor ein paar Jahren einen Markov-Ketten-Chatbot für IRC in Python erstellt und kann etwas Licht ins Dunkel bringen, wie ich es gemacht habe. Der generierte Text macht nicht unbedingt Sinn, aber es kann wirklich Spaß machen, ihn zu lesen. Lassen Sie es uns in Schritten zerlegen. Angenommen, Sie haben eine feste Eingabe, eine Textdatei (Sie können Eingaben aus Chat-Text oder Texten verwenden oder einfach Ihre Fantasie verwenden).
Durchlaufen Sie den Text und erstellen Sie ein Wörterbuch, dh einen Schlüsselwertcontainer. Und setzen Sie alle Wortpaare als Schlüssel und das folgende Wort als Wert. Zum Beispiel: Wenn Sie einen Text "abcab k" haben, beginnen Sie mit "ab" als Schlüssel und "c" als Wert, dann "bc" und "a" als Wert ... der Wert sollte eine Liste oder eine Sammlung sein 0..Viele 'Elemente', da Sie für ein bestimmtes Wortpaar mehr als einen Wert haben können. Im obigen Beispiel haben Sie zweimal "a b", gefolgt von "c" und am Ende von "k". Am Ende haben Sie also ein Wörterbuch / einen Hash, der wie folgt aussieht:
{'a b': ['c','k'], 'b c': ['a'], 'c a': ['b']}
Jetzt haben Sie die erforderliche Struktur zum Erstellen Ihres funky Textes. Sie können wählen, ob Sie mit einem zufälligen Schlüssel oder einem festen Ort beginnen möchten! Wenn wir also die Struktur haben, die wir haben, können wir beginnen, indem wir "ab" speichern und dann zufällig ein folgendes Wort aus dem Wert c oder k nehmen, also das erste Speichern in der Schleife "ab k" (wenn "k" der gewählte zufällige Wert war ) Dann fahren Sie fort, indem Sie einen Schritt nach rechts bewegen, der in unserem Fall "bk" ist, und einen zufälligen Wert für dieses Paar speichern, wenn Sie in unserem Fall nein haben, damit Sie aus der Schleife ausbrechen (oder Sie können andere Dinge entscheiden wie von vorne anfangen). Wenn die Schleife fertig ist, drucken Sie Ihre gespeicherte Textzeichenfolge.
Je größer die Eingabe, desto mehr Werte haben Sie für Ihre Schlüssel (Wortpaar) und dann einen "intelligenteren Bot", damit Sie Ihren Bot "trainieren" können, indem Sie mehr Text hinzufügen (möglicherweise Chat-Eingabe?). Wenn Sie ein Buch als Eingabe haben, können Sie einige schöne zufällige Sätze konstruieren. Bitte beachten Sie, dass Sie nicht nur ein Wort, das einem Paar folgt, als Wert verwenden müssen, sondern 2 oder 10. Der Unterschied besteht darin, dass Ihr Text genauer erscheint, wenn Sie "längere" Bausteine verwenden. Beginnen Sie mit einem Paar als Schlüssel und dem folgenden Wort als Wert.
Sie sehen also, dass Sie grundsätzlich zwei Schritte ausführen können: Erstellen Sie zunächst eine Struktur, in der Sie zunächst zufällig einen Schlüssel auswählen, nehmen Sie dann diesen Schlüssel, drucken Sie einen zufälligen Wert dieses Schlüssels und fahren Sie fort, bis Sie keinen Wert oder eine andere Bedingung mehr haben. Wenn Sie möchten, können Sie ein Wortpaar aus einer Chat-Eingabe aus Ihrer Schlüsselwertstruktur "säen", um einen Anfang zu haben. Es liegt in Ihrer Fantasie, wie Sie Ihre Kette starten.
Beispiel mit echten Worten:
Erstellen Sie nun eine Schleife:
Wählen Sie einen zufälligen Schlüssel, sagen Sie "Hallo mein" und wählen Sie zufällig einen Wert, nur einen hier, also seinen "Namen" (SPEICHERN von "Hallo mein Name") . Gehen Sie
nun einen Schritt nach rechts und nehmen Sie "Mein Name" als nächsten Schlüssel und wählen Sie einen zufälligen Wert ... "ist" (SPEICHERN "Hallo, mein Name ist") .
Bewegen Sie sich jetzt und nehmen Sie "Name ist" ... "Al" (SPEICHERN "Hallo, mein Name ist AL") .
Nehmen Sie nun "ist Al" ... "und" (SPAREN SIE "Hallo, mein Name ist Al und") .
...
Wenn Sie zu "und i" kommen, wählen Sie zufällig einen Wert aus, sagen wir "können", dann wird das Wort "ich kann" gemacht usw. Wenn Sie zu Ihrem Stoppzustand kommen oder wenn Sie keine Werte haben, drucken Sie den konstruierten Wert Zeichenfolge in unserem Fall:
"Hallo, mein Name ist Al und ich kann dort leben, solange ich will."
Wenn Sie mehr Werte haben, können Sie zu beliebigen Tasten springen. Je mehr Werte Sie haben, desto mehr Kombinationen haben Sie und desto zufälliger und unterhaltsamer wird der Text.
quelle
Der Bot wählt ein zufälliges Wort aus Ihrer Eingabe aus und generiert eine Antwort, indem er ein anderes zufälliges Wort auswählt, das als Nachfolger seines gehaltenen Wortes angesehen wurde. Es wiederholt dann den Vorgang, indem es nacheinander einen Nachfolger für dieses Wort findet und iterativ weitermacht, bis es denkt, dass es genug gesagt ist. Zu dieser Schlussfolgerung gelangt man zu einem Wort, das vor einem Satzzeichen im Trainingstext stand. Anschließend kehrt es wieder in den Eingabemodus zurück, damit Sie antworten können, und so weiter.
Es ist nicht sehr realistisch, aber ich fordere hiermit jeden auf, es in 71 Codezeilen besser zu machen !! Dies ist eine große Herausforderung für angehende Pythonisten, und ich wünschte nur, ich könnte die Herausforderung einem breiteren Publikum zugänglich machen als der geringen Anzahl von Besuchern, die ich in diesem Blog bekomme. Um einen Bot zu codieren, von dem immer garantiert wird, dass er grammatikalisch ist, muss er sicherlich näher an mehreren hundert Zeilen liegen. Ich habe es enorm vereinfacht, indem ich nur versucht habe, an die einfachste Regel zu denken, um dem Computer einen Stich zu geben, etwas zu sagen.
Die Antworten sind gelinde gesagt eher impressionistisch! Außerdem müssen Sie das, was Sie sagen, in einfache Anführungszeichen setzen.
Ich habe Krieg und Frieden für meinen „Korpus“ verwendet, der einige Stunden für den Trainingslauf gedauert hat. Verwenden Sie eine kürzere Datei, wenn Sie ungeduldig sind.
Hier ist der Trainer
Hier ist der Bot:
Sie neigen dazu, ein unheimliches Gefühl zu bekommen, wenn es etwas sagt, das teilweise sinnvoll erscheint.
quelle
Sie könnten Folgendes tun: Erstellen Sie einen Markov-Kettengenerator für Bestellung 1, indem Sie Wörter und keine Buchstaben verwenden. Jedes Mal, wenn jemand etwas veröffentlicht, wird das, was er gepostet hat, zur Bot-Datenbank hinzugefügt. Außerdem würde Bot sparen, wenn er zum Chatten ging und wenn ein Typ den ersten Beitrag veröffentlichte (in Vielfachen von 10 Sekunden), dann würde er die Zeit sparen, die derselbe Typ darauf wartete, erneut zu posten (in Vielfachen von 10 Sekunden) ... Dieser zweite Teil wird verwendet, um zu sehen, wann der Typ etwas veröffentlicht, also nimmt er am Chat teil und nach einiger Zeit basierend auf einer Tabelle mit "Nach wie vielen 10 Sekunden hat der Typ nach dem Beitritt zum Chat gepostet", dann würde er fortfahren mit derselben Tabelle posten und darüber nachdenken, "wie viel Zeit wurde zum Schreiben des Posts verwendet, der nach einem Post gepostet wurde, über den er X Sekunden lang nachgedacht und geschrieben hat".
quelle