Chatbot in PHP

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
Dubbel
Beiträge: 197
Registriert: So Jul 06, 2008 6:25 pm
Wohnort: Kopenhagen
Kontaktdaten:

Chatbot in PHP

Beitrag von Dubbel » So Nov 16, 2008 5:38 pm

Hi!

Ich hab mir vorgenommen einen Chatbot zu schreiben, der lernfähig ist.
Lernfähig in dem Sinne, dass er neue Wörter speichert und versucht eine Bewertung zu bekommen.
Das Konzept ist allerdings noch sehr unausgereift, und ich hab mehrere mögliche Wege im Kopf, ihn zu realisieren.

Ich weiß nicht genau, ob das hier das richtige Forum hierfür ist, da ich keine Probleme mit PHP (syntaxmäßig) habe, sondern mich nur umhören wollte, wie ihr einen Chatbot schreiben würdet. Könnte also auch zu Konzepten passen oder sonstwohin ^^

Das Userinterface besteht aus einem Eingabefeld, dessen Inhalt nach der Eingabe an die Datei answer.php geleitet wird. Diese wertet dann den Inhalt aus, und gibt eine Antwort zurück.
Ich hatte bereits vor einigen Jahren einen Chatbot geschrieben, der aber nur Antworten auf Fragen geben konnte, die ihm andere User bereits gegeben hatten. Kannte er die Antwort nicht, hat er einfach die Frage wiederholt, und der User hat eingegeben, was er an seiner Stelle antworten würde. Das ist natürlich lustig, aber er war weder intelligent, noch hatte er einen großen Wortschatz (600 Fragen + Antworten) und war natürlich auch sehr fehleranfällig, wenn man ein einen falschen Chatpartner gerät. (Link: http://fun.haukeluebbers.de/talk_with_dubbel/ ).

Der neue Bot soll intelligenter werden:
Er soll Eckdaten des Users (Name, Alter, evt. Wohnort) in Cookies speichern, um evt. auf sie zugreifen zu können.
Das erste Problem besteht darin, wie er den Sinn der Sätze erkennt.
Mir sind bisher zwei Möglichkeiten eingefallen:
Gehen wir von einem normalen Subjekt-Prädikat-Adjektiv Satz ("You are great") aus:
1. Der Bot erkennt, dass es drei Wörter gibt (Füllwörter wie "so" und Smileys ("xD") müssen natürlich vorher entfernt werden), und übergibt sie der Funktion three_words($string). Dieser check die einzelnen Wörter. "You" steht in der MySQL Tabelle "cb_pronouns".
Die sieht so aus: id | word | relation
id ist fortlaufend, word das Wort ("you" - alles wird zu Kleinbuchstaben umgewandelt, was allerdings die Erkennung von Nomen an Großbuchstaben verhindert, was aber (in einem Chat) auch nicht sehr zuverlässig wäre), und in relation steht (bisher) ob sich das Wort auf den Bot (1), den User (2) oder etwas anderes bezieht (3). Das Ergebnis wäre also, dass sich der Satz auf den Bot bezieht. Dann wird das zweite Wort überprüft (passt es zu "you"?), und schließlich wird das letzte Wort überprüft, ob es positiv, negativ oder neutral ist. Ist es negativ, dann wird der $bot_mood auf negativ gesetzt, er würde den User also nicht mehr so freundlich behandeln. Wie man die Antwort erstellt, wäre ein weiteres Problem, aber das werde ich später angehen.
Die 2. Möglichkeit wäre, dass der Bot nur Stichwörter überprüft ("PHP is slow, but i love it"). Wenn er hier nun "PHP" als Subjekt erkennt, und vielleicht noch "i" und "love", könnte er den Inhalt erahnen.
Der Vorteil ist, dass die zweite Methode auch bei vielen Füllwörtern, längeren Sätzen und Grammatikfehlern funktioniert, aber den Sinn nicht immer richtig verstehen wird.

Ein weiteres Problem ist die Lernfähigkeit. Ich hatte die Idee, den Bot, wenn der User eine nicht weiter verfolgbare Antwort gibt ("Hmm..."), einfach sagt "You are bored? What do you think about 'Obama'?", und dann die Antwort auswertet (also bei dem Wert Obama in der Datenbank das Rating ++ oder -- setzt. Obama müsste er dann vorher mal aufgeschnappt haben, und als nicht bekannt in eine Tabelle verschoben haben. Zusätzlich zu dieser Bewertung wollte ich auch noch Labels zu den einzelnen Wörtern erstellen. Obama würde dann z.B. noch USA zugeordnet, und der Bot wählt dann ein weiteres Wort, dass diesem Label zugeordnet ist.

Ja, das wars erstmal ^^

Wie würdet ihr einen Chatbot konstruieren (ungefähr - muss ja nicht so lang beschreiben sein wie dieser Möglichkeit)?
Ich weiß, dass es mit nicht möglich sein wird, einen perfekten Chatpartner zu programmieren, oder den besten Chatbot, aber ich will trotzdem versuchen einen einigermaßen funktionierenden zu schreiben... :)

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Chatbot in PHP

Beitrag von Dirty Oerti » So Nov 16, 2008 6:10 pm

Keine schlechte Idee :)

