Analyse von Chatbot-Beschreibungssprachen
Transcription
Analyse von Chatbot-Beschreibungssprachen
Philosophische Fakultät III Sprach-, Literatur- und Kulturwissenschaften Institut für Information und Medien, Sprache und Kultur (I:IMSK) Lehrstuhl für Informationswissenschaft Methoden der maschinellen Sprachverarbeitung INF-M 31 WS 2014/15 Leitung: PD Dr. Jürgen Reischer Analyse von Chatbot-Beschreibungssprachen AIML 2.0 im Vergleich zu ChatScript und Cleverscript Robert Jackermeier 1532623 Informationswissenschaft 2. Semester M.A. robert.jackermeier@stud.uni-regensburg.de Abgegeben am 15. April 2015 Inhaltsverzeichnis 1. Einleitung 3 2. AIML im Detail 2.1. Architektur und Funktionsweise eines AIML-Chatbots 2.2. AIML-Elemente . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1. Grundlegende Elemente . . . . . . . . . . . . . . 2.2.2. Pattern-Matching . . . . . . . . . . . . . . . . . . 2.2.3. Kontext . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4. Rekursion . . . . . . . . . . . . . . . . . . . . . . . 2.2.5. Sonstiges . . . . . . . . . . . . . . . . . . . . . . . 2.3. Neuerungen in AIML 2.0 . . . . . . . . . . . . . . . . . . 2.3.1. Erweitertes Matching . . . . . . . . . . . . . . . . 2.3.2. Sets und Maps . . . . . . . . . . . . . . . . . . . . 2.3.3. Schleifen . . . . . . . . . . . . . . . . . . . . . . . . 2.3.4. Einbindung externer Dienste . . . . . . . . . . . . 2.3.5. Aufruf von Gerätefunktionen . . . . . . . . . . . 2.3.6. Automatisches Lernen neuer Kategorien . . . . . 2.3.7. Plaintext-Format AIMLIF . . . . . . . . . . . . . 2.4. Evaluation und Limitationen . . . . . . . . . . . . . . . . 3. Alternative Chatbot-Beschreibungssprachen 3.1. ChatScript . . . . . . . . . . . . . . . . . . . 3.1.1. Funktionsweise . . . . . . . . . . . . 3.1.2. Features . . . . . . . . . . . . . . . . 3.2. Cleverscript . . . . . . . . . . . . . . . . . . 3.2.1. Funktionsweise . . . . . . . . . . . . 3.2.2. Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 4 5 5 6 7 8 8 9 10 11 12 12 13 15 15 . . . . . . 17 17 18 18 20 20 20 4. Vergleichende Evaluation 24 5. Fazit und Ausblick 25 Literatur 26 A. Parsen einer einfachen Grammatik in AIML 2.0 27 B. Wortzerlegung in AIML 2.0 28 Einleitung 3 1. Einleitung Im Projekt URTalking1 wird an der Universität Regensburg am Lehrstuhl für Informationswissenschaft ein Informationssystem für Erstsemesterstudenten entwickelt. Die Fragen der Studierenden sollen dort von einem Chatbot in natürlicher Sprache beantwortet werden. Als technische Grundlage dient im aktuellen Prototyp u. A. die Chatbot-Beschreibungssprache AIML. Derartige Sprachen müssen mehrere Anforderungen erfüllen: Zum Einen sollen sie viele Möglichkeiten bieten, auf unterschiedliche Benutzereingaben intelligent zu reagieren. Andererseits gilt es, diese Funktionalität möglichst so bereitzustellen, dass auf einfache Weise neue Chatbots geschaffen werden können. In dieser Arbeit werden mehrere Chatbotsprachen daraufhin untersucht, wie dieser Zielkonflikt gelöst wird. Das Hauptaugenmerk liegt dabei auf AIML 2.0, dem Nachfolger des im URtalking-Projekt verwendeten AIML. Im folgenden Abschnitt werden zuerst die Grundlagen von AIML genauer beschrieben, danach wird insbesondere auf die Neuerungen in Version 2.0 eingegangen. Anschließend werden mit ChatScript und Cleverscript zwei alternative Chatbot-Beschreibungssprachen vorgestellt und mit AIML 2.0 verglichen. 2. AIML im Detail Initiiert von Richard S. Wallace, wurde die erste XML-basierte Version von AIML in den Jahren 1995 bis 2000 entwickelt. Er beschreibt seine Motivation dafür folgendermaßen (Wallace, 2014a): The primary design goal of the original AIML language was simplicity. AIML is motivated by two observations: 1. Creating an original, believable chatbot character requires writing a significant amount of content, in the form of conversational replies. [...] 2. The people who are most suited to writing the bot content are not, by in large [sic], computer programmers. Those with literary backgrounds are more skilled at developing content for original characters. Daraus schließt er, dass ein Werkzeug geschaffen werden muss, das es technisch weniger versierten Personen ermöglicht, auf einfache Weise intelligente Chatbots zu erstellen. 1 http://urtalking.ur.de, abgerufen am 31.3.2015 AIML im Detail 4 Eng verbunden mit der Geschichte von AIML ist der Chatbot ALICE (Artificial Linguistic Internet Computer Entity), der mehrere erfolgreiche Teilnahmen im Loebner-Preis vorweisen kann. In diesem Wettbewerb treten jährlich Chatbots gegeneinander an und absolvieren einen Turing-Test. Die bisher noch nicht vergebene Goldmedaille ist für den Chatbot reserviert, der diesen Test besteht, d. h. dessen Antworten nicht von denen eines Menschen unterscheidbar sind. Zusätzlich wird jedoch jedes Jahr für den jeweils besten, also menschenähnlichsten, Chatbot die Bronzemedaille verliehen, die in den Jahren 2000, 2001 und 2004 an Richard Wallace mit ALICE ging (loebner.net, 2013). Im Folgenden wird zuerst der allgemeine Aufbau eines AIML-Bots gezeigt und ein grundlegender Satz an AIML-Sprachelementen vorgestellt. Anschließend werden die Neuerungen im Vergleich zur Vorgängerversion näher erläutert sowie evaluiert, inwiefern diese im Kontext des URTalking-Projekts Anwendung finden können. 2.1. Architektur und Funktionsweise eines AIML-Chatbots Die grundlegende Funktionsweise eines AIML-basierten Chatbots ist wie folgt: Vom Betreiber, dem sogenannten Botmaster, wird das Verhalten und das Wissen des Chatbots in einer bestimmten Syntax in AIML-Dateien definiert. Diese werden von einem AIML-Interpreter eingelesen und in eine intern genutzte Datenstruktur überführt, die ein schnelles Suchen nach der passenden Antwort ermöglicht. Der Interpreter bietet Schnittstellen an, mit denen der Benutzer interagieren kann; im einfachsten Fall erfolgt dies über Eingabe von Text, es ist jedoch auch Sprachein- und -ausgabe denkbar. AIML-Interpreter sind in vielen Programmiersprachen und in der Regel wie AIML selbst als freie Software verfügbar. Durch das Einbinden von Bibliotheken lässt sich AIML-Funktionalität in eigene Programme integrieren. Auf eine Auflistung aller erhältlichen Implementationen wird hier verzichtet, stattdessen sei auf die Webseite der ALICE AI Foundation verwiesen2 . 2.2. AIML-Elemente Nachdem der allgemeine Aufbau eines AIML-Chatbots bekannt ist, werden nun die wichtigsten Elemente der Sprache vorgestellt. Die dabei verwendeten Beispiele stammen zum Großteil aus der Spezifikation (Wallace, 2014a) oder den in ALICE verwendeten AIML-Dateien. Wo es nötig ist, werden sie durch eigene Beispiele ergänzt. 2 http://www.alicebot.org/downloads/programs.html, abgerufen am 31.3.2015 AIML im Detail 5 2.2.1. Grundlegende Elemente Die drei grundlegenden Elemente sind category, pattern und template (Wallace, 2003, S. 12). Mithilfe von categorys werden einzelne Frage-Antwort-Schemata definiert, innerhalb deren sich die pattern- und template-Elemente befinden. Matcht das Pattern auf die Eingabe des Benutzers, wird das dazugehörige Template verarbeitet. Listing 1 zeigt ein einfaches Beispiel für eine komplette AIML-Datei, die aus zwei Kategorien besteht. Ein darauf basierender Chatbot würde die Eingabe „HI“ (oder auch „Hi!“ und „hi“, Groß- und Kleinschreibung sowie Interpunktion werden nicht beachtet) mit „Hello.“ beantworten und analog dazu „Bye“ (sowie dessen Varianten) mit „Goodbye.“ <?xml version="1.0" encoding="UTF-8"?> <aiml> <category> <pattern>HI</pattern> <template>Hello.</template> </category> <category> <pattern>BYE</pattern> <template>Goodbye.</template> </category> </aiml> Listing 1: Grundlegende AIML-Elemente: category, pattern und template 2.2.2. Pattern-Matching Für das Pattern-Matching stehen in AIML 1.0 die Wildcards _ und * zur Verfügung. Beide können dazu benutzt werden, eines oder mehrere Wörter zu matchen. Der Unterschied liegt in der Priorität: _ hat Vorrang vor allen anderen Wörtern, während * nur dann matcht, wenn kein anderes Template passt. Das folgende Beispiel ist etwas konstruiert und würde in einem echten Chatbot wenig Sinn ergeben, verdeutlicht aber die Funktionsweise der Wildcards: <category> <pattern>HI _</pattern> <template>Hello.</template> </category> <category> <pattern>HI THERE</pattern> <template>Hello.</template> </category> <category> AIML im Detail 6 <pattern>HI *</pattern> <template>Hello.</template> </category> Listing 2: Pattern-Matching mit _ und * Von den drei Patterns HI _, HI THERE und HI * wird bei jeder Eingabe, die mit „Hi“ beginnt und eines oder mehrere darauf folgende Wörter enthält, aufgrund der Priorität von _ das erste gewählt. Selbst bei Eingabe von „Hi there“, also einer buchstäblichen Übereinstimmung mit dem zweiten Pattern, ist dies der Fall. Wäre hingegen die erste Kategorie nicht vorhanden, würde die zweite genau auf „Hi there“ reagieren und die dritte Kategorie alle restlichen passenden Eingaben abfangen. Eine Erweiterung zum Pattern-Matching ist das star-Tag, mithilfe dessen auf die entsprechenden Stellen zugegriffen werden kann. Dadurch lässt sich beispielsweise in der Antwort des Chatbots ein Begriff aus der Anfrage des Benutzers wiederverwenden. Zudem wird diese Funktionalität benötigt, um Eingaben in Variablen speichern zu können. Im nachfolgenden Beispiel begrüßt der Chatbot den Benutzer nach der Eingabe von „Hi, my name is <Name des Benutzers>“ mit dessen Namen und speichert ihn in der Variable username. Außerdem wird gezeigt, wie mithilfe des index-Attributs im Falle von mehreren Wildcards gezielt auf einzelne davon zugegriffen werden kann; die Zählung beginnt dabei bei 1. <category> <pattern>HI MY NAME IS *</pattern> <template> Hello <set name="username"><star/></set>. </template> </category> <category> <pattern>IS A * AN *</pattern> <template> I don’t know if a <star index="1"/> is an <star index="2"/>. </template> </category> Listing 3: Zugriff auf Matching-Stellen mit star 2.2.3. Kontext Auf den aktuellen Kontext kann mithilfe der Tags that und topic zugegriffen werden. Dies erlaubt es, auf ein- und dieselbe Eingabe unterschiedliche Antworten auszugeben, abhängig von der zuvor getätigten Ausgabe oder dem aktuell gesetzten AIML im Detail 7 Thema der Konversation. Das Thema muss explizit gesetzt werden und ist standardmäßig *. that hingegen enthält immer die letzte Aussage des Chatbots und kann wie folgt eingesetzt werden: <category> <pattern>MOVIES</pattern> <template>Do you like movies?</template> </category> <category> <pattern>YES</pattern> <that>DO YOU LIKE MOVIES</that> <template>What is your favorite movie?</template> </category> <category> <pattern>YES</pattern> <template>Yes what?</template> </category> Listing 4: Zugriff auf den Kontext mit that Wird das Pattern MOVIES aktiviert, entweder durch direkte Eingabe oder durch Weiterleitung dorthin (siehe folgender Abschnitt), erfolgt seitens des Chatbots die Frage „Do you like movies?“. Antwortet der Benutzer darauf unmittelbar mit „Yes“, soll nachgefragt werden: „What is your favorite movie?“. Um dies zu bewerkstelligen, ist neben dem pattern- noch das that-Element vorhanden. Schließlich ist noch eine dritte Kategorie zu sehen, die über ein identisches Pattern, aber kein that verfügt. Dort ist that implizit *, d. h. sie wird immer dann als Rückfallkategorie verwendet, wenn es keine andere passende Kategorie gibt. 2.2.4. Rekursion Ein weiteres, sehr mächtiges Element ist srai. Es ist nicht genau definiert, wofür das „sr“ im Namen steht: als Möglichkeiten werden „Symbolic Reduction“, „Simple Recursion“, „Syntactic Rewrite“ oder „Stimulus-Response“ angeboten. Im Grunde genommen wird srai dazu verwendet, den Pattern-Matching-Vorgang erneut zu durchlaufen, wobei die zu matchende Eingabe selbst definiert werden kann. Ein häufig auftretender Anwendungsfall ist das Auflösen von Synonymen. Will man auf mehrere verschiedene Eingaben gleich antworten, so bietet es sich an, die tatsächliche Ausgabe des Chatbots nur ein einziges Mal zu definieren, und in allen anderen Kategorien dorthin zu verweisen. Listing 5 zeigt dies an einem einfachen Beispiel, wo für zwei verschiedene Begrüßungen schlussendlich das gleiche Template ausgeführt wird. AIML im Detail 8 <category> <pattern>HELLO</pattern> <template>Hi there!</template> </category> <category> <pattern>HI</pattern> <template><srai>HELLO</srai></template> </category> Listing 5: Das srai-Tag Oft tritt der Fall auf, dass das mittels Wildcard gematchte Wort erneut durch das Pattern-Matching geschickt werden soll. Als Kurzschreibweise für <srai> <star/> </srai> ist daher <sr/> verfügbar. 2.2.5. Sonstiges Neben den anhand von Codebeispielen vorgestellten Elementen gibt es noch viele weitere, von denen einige an dieser Stelle kurz erwähnt werden, um den Funktionsumfang von AIML zu verdeutlichen: • Mithilfe von set und get können Werte in benannten Variablen gespeichert und wieder ausgelesen werden. • Das condition-Tag ermöglicht es, Bedingungen abzufragen und Verzweigungen zu implementieren, ähnlich einem if-else-Konstrukt. • Um eine Antwort zufällig aus einer Liste von mehreren Möglichkeiten zu wählen, kann das random-Tag verwendet werden. • Mithilfe von system lassen sich externe Befehle oder Programme ausführen und deren Ausgaben einbinden. 2.3. Neuerungen in AIML 2.0 Die Spezifikation zu AIML 2.0 wurde noch nicht verabschiedet, sondern existiert bisher nur als Working Draft in der Revision 1.0.2.22 vom 9. März 2014 (Wallace, 2014a). Das erklärte Ziel ist es, die Defizite von AIML 1.0 zu beheben, aber trotzdem dessen Einfachheit zu bewahren. Zu diesem Zweck gibt es diverse neue Features, die im Folgenden einzeln vorgestellt werden. AIML im Detail 9 2.3.1. Erweitertes Matching Eine der wichtigsten Verbesserungen betrifft das Pattern-Matching. Neben den bereits vorgestellten Wildcards _ und * stehen nun zusätzlich # und ˆ zur Verfügung. Diese matchen auf 0-N Wörter und ermöglichen somit kompaktere Schreibweisen von häufig genutzten Matching-Regeln. Will man etwa auf alle Eingaben reagieren, in denen das Wort „movies“ enthalten ist, lässt sich dies nun mit einem einzelnen Pattern bewerkstelligen (Listing 6, erste Kategorie). Zuvor waren dafür mangels 0N-Wildcards mehrere Patterns nötig, um auch die Fälle abzufangen, in denen das Wort am Anfang oder Ende des Satzes steht (restliche Kategorien in Listing 6). <category> <pattern>^ MOVIES ^</pattern> <template>Do you like movies?</template> </category> <category> <pattern>_ MOVIES</pattern> <template>Do you like movies?</template> </category> <category> <pattern>MOVIES *</pattern> <template>Do you like movies?</template> </category> <category> <pattern>_ MOVIES *</pattern> <template>Do you like movies?</template> </category> Listing 6: Neue Matching-Operatoren Die komplette Rangfolge der Matching-Operatoren, sortiert nach absteigender Priorität, lautet nun wie folgt: #, _, exakter Treffer, ˆ, *. Zudem kann ein vorangestelltes $ verwendet werden, um einem Pattern höchste Priorität zu geben. Im folgenden Beispiel (Listing 7) wird die erste Kategorie dazu benutzt, die Anrede „ALICE“ am Satzende zu entfernen, während der restliche Satz mithilfe von sr erneut verarbeitet wird. In einigen Fällen ist dies allerdings unerwünscht, etwa bei der Frage „Who is ALICE?“, die ansonsten zu „Who is“ verkürzt werden würde. Dafür wird nun eine eigene Kategorie definiert, der mit dem Dollar-Symbol der Vorrang gegenüber der allgemeinen Regel gegeben wird. <category> <pattern>_ ALICE</pattern> <template><sr /></template> AIML im Detail 10 </category> <category> <pattern>$WHO IS ALICE</pattern> <template>I am Alice.</template> </category> Listing 7: Der Dollar-Operator erzwingt höchste Priorität 2.3.2. Sets und Maps In AIML 1.0 ist es recht umständlich, einem Chatbot große Mengen an Wissen beizubringen. Die einzige Möglichkeit dafür ist, für jedes einzelne Datum eine eigene Kategorie samt Pattern und Template anzulegen, was sehr schnell zu unübersichtlichem und redundantem Code führt. Die in Version 2.0 eingeführten Sets und Maps (Wallace, 2014b) dienen dazu, derartiges Wissen aus externen Dateien einzubinden. Bei Sets handelt es sich um Mengen von Objekten, die in der eingebundenen Datei zeilenweise als Plaintext hinterlegt sind. Das folgende Beispiel (Listing 8) zeigt die Benutzung eines Sets, in diesem Fall anhand einer Liste von Vogelarten. Mithilfe des set-Tags wird per Dateiname im Pattern auf das Set zugegriffen. Im Falle eines Treffers kann dieser dann im Template mit dem bereits bekannten star-Tag eingebunden werden. Sets und Maps haben beim Pattern-Matching eine höhere Priorität als ˆ und *, die restlichen Operatoren (inklusive dem exakten Treffer) haben jedoch Vorrang. Maps enthalten Zuordnungen von einem Begriff zum einem anderen, im vorliegenden Beispiel etwa eine Liste von Ländern und deren Hauptstädten (Listing 8 unten). Insbesondere in Verbindung mit Sets ergibt sich eine mächtige Möglichkeit, sehr viel Wissen und eine große Menge an Interaktionen mit dem Chatbot auf kleinem Raum zu definieren. In AIML 1.0 hätte, um dieselbe Funktionalität zu erreichen, für jeden einzelnen Eintrag eine eigene Kategorie erstellt werden müssen. <category> <pattern>IS A <set>bird</set> A BIRD</pattern> <template>Yes, a <star/> is a bird.</template> </category> <category> <pattern>IS A * A BIRD</pattern> <template>Probably not. At least it’s not in my ←list.</template> </category> <category> <pattern>What is the capital of <set>nation</set></pattern> AIML im Detail 11 <template> <map name="nation2capital"><star/></map> </template> </category> Listing 8: Sets und Maps in AIML 2.0 Doch nicht nur reines Weltwissen lässt sich so einbinden: Die aktuelle Version des ALICE-Bots verfügt über diverse Maps, die zur Generierung von natürlicher Sprache dienen. So enthält beispielsweise be2is eine Zuordnung von der Infinitivform einiger häufig vorkommender Verben zur 3. Person Präsens. Im AIML-2.0-Interpreter selbst integriert sind einige Sets und Maps, die mit der Verarbeitung von Zahlen zusammenhängen und nicht sinnvollerweise ausgelagert werden können: Das Set number enthält alle natürlichen Zahlen, während mit der Map successor jeweils auf die nächsthöhere Zahl zugegriffen werden kann. 2.3.3. Schleifen Als erweiterte Möglichkeit, in den Kontrollfluss einzugreifen, wurden in AIML 2.0 mit dem loop-Tag explizite Schleifen eingeführt. Die Syntax ist etwas unkonventionell; vom Konzept her handelt es sich dabei um eine Mischung aus Do-While-Schleife und Go-To-Anweisung. Listing 9 zeigt ein prinzipiell einfaches Beispiel, das auf die Anfrage „Count to x“ (mit x als natürlicher Zahl) die Zahlen von Null bis x ausgibt. Wie zu erkennen ist, wird bereits für diese simple Aufgabe eine Menge an Code benötigt. <category> <pattern>COUNT TO <set>number</set></pattern> <template> <think><set name="count">0</set></think> <condition name="count"> <li><value><star/></value></li> <li> <set name="count"> <map> <name>successor</name> <get name="count"/> </map> </set> <loop/> </li> </condition> </template> AIML im Detail 12 </category> Listing 9: Schleifen mit loop Im Pattern wird das soeben erwähnte Set number verwendet, um auf natürliche Zahlen zu matchen. Im Template wird zuerst die Variable count auf Null initialisiert. Dies geschieht innerhalb von think-Tags, um die Ausgabe zu unterdrücken. Es folgt die condition, in der die Abbruchbedingung (erstes li) ist, dass der Wert von count mit der eingegebenen Zahl (zugreifbar via star) übereinstimmt. Ist dies nicht der Fall, wird im zweiten Zweig count mithilfe der Map successor auf die nächsthöhere Zahl gesetzt und ausgegeben. Das nun folgende Schlüsselwort loop sorgt dafür, dass die Bedingung erneut geprüft wird. Dies geschieht so oft, bis schließlich einmal die Abbruchbedingung erreicht wird und die Ausführung des Templates terminiert. 2.3.4. Einbindung externer Dienste Eine Erweiterung des srai-Elements bildet das neu geschaffene sraix-Tag. Analog zu seinem Vorgänger dient es dazu, Eingaben weiterzuleiten, in diesem Fall jedoch werden damit externe Quellen angebunden. So ist es denkbar, auf bestimmte Aufgaben spezialisierte Chatbots bereitzustellen, wie folgendes Beispiel eines Witze erzählenden Bots zeigt, der im Internet gehostet ist: <category> <pattern>TELL ME A JOKE</pattern> <template> <sraix bot="drwallace/jokebot" botid="c98daf062e345a88" host="callmom.pandorabots.com">JOKE</sraix> </template> </category> Listing 10: Anbindung eines externen Chatbots 2.3.5. Aufruf von Gerätefunktionen Ein besonderes Augenmerk wurde in AIML 2.0 auf den Einsatz in mobilen Geräten gelegt. Mithilfe sogenannter Out-of-Band-Tags können, sofern von der ClientAnwendung unterstützt, diverse Gerätefunktionen gesteuert werden. Listing 11 zeigt einige Beispiele hierfür. So lassen sich etwa externe Webseiten im Browser öffnen oder die WLAN-Verbindung an- und ausschalten. Durch diese Möglichkeiten kann die Funktionalität eines sprachbasierten Assistenzsystems, wie sie beispielsweise von Apples Siri bekannt ist, nachgebildet werden. AIML im Detail 13 <category> <pattern>WIKIPEDIA</pattern> <template> Opening Wikipedia. <oob><url>http://www.wikipedia.org</url></oob> </template> </category> <category> <pattern>WIFI OFF</pattern> <template> Turning off Wifi. <oob><wifi>off</wifi></oob> </template> </category> Listing 11: Aufruf von Gerätefunktionen 2.3.6. Automatisches Lernen neuer Kategorien Die meisten bisher vorgestellten Möglichkeiten von AIML lassen den Anspruch von „AI“, also künstlicher Intelligenz, vermissen. Nur durch Einpflegen von neuem Wissen durch den Botmaster kann der Chatbot dazulernen. Mithilfe des learn-Tags wird einfaches maschinelles Lernen möglich. Um die Funktionsweise zu veranschaulichen, bedarf es eines etwas ausführlicheren, im Vergleich zum tatsächlich in ALICE enthaltenen Code jedoch immer noch deutlich gekürzten, Beispiels: <category> <pattern>THE * IS <set>spatialprep</set> THE *</pattern> <template> <think> <set var="noun1"><star/></set> <set var="noun2"><star index="3"/></set> <set var="relation"><star index="2"/></set> <set var="pattern11">WHERE IS THE <get var="noun1"/></set> <set var="pattern12">WHERE CAN I FIND ^ <get ←var="noun1"/></set> <set var="response1">The <get var="noun1"/> is <get ←var="relation"/> the <get var="noun2"/>.</set> <set var="pattern2">IS THE <get var="noun1"/> <get ←var="relation"/> the <get var="noun2"/></set> <set var="response2">Yes</set> <set var="pattern3">IS THE <get var="noun1"/> * the <get ←var="noun2"/></set> AIML im Detail 14 <set var="response3">No. <get var="response1"/></set> </think> Ok. I think I got that. <learn> <category> <pattern><eval><get var="pattern11"/></eval></pattern> <template><eval><get var="response1"/></eval></template> </category> <category> <pattern><eval><get var="pattern12"/></eval></pattern> <template><eval><get var="response1"/></eval></template> </category> <category> <pattern><eval><get var="pattern2"/></eval></pattern> <template><eval><get var="response2"/></eval></template> </category> <category> <pattern><eval><get var="pattern3"/></eval></pattern> <template><eval><get var="response3"/></eval></template> </category> </learn> </template> </category> Listing 12: Automatisches Lernen Zweck dieser Kategorie ist es, die räumliche Relation zweier Objekte zu lernen. Im Pattern wird das Set spatialprep verwendet, in dem ortsbestimmende Präpositionen enthalten sind, sodass beispielsweise Sätze wie „The cat is behind the mouse.“ gefunden werden. Das Lernen findet in mehreren Schritten statt: Zuerst werden aus der Eingabe des Benutzers die benötigten Informationen extrahiert und in Variablen gespeichert, in diesem Fall noun1, noun2 und relation. Dann werden die neu zu erlernenden Patterns und die Antworten darauf definiert, unter Benutzung der soeben erstellten Variablen. Diese beiden Schritte finden innerhalb des think-Elements statt, um die Ausgabe von Text zu verhindern. Nach der tatsächlichen Antwort („Ok. I think I got that.“) folgt dann der eigentliche Lernvorgang, in dem innerhalb des learn-Elements neue Kategorien definiert werden. Wichtig ist hier die Benutzung von eval, wodurch der Inhalt der Variablen in die Patterns und Templates eingefügt wird. Nach diesen Schritten kennt der Chatbot vier neue Kategorien. Um beim Beispiel zu bleiben, antwortet er nun auf die Fragen „Where is the cat?“ und „Where can I find the cat?“ mit „The cat is behind the mouse.“ sowie auf „Is the cat behind the AIML im Detail 15 mouse?“ mit „Yes“ und auf „Is the cat near the mouse?“ mit „No“. 2.3.7. Plaintext-Format AIMLIF Ein im Verlauf dieser Arbeit bereits deutlich gewordener Nachteil von AIML ist der recht große Overhead an XML-Markup. Um diesem Problem entgegenzuwirken, wurde AIMLIF, das „AIML Intermediate Format“ entwickelt, das die hierarchische XML-Struktur so weit wie möglich in eine flache Tabellenstruktur überführt. Hierfür werden die pattern-, that- und topic-Tags sowie das template in eigene Spalten abgebildet. Die verbleibende Hierarchie innerhalb dieser Tags wird beibehalten und in die Tabellenzelle übernommen. Bei einfachen Chatbots sorgt dieses Format dafür, dass die Wissensbasis übersichtlich in einem Tabellenkalkulationsprogramm bearbeitet werden kann. Sind jedoch viele komplexe Templates enthalten, ist es hingegen kontraproduktiv, da deren komplette Hierarchie innerhalb jeweils einer Zelle zu finden ist, wodurch die visuelle Struktur komplett verloren geht. Weiterhin ist es der Lesbarkeit abträglich, dass im XML enthaltene Zeilenumbrüche durch #Newline und Kommas durch #Comma ersetzt werden. 2.4. Evaluation und Limitationen Trotz der erweiterten Pattern-Matching-Funktionalität gibt es auch in AIML 2.0 keine allgemeine Möglichkeit, Sätze zu parsen. Mithilfe von srai und Sets lassen sich zwar einfache Grammatiken nachbilden, abgesehen von sehr simplen Sätzen ist dies jedoch nicht praktikabel. Das größte Problem dabei ist die Art und Weise, wie sich die Wildcards verhalten: anstatt kombinatorisch alle Möglichkeiten durchzuprobieren, wird von der linken Seite aus versucht, möglichst wenige Wörter zu matchen. Lautet ein Pattern beispielsweise * *, so enthält die erste Wildcard bei Eingabe von zwei oder mehr Wörtern immer das erste Wort, während der Rest des Satzes in der zweiten landet. Somit ist es notwendig, in der Grammatik bereits beim obersten Element Kategorien für alle Satzlängen und -zusammensetzungen vorzusehen. Sofern es sich nicht um eine sehr simple Grammatik handelt, ist dies in der Regel unmöglich, da die Länge von Sätzen nicht beschränkt ist. AIML im Detail 16 Anhang A zeigt einen Versuch, die folgende Grammatik in AIML 2.0 abzubilden: S → NP VP NP → D N NP → N VP → V D → ’the’ | ’a’ N → ’Alice’ | ’Bob’ | ’girl’ | ’boy’ V → ’eats’ | ’sleeps’ Die ersten beiden Kategorien ohne Topic fangen die Eingabe ab und ermöglichen im Falle einer Satzlänge von zwei oder drei Wörtern einen genauen Zugriff auf die einzelnen Wörter. Durch Setzen der Topic-Variable werden Gruppen von Kategorien geschaffen, zu denen gezielt mittels srai gesprungen werden kann. Schlussendlich landet man immer in einer der Kategorien im topic „T“ (für Terminalsymbole), deren Patterns aus den Sets bestehen, die das dazugehörige Alphabet definieren. Wie soeben demonstriert, eignet sich AIML 2.0 nicht dazu, beliebige Grammatiken auf einfache Weise abzubilden. Auf Wortebene zeigen sich ähnliche Limitierungen. Dort ist es beispielsweise eine wünschenswerte Funktionalität, Wörter zu zerlegen, etwa um die Bestandteile eines Kompositums zu identifizieren oder aber, um ein Wort auf seine Stammform zu reduzieren. In Form des explode-Elements gibt es in AIML 2.0 eine integrierte Möglichkeit, Wörter in einzelne Buchstaben zu zerlegen. Mithilfe einer Schleife kann man darüber iterieren, wobei jeder Buchstabe wie ein eigenes Wort behandelt wird. Um die Limitierungen auszuloten, wurde testweise ein Verfahren implementiert, das bestimmt, um welche Art von Kompositum es sich bei einem eingegebenen Wort handelt, d. h. welche Kombination von Konfix und Radix vorliegt (Anhang B). Die Vorgehensweise ist dabei wie folgt: Das eingegebene Wort wird zunächst mittels explode in seine Buchstaben zerlegt. Danach wird die Länge des Wortes mithilfe der in ALICE enthaltenen Kategorie COUNTLETTERS * bestimmt. Es folgt ein Schleifenkonstrukt, in dem schrittweise von vorne die Buchstaben wieder zu einer Zeichenkette zusammengefügt werden, wobei bei jedem Schritt überprüft wird, ob beide Teile in vordefinierten Listen von Radixen und Konfixen enthalten sind. Die Beispiele sind dem im Kurs verwendeten Foliensatz (Reischer, 2013) entnommen. Als Ergebnis erhält man folgende Ausgabe: Human: split astrophysik Alternative Chatbot-Beschreibungssprachen 17 Robot: astro-physik Konfix Radix Eine Limitierung des Verfahrens ist, dass damit nur aus zwei Teilen bestehende Komposita erkannt werden können. Um mehrere Bestandteile verarbeiten zu können, ist eine erhebliche Erweiterung nötig. Weiterhin macht die automatische Normalisierung der Eingabe Probleme: Sobald beispielsweise ein freistehendes „u“ erkannt wird, wird es standardmäßig mit „you“ ersetzt. Dieses Verhalten kann freilich deaktiviert werden, zeigt aber, dass der Fokus von AIML nicht auf der Manipulation von Zeichenketten liegt. Wie die beiden Beispiele anschaulich zeigen, wird der eingangs beschriebene Anspruch der Einfachheit leider nur ansatzweise erfüllt. Es sind erhebliche Kenntnisse und viel kreatives Denken nötig, um prinzipiell recht einfache Konzepte in AIML 2.0 umzusetzen. Insbesondere die Implementierung von Schleifen erweist sich als äußerst umständlich und mitunter fehleranfällig. 3. Alternative Chatbot-Beschreibungssprachen Nachdem nun die Funktionen, Stärken und Schwächen von AIML 2.0 bekannt sind, werden zwei alternative Chatbot-Beschreibungssprachen vorgestellt und mit AIML verglichen. Es handelt sich dabei um ChatScript und Cleverscript, die aufgrund ihres mehrfachen erfolgreichen Einsatzes beim bereits angesprochenen Loebner-Wettbewerb ausgewählt wurden. Im Rahmen dieser Arbeit ist es nicht möglich, alle Features der jeweiligen Sprachen in aller Ausführlichkeit zu behandeln. Bei der Analyse werden deshalb vor allem die Mächtigkeit des Pattern-Matchings und die dort verwendeten Konzepte näher betrachtet. 3.1. ChatScript ChatScript3 ist eine frei verfügbare Chatbot-Beschreibungssprache, die aktuell in der Version 5.1 vom 1. Februar 2015 vorliegt. Sie bildete die Grundlage der LoebnerPreis-Gewinner in den Jahren 2010 und 2011 (loebner.net, 2013). Nach Aussage der Entwickler wurden beim Entwerfen von ChatScript mehrere Ziele ins Auge gefasst: kompakte Schreibweise, Geschwindigkeit, Größe, Funktionsumfang und Wartbarkeit (Brillig Understanding, Inc., o. J.). 3 http://chatscript.sourceforge.net Alternative Chatbot-Beschreibungssprachen 18 3.1.1. Funktionsweise Statt auf eine standardmäßige XML-Syntax (wie im Falle von AIML) setzt ChatScript auf ein eigens entwickeltes Format. Listing 13 zeigt dessen grundlegende Syntaxelemente: Es ist mindestens ein topic-Element nötig, das das Thema der Konversation festlegt. In diesem Beispiel folgt darauf mithilfe von t die erste Aussage, die der Chatbot von sich aus tätigt, ein sogenanntes gambit. In der letzten Zeile ist ein einfaches Frage-Antwort-Schema zu sehen, wo der Bot auf die Frage „What are you?“ mit „I am a bot.“ antwortet. topic: ~introduction [] t: Hello, talk to me! u: (what are you) I am a bot. Listing 13: Grundlegende ChatScript-Syntax Wie zu erkennen ist, wird durch den Wegfall von XML-Tags eine sehr kompakte Schreibweise ermöglicht; die folgenden Beispiele werden jedoch zeigen, dass dies nicht immer vorteilhaft für die Lesbarkeit des Codes ist. Als Quelle dient jeweils das offizielle ChatScript-Tutorial (Segal, 2011). 3.1.2. Features ChatScript verfügt über mächtige Matching-Regeln und -Operatoren, mit denen sich Alternativen, 0-N-Matches, Bedingungsabfragen und vieles mehr umsetzen lassen. Grundsätzlich finden als Vorverarbeitungsschritte eine Tokenisierung sowie eine Grundformreduktion der Benutzereingabe statt. Die wichtigsten Regeln werden nun kurz vorgestellt: Wildcards Die Wildcard * matcht grundsätzlich auf 0-N Wörter, dieser Bereich kann aber genauer spezifiert werden. Das nachfolgende Beispiel limitiert auf 0-2 Wörter, reagiert also auf Sätze wie „I like my cats“ oder „I like a yellow cat“. Durch Weglassen der Tilde kann auch eine genaue Anzahl an Wörtern festgelegt werden. u: (I like *~2 cat) Wildcards können auch innerhalb von Wörtern verwendet werden. * steht hier anstelle von 0-N Zeichen, während . durch genau ein Zeichen ersetzt werden muss. Mit einer vorangestellten Zahl kann die Länge des Wortes spezifiziert werden. Das nachfolgende Pattern matcht also u. A. auf die Eingaben „rewinding“, „refinding“ und „reminders“: Alternative Chatbot-Beschreibungssprachen 19 u: (9re.ind*) Alternativen Alternativen lassen sich mithilfe von eckigen Klammern definieren. Das folgende Muster passt also auf alle Eingaben, in denen eines der Wörter „what“ oder „where“ vorkommt: u: ([what where]) Concept Sets Eine vorangestellte Tilde veranlasst das Matching in einem sogenannten „concept set“. Ähnlich wie die Sets in AIML können auch hier zusammengehörige Objekte in einem einzelnen Element abgefragt werden. ChatScript liefert bereits eine große Anzahl an vordefinierten concept sets mit, wie etwa die im folgenden Beispiel verwendete Auflistung von Tierarten: u: (this ~animal) Zugriff auf Matching-Stellen Will man die Matching-Stelle weiterverwenden, kann ein Unterstrich vorangestellt werden. Der Zugriff erfolgt dann durch die nummerierten temporären Variablen _0, _1, etc. Um den Wert später wiederzuverwenden, kann er mithilfe eines Dollarsymbols in einer benannten Variable gespeichert werden. u: (I want to go to _*) OK, so you want to go to _0 . $destination = ’_0 Prüfen von Bedingungen Auch Bedingungen lassen sich unmittelbar beim PatternMatching prüfen. Das folgende Beispiel testet, ob die im concept set ˜number gefundene Zahl größer ist als 18, und liefert nur dann die dazugehörige Antwort. u: (I am _~number _0>18) You are of legal age. Sonstiges Neben den soeben vorgestellten Features bietet ChatScript noch einen erheblich größeren Funktionsumfang, der aber den Rahmen dieser Arbeit sprengen würde. Nicht näher beschrieben wurde unter Anderem die Möglichkeit von hierarchischen Konversationsstrukturen (sogenannte „rejoinders“) und der Wissensrepräsentation als Tripel („facts“). Alternative Chatbot-Beschreibungssprachen 20 3.2. Cleverscript Cleverscript ging aus der Vorgängersprache Jabberwacky hervor. Diese bildete die Grundlage für die Loebner-Preis-Gewinner in den Jahren 2005 und 2006 (loebner.net, 2013). Aktuell wird Cleverscript im Chatbot Cleverbot 4 sowie im reisenden Roboter Hitchbot 5 benutzt. Anders als die beiden zuvor vorgestellten Sprachen wird Cleverscript nicht als freie Software entwickelt. Um Chatbots im Produktivbetrieb auf Webseiten oder in Apps einzusetzen, müssen Gebühren entrichtet werden. 3.2.1. Funktionsweise Das Wissen bzw. das Verhalten des Chatbots wird in Cleverscript in Tabellenform repräsentiert. Dies erlaubt – ähnlich wie beim AIMLIF-Format – eine kompakte Darstellung ohne großen Overhead. Zudem kann Standard-Tabellenkalkulationssoftware zum Editieren der Wissensbasis verwendet werden. Tabelle 1 zeigt ein einfaches Beispiel für eine solche Datei. Der Chatbot begrüßt den Benutzer mit „Hi there, I’m your very first bot!“ und beantwortet jede Eingabe des Nutzers ebenso. Type output start Label welcome Description The first thing the bot will say. Text Hi there, I’m your very first bot! If Learn Goto Accuracy Tabelle 1: Cleverscript-Beispiel 3.2.2. Features Anhand einiger kurzer Beispiele wird nun der Funktionsumfang von Cleverscript gezeigt. Dadurch werden auch Bedeutung und Verwendung der in der obigen Tabelle bereits enthaltenen, teils aber noch unbenutzten Spalten erklärt. Alle Beispiele stammen aus dem Cleverscript-Handbuch (Existor Ltd., o. J.) und wurden teilweise zum besseren Verständnis angepasst. Pattern-Matching Auch Cleverscript verfügt über diverse Möglichkeiten, Eingabemuster des Benutzers zu erkennen. In Form der Spalte „Accuracy“ ist bereits 4 5 http://www.cleverbot.com, abgerufen am 31.3.2015 http://www.cleverscript.com/clients/hitchbot, abgerufen am 31.3.2015 Alternative Chatbot-Beschreibungssprachen 21 standardmäßig ein Mechanismus enthalten, der darauf abzielt, ungefähre Treffer zu erkennen, wodurch beispielsweise Tippfehler nicht explizit behandelt werden müssen. Der Wertebereich geht dabei von 0-100, wobei 100 einem exakten Treffer entspricht und eine Zeile mit Accuracy 0 auf jede Eingabe matcht. Wird nichts eingetragen, ist der Wert 75 voreingestellt. Leider ist unklar, wie diese Genauigkeit intern berechnet wird; um den jeweils idealen Wert zu finden, ist es daher möglicherweise nötig, durch Versuch und Irrtum mehrere Varianten zu testen. Type output start Label welcome input hello input output anything greet output sorry Description The first thing the bot will say. The user says hello Anything else The bot says hello back to the user. Bot apologises for not knowing what to say. Text Hi there! If Learn Goto Accuracy hello greet 75 anything Hello to you too. sorry 0 Sorry, I don’t have a response for that. Tabelle 2: Ein- und Ausgabe in Cleverscript Die Verknüpfung von Ein- und Ausgabe findet anhand von Bezeichnern statt, die in der Spalte „Label“ für jede Zeile definiert werden und zu denen durch einen Eintrag in der Spalte „Goto“ gesprungen werden kann. Phrasen Will man auf mehrere Eingaben mit der gleichen Antwort reagieren, können die entsprechenden Muster in jeweils eigenen Zeilen definiert werden. Alternativ existiert eine Kurzschreibweise, in der die Alternativen in einer einzigen Zeile, getrennt durch Schrägstriche, angegeben werden. Der folgende Chatbot (Tabelle 3) antwortet auf „Hello“, „Hi“, „Hey“ und „Hi there“ (sowie mehr oder weniger starke Variationen davon, da Accuracy auf 60 gesetzt ist) mit „Hello to you too.“ Mithilfe sogenannter „phrases“ lassen sich solche Mengen aus dem eigentlichen Matching-Muster auslagern und wiederverwenden, vergleichbar mit den aus AIML 2.0 bekannten Sets. Dies ermöglicht es, kombinatorisch Zusammensetzungen von Wörtern oder Sätzen zu finden, erspart Schreibarbeit und sorgt für übersichtlichere Bot-Definitionen. In der Tabelle werden Phrasen durch einen eigenen Typ gekenn- Alternative Chatbot-Beschreibungssprachen Type output start Label welcome input hello output greet Description The first thing the bot will say. User says hello The bot says hello back to the user. Text Hi there! 22 If Learn hello Goto Acc. greet 60 hi hey hi there Hello to you too. Tabelle 3: Mehrfach-Matching in Cleverscript zeichnet und mithilfe von doppelten runden Klammern in Matching-Muster eingebunden (siehe Tabelle 4). Type output start Label welcome input user_hello output phrase greet hello Description The first thing the bot will say. User says hello Bot replies Hello phrase Text Hi there! If ((hello)) Learn Goto Acc. greet 60 ((hello)) there Hello! hello / hi / hey Tabelle 4: Phrasen in Cleverscript Wildcards Auch in Cleverscript existieren verschiedene Wildcards: Die Tilde (˜) kann für beliebig lange Eingaben stehen, u. A. also mehrere Wörter umfassen oder aber auch mehrere Zeichen innerhalb eines Wortes matchen. Mit dem Unterstrich (_) hingegen wird immer genau ein Zeichen gematcht. Variablen Mithilfe der „Learn“-Spalte lassen sich Werte zur späteren Verwendung in Variablen speichern. Dies kann mit Phrasen kombiniert werden, um auf verschiedene Eingaben passend zu reagieren. Im folgenden Beispiel (Tabelle 5) ist zu sehen, Alternative Chatbot-Beschreibungssprachen 23 wie je nach Begrüßung des Benutzers ein unterschiedlicher Wert für die Variable friendly gesetzt wird. Type output start Label welcome input hello output thanks Description The first thing the bot will say. User says hello Bot replies phrase hello Hello phrase Text Hi there! If Learn ((hello)) Hmm, thanks. hi hello go away Goto Acc. thanks 60 friendly=yes friendly=maybe friendly=no Tabelle 5: Variablen in Cleverscript Findet keine explizite Zuweisung statt, so wird automatisch der Wert aus der TextSpalte in der Variable gespeichert. In der Learn-Spalte werden auch mathematische Berechnungen unterstützt, sodass man beispielsweise durch count+=1 einen Zähler erhöhen kann. Der Zugriff auf Variablen zur Ausgabe als Text erfolgt durch das Umschließen mit Dollar-Symbolen, im obigen Beispiel also $friendly$. Bedingungen Die letzte verbleibende Spalte „If“ dient zum Abfragen von Bedingungen. Im einfachsten Fall wird hier der Wert einer Variablen mit verschiedenen Alternativen verglichen (vgl. Tabelle 6). Es sind jedoch auch komplexere Ausdrücke möglich, in denen einzelne Bedingungen mit and oder or verknüpft werden. Type output start input output phrase Label welcome hello greet hello Desc. Text Hi there! ((hello)) Hi! Hello there. What’s up? hi / hello / hey If Learn greeting=hello greeting=hi greeting=hey Tabelle 6: Bedingungen in Cleverscript greeting Goto Acc. greet 30 Vergleichende Evaluation 24 Sonstiges Wie bereits angedeutet, bildet der soeben beschriebene Funktionsumfang nur einen Bruchteil der Möglichkeiten von Cleverscript. Nicht näher besprochen wurden beispielsweise Arrays, parametrisierte Phrasen und Eingabefilter. 4. Vergleichende Evaluation Abschließend werden nun die drei vorgestellten Chatbot-Beschreibungssprachen anhand ihres Featureumfangs vergleichend evaluiert. Dadurch werden Gemeinsamkeiten und Unterschiede sowie die jeweiligen Einsatzmöglichkeiten deutlich. Die Featurematrix (Tabelle 7) gibt einen schnellen Überblick über die in jeder drei Sprachen verfügbaren Möglichkeiten. Pattern-Matching: auf Wortebene auf Buchstabenebene ungefähre Treffer Grundformreduktion Bedingungen Schleifen Variablen Einbindung externen Wissens Lernen neuer Fakten Out-Of-Band-Kommunikation AIML 2.0 ChatScript Cleverscript Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø - Tabelle 7: Featurematrix ChatScript überzeugt im Vergleich vor allem durch sein Pattern-Matching-System, das bis auf Buchstabenebene hinabreicht. In den anderen beiden Sprachen ist standardmäßig jeweils nur das Matching von ganzen Wörtern möglich. Cleverscript hat als einzige Sprache ein Fuzzy-Matching integriert, mit dem auf einfache Weise ungefähre Treffer gefunden werden können, während nur ChatScript automatisch eine Grundformreduktion der Benutzereingabe vornimmt. Andere Features wie Bedingungen, Schleifen und Variablen, die aus klassischen Programmiersprachen bekannt sind, werden überall unterstützt. Je nach Sprache sind die dabei genutzten Konstrukte mehr oder weniger eingängig. AIML 2.0 und ChatScript verfügen über explizite Tags bzw. Schlüsselwörter wie condition, if oder loop. In Cleverscript wird das Verhalten über die „If“- und „GoTo“-Spalten in Verbindung mit dem Setzen von Variablen umgesetzt. Externes Wissen kann in AIML 2.0 und ChatScript im Form von Sets und Maps Fazit und Ausblick 25 bzw. facts eingebunden werden. Cleverscript verfügt über keine derartige Möglichkeit, sodass die Wissensbasis gemeinsam mit dem Verhalten des Bots definiert werden muss. Wiederum in allen Sprachen enthalten ist die Funktion, neues Wissen zur späteren Verwendung zu erlernen. Die Konzepte unterscheiden sich: AIMLs Ansatz wurde bereits oben in einem Beispiel gezeigt und erfordert viel Schreibaufwand. In den anderen beiden Sprachen erfolgt dies vergleichsweise einfacher, etwa durch eine dedizierte „Learn“-Spalte in Cleverscript. Dank seiner Tabellenstruktur bietet Cleverscript die größte Übersichtlichkeit. Die Syntax in ChatScript ist zwar sehr präzise und kompakt, führt aber bei komplexeren Aufgaben zu schwer lesbarem Code. Ähnliches gilt für AIML, wo vor allem der Overhead an XML-Tags dafür verantwortlich ist. 5. Fazit und Ausblick Im Verlauf dieser Arbeit wurde deutlich, dass es unterschiedliche Ansätze gibt, was die konkrete Umsetzung einer Chatbot-Beschreibungssprache betrifft. Allen drei getesteten Sprachen gemein ist, dass zum effektiven Benutzen, insbesondere für das Pattern-Matching, erst eine neue Syntax erlernt werden muss. Denkt man an die eingangs erwähnte Motivation von Richard Wallace, dass AIML dazu dienen soll, dass auch Laien intelligente Chatbots erschaffen können, so wurde dieses Ziel eindeutig noch nicht erreicht. Selbst um nur einen kleinen Teil der Komplexität menschlicher Sprache nachzubilden, sind erhebliches Wissen und ein sehr hoher Aufwand nötig. Das Bestehen des Turing-Tests mit dieser Technologie steht also wohl noch in einiger Ferne, für das im URTalking-Projekt angestrebte Ziel eines Auskunftssystems sind die Sprachen aber durchaus geeignet. Es lässt sich jedoch zusammenfassend sagen, dass eine Chatbot-Beschreibungssprache, die auch mit sehr großen Wissensmengen und Interaktionsmöglichkeiten skaliert und trotzdem leicht zu bedienen ist, erst noch erfunden werden muss. Literatur Brillig Understanding, Inc. (o. J.). ChatScript is an open-source natural language engine. Zugriff am 31.3.2015 auf http://brilligunderstanding.com/ technology.html Existor Ltd. (o. J.). Cleverscript Manual. Zugriff am 31.3.2015 auf http://www .cleverscript.com/CSL/CleverScriptManual.pdf loebner.net. (2013). Home Page of The Loebner Prize. Zugriff am 31.3.2015 auf http://www.loebner.net/Prizef/loebner-prize.html Reischer, J. (2013). Morphologie: Wortprägung und Wortbildung [Foliensatz]. Segal, E. (2011). ChatScript Tutorial. Zugriff am 31.3.2015 auf http://chatscript .sourceforge.net/Documentation/ChatScript_Tutorial.pdf Wallace, R. S. (2003). The elements of AIML style. Alice AI Foundation, Inc. Wallace, R. S. (2014a). AIML 2.0 Working Draft. Zugriff am 18.3.2015 auf https://docs.google.com/document/d/1wNT25hJRyupcG51aO89UcQEiG -HkXRXusukADpFnDs4/pub Wallace, R. S. (2014b). AIML - Sets and Maps in AIML 2.0. Zugriff am 18.3.2015 auf https://docs.google.com/document/d/ 1DWHiOOcda58CflDZ0Wsm1CgP3Es6dpicb4MBbbpwzEk/pub Parsen einer einfachen Grammatik in AIML 2.0 27 A. Parsen einer einfachen Grammatik in AIML 2.0 <?xml version="1.0" encoding="UTF-8"?> <aiml> <category> <pattern>PARSE * *</pattern> <template> S(2) -> NP(1) VP(1) <srai> <think><set name="topic">NP</set></think><star/> </srai> <srai> ←<think><set name="topic">VP</set></think><star index="2"/> </srai> </template> </category> <category> <pattern>PARSE * * *</pattern> <template> S(3) -> NP(2) VP(1) <srai> <think><set name="topic">NP</set></think><star/> <star ←index="2"/> </srai> <srai> <think><set ←name="topic">VP</set></think><star index="3"/> </srai> </template> </category> <topic name="NP"> <category> <pattern><set>d</set> <set>n</set></pattern> <template> NP -> D N <srai><think><set name="topic">T</set></think><star/></srai> ←<srai><think><set name="topic">T</set></think><star index="2"/></srai> </template> </category> <category> <pattern><set>n</set></pattern> <template> NP -> N <srai><think><set name="topic">T</set></think><star/></srai> </template> </category> </topic> <topic name="VP"> <category> <pattern><set>v</set></pattern> <template> VP -> V Wortzerlegung in AIML 2.0 <srai><think><set name="topic">T</set></think><star/></srai> </template> </category> </topic> <topic name="T"> <category> <pattern><set>v</set></pattern> <template>V</template> </category> <category> <pattern><set>d</set></pattern> <template>D</template> </category> <category> <pattern><set>n</set></pattern> <template>N</template> </category> </topic> </aiml> Listing 14: Parsen einer einfachen Grammatik in AIML 2.0 B. Wortzerlegung in AIML 2.0 <?xml version="1.0" encoding="UTF-8"?> <aiml> <category> <pattern>SPLIT *</pattern> <template> <think> <set name="count">1</set> <set name="letters"><explode><star/></explode></set> <set name="inputlength"><srai>COUNTLETTERS <star/></srai></set> <set name="firstpart"></set> </think> <condition> <li> <name>count</name><value><map><name>successor</name><get ←name="inputlength"/></map></value> </li> <li> <think> 28 Wortzerlegung in AIML 2.0 29 <set name="count"><map><name>successor</name><get ←name="count"/></map></set> <set name="letters"><srai>REMAININGLETTERS <get ←name="letters"/></srai></set> </think> <srai><get name="firstpart"/> <srai>IMPLODE <get ←name="letters"/></srai></srai> <loop/> </li> </condition> </template> </category> <category> <pattern>REMAININGLETTERS * *</pattern> <template> <think><set name="firstpart"><get name="firstpart"/><star /></set></think> <star index="2"/> </template> </category> <category> <pattern>REMAININGLETTERS *</pattern> <template> <think><set name="firstpart"><get name="firstpart"/><star /></set></think> undefined </template> </category> <category> <pattern>REMAININGLETTERS</pattern> <template>undefined</template> </category> <category> <pattern>IMPLODE *</pattern> <template><star/></template> </category> <category> <pattern>IMPLODE * *</pattern> <template><star/><srai>IMPLODE <star index="2"/></srai></template> </category> <category> <pattern>COUNTLETTERS *</pattern> <template> <think> Wortzerlegung in AIML 2.0 <set var="letters"><explode><star/></explode> end</set> <set var="count">0</set> </think> <condition> <li> <var>letters</var><value>end</value> <get var="count"/> </li> <li> <think> <set var="letters"><srai>REMAININGLETTERS <get ←var="letters"/></srai></set> <set var="count"><map><name>successor</name><get ←var="count"/></map></set> </think> <loop/> </li> </condition> </template> </category> <category> <pattern><set>radix</set> <set>konfix</set></pattern> <template> <star/>-<star index="2"/> Radix Konfix </template> </category> <category> <pattern><set>radix</set> <set>radix</set></pattern> <template> <star/>-<star index="2"/> Radix Radix </template> </category> <category> <pattern><set>konfix</set> <set>radix</set></pattern> <template> <star/>-<star index="2"/> Konfix Radix </template> </category> <category> <pattern><set>konfix</set> <set>konfix</set></pattern> <template> <star/>-<star index="2"/> 30 Wortzerlegung in AIML 2.0 Konfix Konfix </template> </category> <category> <pattern>* *</pattern> <template></template> </category> </aiml> Listing 15: Wortzerlegung in AIML 2.0 31