in Artificial Intelligence, IT stuff, PHP, Programming

PHP Chatbot Statusbericht Nr. 2

Wie siehts eigentlich mit meinem Chatbot aus? Die Chatterbox Challenge rückt unaufhaltsam näher – und bereits in exakt 2 Monaten ist der Abgabetermin. Die Fortschritte meines Bots sowie einige kleine Ausschnitte aus der Arbeitsweise gibt es hier…

Was der Bot kann

Ich schätze es ist am einfachsten einfach einige Auszüge aus Konversationen mit dem Bot hier zu posten:

Ich: Your name is PHPChatBot!
Bot: oh, thanks, that was new to me!
Ich: Your name is PHPChatBot!
Bot: i know
Ich: Your name is Dieter!
Bot: I think my name is phpchatbot!
Ich: What is your name?
Bot: in my opinion my name is phpchatbot …
Ich:
What makes 234.4+234.5?
Bot:
the way i learned it at school that makes 468.9!

Man sieht also, dass der Bot:

  • – Eingaben a la “This is that” verarbeiten und sich merken kann (Benötigte Syntax: Ausrufezeichen am Ende)
  • – Eingaben umdrehen kann (“What is your name” -> “What is my name”)
  • – Auf Fragen antworten kann, wenn er die Antwort kennt
  • – Matheaufgaben lösen (+,-,*,/) kann

Wie funktionieren die einzelnen Fähigkeiten?

Lernfähigkeit:

Zunächst wird geprüft, ob am Ende des Satzes ein Ausrufezeichen steht. Ist dies der Fall, so wird der Satz bei einem “Zuweisungswort” gespalten. Das Zuweisungswort bei “Your name is phpchatbot!” wäre also “is”. Nun speichert der Bot diese Information in einer MySQL-Tabelle namens Brain.

Die sieht dann so aus:

id | value1 | value2 | validations | ip

1 | my name | phpchatbot | 0 | 127.0.0.1

Wenn der User nun fragt: “What is your name?”, sucht der Bot in seinem “Brain” nach “my name”, da er wieder nach “is” aufteilt, und gibt dann die Antwort aus: “my name is phpchatbot” (ACHTUNG: Ich suche immer noch nach einem Namen – Vorschläge bitte in die Kommentare ;) ). Wenn eine Konversation mal ins Stocken geraten ist (z.B. wenn der User einfach nur “yes” geantwortet hat), dann fragt der Chatbot “btw: is it right, that my name is phpchatbot?”). Ist die Antwort des Users, der natürlich eine andere IP haben muss als der Aufsteller der Behauptung, positiv, dann wird die variable validation +1 gesetzt. Ist sie negativ wird sie -1 gesetzt und wenn eine Behauptung zweimal negativ eingeschätzt wurde, dann wird sie gelöscht. Der Bot fragt übrigends immer zuerst die Behauptung mit den wenigsten validations.

Doch bei dieser Methode gibt es ein Problem: DIESE VERDAMMTEN DO-FRAGEN!!11einseinself

Do-Fragen sehen so aus “Do you go to school?”. Man sieht: Es gibt kein “Zuweisungswort”. Hier sieht es ja noch einfach aus: Der Bot müsste das erste Wort entfernen, das zweite als value1 einordnen und den Rest als value2. Doch was ist, wenn die Frage “Do your dad go to school?” ist: Das zweite Wort wäre “your”, obwohl das Subjekt auch noch das dritte Wort umfasst. Ich müsste also eine Datenbank voll mit englischen Subjekten anlegen, was, mit meinen Fähigkeiten und innerhalb dieses Zeitraums, unmöglich ist. Ich würde mich über Lösungsvorschläge freuen und bin gespannt, wie ich das Problem letztendlich lösen werde…

Leichter waren da schon die Matheaufgaben:

Zunächst habe ich eine Tabelle “cb_math_answers” angelegt und Sprüche wie “(MATH_QUESTION) makes (MATH_RESULT) according to Cocker ;)” reingepackt. Dann musste ich die Matheaufgaben ersteinmal herausfiltern. Dazu haben ich reguläre Ausdrücke verwendet:

~\d+(.\d+)?\s?[+*/-]\s?\d+(.\d+)?\s?=\s?\d+(.\d+)?~

Die “\s” garantieren, dass die Matheaufgabe auch erkannt wird, wenn der User Leerzeichen zwischen die Zahlen und Operatoren gesetzt hat. Um auch Dezimalzahlen erkennen zu können (natürlich mit dem englischen Punkt statt Komma), habe ich an die “/d” noch ein +(./d+) angehängt, dass aber wegen dem “?” nicht zwingend ist. Der Rest ist, denke ich, klar.

Bisher ungelöst: Die “ganz normalen” Sätze.

Was am einfachsten klingt, ist, für meinen Bot, am schwersten: Die “normalen” Sätze. Wie soll der Bot auf “I am going to school today” antworten? Es steckt keine Frage dahinter, keine Zuweisung – was nun?

Mein bisheriger Plan sieht so aus, dass der Bot diesen Satz, wenn er ihn nicht kennt, mit IP speichert, und an einer anderen Stelle im Gespräch mit einer anderen Person einfügt, wenn das Gespräch droht stecken zu bleiben (z.B. wenn der User einfach nur “Yes” antwortet.

Die ganze Aktion sieht so aus:

Diagramm Chatbot
Diagramm 1 Chatbot – Ich bitte die schlechte Qualität zu entschuldigen – unter Linux bin ich mit den Grafikprogrammen nicht so vertraut

Aber, wie gesagt – das ganze ist noch nicht eingebaut.

Write a Comment

Comment

  1. Netter Artikel, regt zum Denken an ;)
    Ich bin mir nicht sicher, ob jeder (insbesondere die Jury der CBC) die umgangssprachlich-geekige Redeart deines Bots so mag ^^
    Auf jeden Fall eine schwieriges Thema, dass du dir da ausgesucht hast und ich denke, wenn du keine großen Wörter-Datenbanken mit einbeziehen willst, wirst du irgendwann auf eine maximal Intelligenz stoßen, die deine Konkurrenten mit Datenbanken übertreffen können. Ich würde einfach mal googlen, ob es vlt. sogar eine offene API für sowas gibt.