Das Problem, dass ich bei deiner Lösung sehe, ist erstens die riesige Größe an Daten, die da mit der Zeit entsteht und zweitens die Geschwindigkeit, die mit größer werdender Datenmenge immer mehr abnimmt.

Wichtig ist, denke ich, dass du Relationen zwischen Begriffen aufstellst. Relationen werden bei mehrfacher "Benutzung" verstärkt, damit steigt ihre Relevanz.
Angenommen du hast den Satz "Du bist cool", dann sollte er überprüfen, was "du" bedeutet, bzw womit es verknüpft ist.
Findet er keine Verknüpfung, muss der Bot fragen, auf was sich "du" denn bezieht. Er wird dann öfters die Antwort bekommen, dass er, der Bot, "du" ist. (oder man gibt ihm das schon vor ;) um die Lerndauer zu verkürzen).
Dann sollte er das nächste Wort überprüfen. Sollte gucken, ob er mit "bist" irgendwelche Verknüpfungen/Antworten/Reflexe hat. In diesem Fall sollte (sonst wirds wirklich zu heftig, ihm das alles zu lernen) man ihm vergegeben haben, das das Wort "bist" eine Zuweisung ist.
Das heißt er verknüpft die Wörter/Satzteile vor und hinter dem "bist" mit einander.

Kommt nun irgendwann z.B. die Frage "Wer ist cool?", sollte der Bot erkennen, dass es sich um eine Frage handelt.
Er untersucht den Ausdruck "Wer", findet heraus, das eine Person gesucht ist. "Ist" ist wieder eine Zuweisung, da es sich aber um eine Frage an den Bot handelt, lernt er mal besser nicht, was ihm da vorgesetzt wird. "Cool" gibt dann das Kriterium an, nachdem der Bot seine Datenbanke durchsuchen kann. Heißt: Er guckt, was ist alles mit "cool" verknüpft und gibt dann das mit der stärksten Verknüpfung aus. (Z.B. "ich" oder "der bot" )


Eine andere Lösung, die im Prinzip hierauf aufbaut, jedoch deutlich flexibler und oft auch erfolgreicher ist, ist eine sogenannte SOM (Self Organizing Map). Eine SOM ist eine Art neurales Netzwerk, das je nach Eingabe unterschiedlich handelt.
Und sie muss nicht einmal Werte vorgegeben bekommen.

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Chatbot in PHP

Beitrag von Xin » So Nov 16, 2008 7:23 pm

