JavaScript - künstliche Intelligenz (17)

Die Erschaffung von künstlicher Intelligenz ist seit jeher ein Traum der Wissenschaft. Lustig wird es bei den ersten zaghaften Versuchen der KI. Programme wie "Doctor" oder "Eliza" entstammen dieser Phase. Besonders Eliza hat es zur Berühmtheit gebracht und wurde für praktisch jedes Computersystem umgesetzt. Für den ST existieren mindestens zwei Fassungen und der Ur-Sourcecode ist erhältlich.

Tatsächlich ist es mit der frühen KI nicht so weit her. Die Programme können generell nur das, was ihnen beigebracht wurde und lernen nicht dazu. Dies reicht aber - je nach Umfang -, um Menschen zu täuschen.

Die Computerpsychologin

Eliza ist die Simulation einer Psychologin und war darin so gut, das amerikanische Studenten tatsächlich dachten, sie würden sich mit einem echten Menschen unterhalten. Aber eigentlich macht das Programm nichts anderes, als den Benutzer zum Reden zu bringen und nur geringfügig darauf zu reagieren. Dies funktioniert auch sehr gut, solange der Benutzer das Programm ernst nimmt, denn Psychologen stehen ohnehin im Verdacht, nur Allgemeinsätze von sich zu geben, ohne wirklich auf ihren Patienten einzugehen. Da sich dieses Bild so schön festgesetzt hat, ist es kein unlösbares Problem, eine solche Psychologin zu simulieren.

Eliza kann in beschränktem Umfang auf den Benutzer eingehen. Sätze wie "I love you" werden verstanden und von der Psychologin in Gegenfragen umgemünzt. Ihre Aufgabe ist es, den Benutzer zum reden zu bringen, deshalb gibt es auch Sätze wie "Beschreiben sie ihre Gedanken weiter". Je mehr der Mensch selber schreibt, desto weniger muß die Psychologin tun und der Wortschatz von Eliza ist beschränkt. Zwangsläufig treten Wiederholungen auf, aber selbst diese können als natürlich empfunden werden.

Der Aufbau

Wie eben bereits beschrieben, kennt Eliza zwei Antworttypen: die Gegenfrage und die Aufforderung zu weiteren Gedanken.

Die Gegenfrage ist eine einfache Umformulierung einer Aussage. Dazu macht sich das Programm zunutze, das die englische Sprache in diesem sehr einfach aufgebaut ist. Der Aufwand, eine Aussage zu entschlüsseln hält sich deshalb in Grenzen. Dies ist auch der Grund, warum deutsche und französische Elizas schwerer zu finden sind.

Die Aufforderung vermittelt Verständnis und damit Eliza sich nicht zu häufig wiederholt, bekommt sie eine Reihe von Sätzen mitgeliefert.

Die Absicherung gegen unsinnige Eingaben ist recht schwer und deshalb sind nur zwei "Abwehrmechanismen" eingebaut. Als erstes werden Wiederholungen abgegangen. Manche Versionen von Eliza machen dies nicht und so läßt sich leicht ermitteln, wie "groß" deren Sprachschatz ist.

Ein weiterer Kommunikationskiller ist die Sprachlosigkeit. Wenn eine leere Antwort gegen wird, darf Eliza nicht mit "Das ist interessant" antworten. In diese Rubrik fällt auch die "Nein"-Antwort, die sich aber leicht mit "Warum nicht?" kontern läßt.

Damit dies alles nicht zu automatisch wirkt, sind Zufallsgeneratoren eingebaut.

Eliza in JavaScript

Die Umsetzung dieses Konzeptes ist eine ganz gute Zusammenfassung des JavaScript-Kurses, da einiges benötigt wird, um Eliza in das Browserfenster zu befördern. Die JavaScript-Version ist eine mehr oder weniger direkte Umsetzung von [1], auch wenn sich die Psychologin bei der Browser-Version nicht "freinimmt" und rund um die Uhr zu sprechen ist.

Damit die Psychologin überhaupt antworten kann, muß ein HTML-Grundgerüst mit Formularfeldern erstellt werden. Ohne Formularfelder geht nichts, jedenfalls nicht in JavaScript 1.1. Das Grundgerüst soll hier nicht näher behandelt werden, erstellen Sie einfach eine leere HTML-Datei und fügen Sie Listing 1 in den Bereich zwischen <BODY> und </BODY> ein.

Sprachbegabt

Das Script findet im HEAD-Bereich platz. Für den Anfang müssen die Sätze definiert werden, die Eliza benutzt, um das Gespräch weiter zu führen.

Beginnen wir mit den weiterführenden Fragen. Diese sind im Array s untergebracht:

s = new Array("Say, do you have any psychological problems?",
"What does that suggest to you?","I see.","I'm not sure 
I understand you fully.","Come come eludicate 
your thoughts.","Can you elaborate on that?",
"That is quite interesting.");

Diese Antworten gibt Eliza immer dann von sich, wenn sich der Patient nicht wiederholt, keine umformbare Behauptung aufstellt und keine leere Antwort von sich gibt. Um Eliza endgültig zum Sprachtalent zu machen, wird ihr noch ein zweites Set auf dem Weg gegeben:

