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

Similar documents