Dubbel hat geschrieben:Ich weiß nicht genau, ob das hier das richtige Forum hierfür ist, da ich keine Probleme mit PHP (syntaxmäßig) habe, sondern mich nur umhören wollte, wie ihr einen Chatbot schreiben würdet. Könnte also auch zu Konzepten passen oder sonstwohin ^^
Jow, tut es auch. Du hast ein Konzeptproblem, egal mit welcher Sprach Du es lösen möchtest.
Dubbel hat geschrieben:Der neue Bot soll intelligenter werden:
Gehen wir von einem normalen Subjekt-Prädikat-Adjektiv Satz ("You are great") aus:
1. Der Bot erkennt, dass es drei Wörter gibt (Füllwörter wie "so" und Smileys ("xD") müssen natürlich vorher entfernt werden), und übergibt sie der Funktion three_words($string). Dieser check die einzelnen Wörter. "You" steht in der MySQL Tabelle "cb_pronouns".
Die sieht so aus: id | word | relation
id ist fortlaufend, word das Wort ("you" - alles wird zu Kleinbuchstaben umgewandelt, was allerdings die Erkennung von Nomen an Großbuchstaben verhindert, was aber (in einem Chat) auch nicht sehr zuverlässig wäre), und in relation steht (bisher) ob sich das Wort auf den Bot (1), den User (2) oder etwas anderes bezieht (3). Das Ergebnis wäre also, dass sich der Satz auf den Bot bezieht. Dann wird das zweite Wort überprüft (passt es zu "you"?), und schließlich wird das letzte Wort überprüft, ob es positiv, negativ oder neutral ist. Ist es negativ, dann wird der $bot_mood auf negativ gesetzt, er würde den User also nicht mehr so freundlich behandeln. Wie man die Antwort erstellt, wäre ein weiteres Problem, aber das werde ich später angehen.
Du untersuchst die Bedeutung eines Satzes anhand der Gramatik.
Die Gramatik bestimmt die Syntax einer Bedeutung - aber halt nicht die Bedeutung.
Das Problem ist ja nicht zu erkennen, dass "ich" sich Pronomen ist, sondern zu erkennen, was "ich" oder ein Pronomen eigentlich bedeutet.
Dubbel hat geschrieben:Die 2. Möglichkeit wäre, dass der Bot nur Stichwörter überprüft ("PHP is slow, but i love it"). Wenn er hier nun "PHP" als Subjekt erkennt, und vielleicht noch "i" und "love", könnte er den Inhalt erahnen.
Der Vorteil ist, dass die zweite Methode auch bei vielen Füllwörtern, längeren Sätzen und Grammatikfehlern funktioniert, aber den Sinn nicht immer richtig verstehen wird.
Nochmals die Frage - wie speicherst Du die Bedeutung von 'I' und 'love'?
Dubbel hat geschrieben:Ein weiteres Problem ist die Lernfähigkeit. Ich hatte die Idee, den Bot, wenn der User eine nicht weiter verfolgbare Antwort gibt ("Hmm..."), einfach sagt "You are bored? What do you think about 'Obama'?", und dann die Antwort auswertet (also bei dem Wert Obama in der Datenbank das Rating ++ oder -- setzt. Obama müsste er dann vorher mal aufgeschnappt haben, und als nicht bekannt in eine Tabelle verschoben haben. Zusätzlich zu dieser Bewertung wollte ich auch noch Labels zu den einzelnen Wörtern erstellen. Obama würde dann z.B. noch USA zugeordnet, und der Bot wählt dann ein weiteres Wort, dass diesem Label zugeordnet ist.
Ich habe mir diesbezüglich auch einige Gedanken gemacht, an bewertetes Tagging (was Du als Labels und Mood bezeichnest ) habe ich dabei auch gedacht.
Der Punkt ist, dass sich die Bedeutung eines Wortes erst in einem großen Beziehungsnetzwerk unterschiedlicher Worte ergibt. Wobei es eigentlich nicht um Wörter geht, sondern um Ideen, die man mit Wörtern ausdrücken kann, die Beziehungen zu anderen Ideen haben.

Gramatik - also die erste Möglichkeit - ist hier eigentlich fehl am Platz, denn sie ordnet nur die Reihenfolge der Wörter, aber nicht die Ideen. Wenn "Dir jemand an den Karren pisst", dann kannst Du den Satz gramatikalisch ordnen, Du kannst ihn vielleicht sogar verstehen, aber wenn Du Dich dann fragst, von welchem Karren gesprochen wird, hast Du die Idee dahinter nicht verstanden. "jemanden an den Karren pissen" repräsentiert eine Idee.
Dubbel hat geschrieben:Wie würdet ihr einen Chatbot konstruieren (ungefähr - muss ja nicht so lang beschreiben sein wie dieser Möglichkeit)?
Ich weiß, dass es mit nicht möglich sein wird, einen perfekten Chatpartner zu programmieren, oder den besten Chatbot, aber ich will trotzdem versuchen einen einigermaßen funktionierenden zu schreiben... :)
Dann solltest Du Dich auf einfache Betrügereien einlassen. Einen intelligenten Bot zu schreiben verlangt Verständnis für Sprache. Ein Thema für eine Reihe von Doktorarbeiten, nicht für ein Hobbyprojekt.


PS: Schau Dir mal die Sprache Prolog an.
Um Daniels Coolness-Problem zu lösen, ist sie jedenfalls Ideal.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Chatbot in PHP

Beitrag von nufan » Mo Nov 17, 2008 3:00 pm

Ist ja lustig, ich könnt den ganzen Tag mit ihm chatten :D

Dominik
Beiträge: 381
Registriert: Mo Jul 07, 2008 9:39 pm

Re: Chatbot in PHP

Beitrag von Dominik » So Nov 23, 2008 2:00 pm

Schöne Idee sollte man wirklich mal einen Schreiben der wirklich gut auf die Fragen antwortet bzw mit einen unterhält

wenn man es schlau anstellt wird es auch nicht zu langsam mit vielen db einträgen
Rechtschreibefehler sind gewollt und dienen der Unterhaltung

Antworten