s2 = new Array("Why do you feel that way?","Hmmm.... Is that so?",
"Tell me more about such feelings!","Go on, go on.",
"Does talking to me help?","Anything else?",
"Could you explain further?");

Die Unterteilung in zwei Arrays dient einzig und allein dazu, Eliza unberechenbarer zu machen. Das Programm wählt per Zufallsgenerator aus, welches Array benutzt und macht es dann erneut vom Zufall abhängig, welcher Satz ausgegeben wird.

Es folgt das Array, das "Wiederholungstäter" bestrafen soll:

r = new Array("Please don't repeat!",
"You've said that before - please give more information.");

Zugegeben, Eliza verhält sich in diesem Punkt ziemlich grob. Es steht Ihnen aber frei, die Sätze abzuändern.

n = new Array("I can only understand you if you give me the chance to.",
"I have time.","Don't be afraid of telling me your problems.",
"Have the courage of telling me what you think!",
"Don't be bashfull - talk to me.", "Please clean me.");

Das sind die Antworten, wenn nichts eingegeben wurde. Die letzte Antwort erscheint natürlich etwas unanständig, wenn Eliza als reale Person erscheinen soll...

Das sind die vorgefertigten Antworten, einfache Eliza-Varianten kennen nur diese. Würde sich Eliza komplett auf diesen "Sprachschatz" verlassen, wäre auch eine deutsche Version kein Problem, da Eliza fast egal sein könnte, was der Benutzer eingibt.

Funktionen

Als erstes gibt es die Funktion smb(), die beim Anwählen des Submit-Buttons aufgerufen wird und keine andere Aufgabe hat, als wiederum eine andere Funktion aufzurufen:

function smb() {
hinzufuegen();
return false;
}

Die Funktion hinzufuegen() erweitert das

function hinzufuegen() {
    NeuerEintrag = new Option(document.usereingabe.eingabe.value);
    document.usereingabe.Auswahl.
options[document.usereingabe.Auswahl.length] = NeuerEintrag;
    ant=eliza();
    if (ant!="") { Hinzu(ant); }
    document.usereingabe.eingabe.value = "";
}

Mit "new Option" wird das Formularfeld erweitert. Anschließend wird die Antwort von Eliza geholt und das Feld abermals erweitert. Das Eingebefeld wird gelöscht.

eliza()

In dieser Funktion wird die Hauptarbeit verrichtet. Zunächst nimmt a den Inhalt des Eingabefeldes auf.

Wenn ein einfache Verneinung gegeben wurde, fragt Eliza mit "Why not?" nach - aber nicht immer. Dafür sorgt der Zufallsgenerator. Da dieser krumme Zahlen (also z.B. 1,567478) ermittelt, wird mit Math.floor gerundet.

Die nächste Abfrage dient den Wiederholungen. In einem leeren, versteckten Formularfeld merkt sich Eliza das letzte eingegebene Wort. Die Eingabe darf nicht leer sein, denn eine Antwort wie "You've said that before" wirkt sehr seltsam, wenn der Benutzer nichts eingegeben hat (also schweigt).

Jetzt kommt der - etwas kümmerliche - Sprachparser zu Wort. Er analysiert Sätze und formt sie um:

I am an aeroplane => Why do you think you are an aeroplane?
I can't climb great heights => Why can't you climb great heights?
You hate me => Why should I hate you?

Der Parser kann auch auf Fälle reagieren, in denen der Patient Eliza anspricht. Die Funktion fuehlen() übernimmt die Umformung des Satzes, die im wesentlichen aus einigen Suche/Ersetzen-Anweisungen besteht.

Wenn eine Antwort gefunden wurde, wird zur Sicherheit noch der Punkt entfernt und ein Fragezeichen hinzugefügt.

Auch hier können einfach neue Fälle hinzugefügt werden.

Erst wenn bis dahin Eliza noch keine Antwort gefunden hat, bedient sie sich aus ihrem Standard-Wortschatz.

fuehlen()

Die Funktion fuehlen() enthält keine besonderen Kniffe. Die Eingabe des Benutzers ist mit ein paar Suche/Ersetzen-Operationen leicht in eine Frage umformuliert. Etwas irritierend mag zuerst sein, das "you" durch "Mxy" ersetzt wird. Dies wurde aber nur gemacht, um gefahrlos "me" durch "you" zu ersetzen. Anschließend wird noch "myself" durch "yourself" ersetzt.

Würde man Eliza in eine andere Sprache übersetzen, wären hier evtl. Anpassungen an die Grammatik notwendig.

Ist die Antwort von Eliza fertig, wird sie mit der Funktion hinzu() an das Formular geschickt:

function Hinzu(text)
  {
   NeuerEintrag = new Option(text);
   document.usereingabe.Auswahl.
options[document.usereingabe.Auswahl.length] = NeuerEintrag;
   document.usereingabe.eingabe.value = "";
  }

Abschließend

Mit diesem Teil soll der JavaScript-Kurs fürs erste beendet werden. In der nächsten Ausgabe wird es wahrscheinlich ein anderes Thema aus dem Bereich Web-Sprachen geben.

Listings zu diesem Artikel


Mia Jaap
Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]