Michael W.: eliza

hallo
http://www.javatop.de/scripte2/eliza.htm spricht für sich.

wie funktioniert eliza ?
Danke

  1. Hallo,

    wenn du mich fragst ist das einfach ein zufälliges aufscheinen verschiedener Texte. Es antwortet dauernd mit sinnlosem Geschwafel.

    $xNeTworKx.

    1. Bei mir war das anders.
      es hat sich richtig mit mir unterhalten !!

      1. hier hab ich einen richtigen eliza (sind zwar ein paar scriptfehler drin, die lassen sich aber einfach korrigieren)

        <!doctype html public "-//W3C//DTD HTML 4.0 //EN"> <html> <head>

        <title>Eliza</title>

        <script language="JavaScript"> <!--

        // Wird beim Laden aufgerufen. Initialisiert das Vokabular, gibt Standartmeldung aus // und gibt dem Editor den Focus.

        InitVocabular()   SayHello()   window.document.Eliza.talkedit.focus()

        // Initialisiert Vokabular

        function InitVocabular() {   LastReplyOn = ''";   Greetings = ['Guten Tag, mein Name ist Eliza. Wie geht es ihnen?',                'Guten Tag, ich bin Eliza. Wie fühlen sie sich?',                'Mein Name ist Eliza. Was ist ihr Problem?',                'Guten Tag, ich bin Eliza. Wie ist ihre momentane Verfassung?',                'Ich heisse Eliza. Haben sie Probleme?']   DontUnderstand = ['Könnten sie bitte etwas deutlicher reden.',                     'Lauter bitte!!!',                     'Ich habe sie akkustisch nicht verstanden.']   DontAsk = ['Lassen sie mich die Fragen stellen.']   Grammar = ['Können sie sich auch in ganzen Sätzen ausdrücken?']   DontRepeat = ['Sie wiederholen sich!','Das haben sie bereits gesagt!']   ComplexAnswerQ = ['Wissen sie, warum',                     'Ist es nicht etwas unnatürlich, dass',                     'Wollen sie sagen, dass',                     'Sie glauben wirklich, dass',                     'Sind sie sicher, dass']   ComplexAnswerA = ['Ich bezweifele stark, dass',                     'Es kann so nicht weitergehen, dass',                     'Ich verstehe nicht, warum',                     'Es ist doch nicht schlimm, dass']   Intressting = ['Interresant.',                  'Wirklich?',                  'Ist das der wahre Grund?']   DontScream = ['Warum schreien sie denn so???',                 'Beruhigen sie sich!',                 'Bleiben sie ruhig!']   Possesiv = /^MEIN\b|^DEIN\b|^MEINE\b|^DEINE\b|^MEINEN\b|^DEINEN\b|^MEINEM\b|^DEINEM\b|^SEIN\b|^SEINE\b|^SEINEN\b|^SEINEM\b|^IHR\b|^IHRE\b|^IHREN\b|^IHREM\b/   Keywords = [                [ [/^WESHALB\b|^WARUM\b|^WANN\b|^WIE\b|^WIESO\b|^WER\b|^WAS\b/],                  ['Lassen sie mich die Fragen stellen.'],1],                [ [/^VIELLEICHT\b|^JEIN\b/],                  ['Warum sind sie so unentschlossen?','Ja oder nein?',                   'Entscheiden sie sich!'],1],                [ [/^JA\b|^DOCH\b/],                  ['Erzählen sie mir mehr davon.'],1],                [ [/^GENAU\b|^FEIN\b|^GUT\b|^OKAY\b|^GUT\b/],                  ['Gut. Zurück zu ihrem Problem.'],1],                [ [/^NEIN\b|^NÖ+\b/],                  ['Warum sind sie so negativ?','Warum nicht?','Sicher?'],1],                [ [/^HAHA|^HA\b|^HIHI/],                  ['Warum lachen sie?'],1],                [ [/^WEIL\b/],                  ['Das ist ein Argument!','Das sehe ich ein.','Aha.',                   'Ja, ich verstehe.','So?'],1],                [ [/^BYE\b|^TSCHÜSS\b|^AUF WIEDERSEHEN\b|^BIS MORGEN\b/],                  ['Sie wollen doch nicht schon gehen?','Einen Augenblick noch.',                   'Sie können noch nicht gehen.','Wollen sie nicht noch bleiben?'],1],                [ [/^DARF ICH\b/],                  ['Nur zu.','Wenn sie wollen.','Tun sie sich keinen Zwang an.'],1],                [ [/^KANN ICH\b/],                  ['Wollen sie es denn können?','Vielleicht willst du es gar nicht?'],1],                [ [/^MUSS ICH\b/],                  ['Ich zwinge sie zu nichts.'],1],                [ [/^HALLO\b|^HI\b|^SERVUS\b|^GUTEN TAG\b/],                  ['Hallo.','Hi!','Guten Tag.'],1 ],                [ [/\bMEIN BRUDER\b|\bMEINE SCHWESTER\b|\bMEIN VATER\b/,                   /\bMEINE MUTTER\b|\bMEIN SOHN\b|\bMEINE TOCHTER\b/],                  ['Erzählen sie mir mehr von ihrer Familie.'],3 ],                [ [/\bCOMPUTER|\bMASCHINE/],                  ['Beunruhigen Maschinen dich?',                   'Glaubst du nicht, dass Maschinen den Menschen helfen können?'],2 ],                [ [/\bNIEMAND\b/],                  ['Sicher niemand?', 'Überhaupt keiner?'],2 ],                [ [/\bIMMER\b/],                  ['Wirklich immer?', 'Können sie mir ein Beispiel nennen?'],3 ],                [ [/\bTRAUM\b|\bTRÄUME\b/],                  ['Träumen sie oft?', 'Sind die Träume der Grund für ihre Probleme?'],1]              ] }

        // Lässt jemanden etwas sagen und löscht ggf. obere Zeilen

        function Say(Who, SayWhat) {   window.document.Eliza.elizachat.value =   window.document.Eliza.elizachat.value + '\n' + Who + ': ' + SayWhat   window.document.Eliza.talkedit.value = ''"   window.document.Eliza.talkedit.focus()   while (GetLines()>20)     { DeleteTopLine() } }

        // Lässt Eliza auf etwas antworten

        function Answer(ReplyOn) {

        // ggf. "Etwas lauter bitte!!!" o.ä. ausgeben

        if (ReplyOn == '')     return (Eliza(DontUnderstand[Math.floor(Math.random() * DontUnderstand.length)]))

        // ggf. "Warum schreien sie denn so???" o.ä. ausgeben

        if (ReplyOn == ReplyOn.toUpperCase())     return (Eliza(DontScream[Math.floor(Math.random() * DontScream.length)]))

        // Leerzeichen am Ende der Zeile löschen

        while (ReplyOn.charAt(ReplyOn.length-1) == ' ')     ReplyOn = ReplyOn.slice(0, ReplyOn.length-1)

        // Leerzeichen am Anfang der Zeile löschen

        while (ReplyOn.charAt(0) == ' ')     ReplyOn = ReplyOn.slice(1)

        // Meerfache Leerzeichen zwischen den Wörtern löschen

        while (ReplyOn.search(/  /) != -1)     ReplyOn = ReplyOn.replace(/  /,' ')

        // Fragezeichen?

        Question = 0

        if (ReplyOn.search(/[?]/) != -1)     Question = 1

        // Satzzeichen entfernen

        while (ReplyOn.search(/[!.,?;:]/) != -1)     ReplyOn = ReplyOn.replace(/[!.,?;:]/,'')

        // Wiederholung checken

        if (ReplyOn == LastReplyOn)     return (Eliza(DontRepeat[Math.floor(Math.random() * DontRepeat.length)]))

        LastReplyOn = ReplyOn

        // Keywords durchgehen und ggf. antworten

        for(i = 0; i <= Keywords.length-1; i++)     for(k = 0; k <= Keywords[i][0].length-1; k++)       if (ReplyOn.toUpperCase().search(Keywords[i][0][k]) != -1)         if (Math.floor(Math.random() * Keywords[i][2]) == 0)           return(Eliza(Keywords[i][1][Math.floor(Math.random()*Keywords[i][1].length)]))

        // ggf. "Lassen sie mich die Fragen stellen." ausgeben

        if (Question == 1)     return (Eliza(DontAsk[Math.floor(Math.random() * DontAsk.length)]))

        // In Wörter aufteilen

        temp = ReplyOn + ' '   words = []   while (temp.search(/ /) != -1)   {     words.push(temp.slice(0,temp.search(/ /)))     temp = temp.slice(temp.search(/ /)+1)   }

        // ggf. "Können sie sich auch in ganzen Sätzen ausdrücken?" ausgeben

        if (words.length == 1)     return (Eliza(Grammar[Math.floor(Math.random() * Grammar.length)]))

        // ggf. "Interessant" o.ä. ausgeben da Satz für komplexe Antwort zu kurz

        if (words.length == 2)     return (Eliza(Intressting[Math.floor(Math.random() * Intressting.length)]))

        //   /* Rountine für komplexe Antworten */   //

        // ggf. Subjekt kleinschreiben wenn Artikel

        if (words[0].toUpperCase() == 'ES')     words[0] = words[0].toLowerCase()   if (words[0].toUpperCase() == 'SIE')     words[0] = words[0].toLowerCase()   if (words[0].toUpperCase() == 'ER')     words[0] = words[0].toLowerCase()

        // Possesivpronomen kleinschreiben

        if (words[0].toUpperCase().search(Possesiv) != -1) {     words[0] = words[0].toLowerCase()   }

        if (words[0].toUpperCase() == 'ICH') {     if (words[1].toUpperCase() == 'MUSS') words[1] = 'müssen'; else     if (words[1].toUpperCase() == 'BIN') words[1] = 'sind'; else     if (words[1].toUpperCase() == 'DARF') words[1] = 'dürfen'; else     if (words[1].toUpperCase() == 'KANN') words[1] = 'können'; else     if (words[1].toUpperCase() == 'MAG') words[1] = 'mögen'; else     if (words[1].toUpperCase() == 'SOLL') words[1] = 'sollen'; else     if (words[1].toUpperCase() == 'WILL') words[1] = 'wollen'; else     if (words[1].toUpperCase().charAt(words[1].length-1) == 'E')       words[1] = words[1] + 'n';

        }

        if (words[0].toUpperCase() == 'DU') {     if (words[1].toUpperCase() == 'MUSST') words[1] = 'muss'; else     if (words[1].toUpperCase() == 'BIST') words[1] = 'bin'; else     if (words[1].toUpperCase() == 'HAST') words[1] = 'habe'; else     if (words[1].toUpperCase() == 'MAGST') words[1] = 'mag'; else     if (words[1].toUpperCase().charAt(words[1].length-2) == 'S')       if (words[1].toUpperCase().charAt(words[1].length-1) == 'T')         words[1] = words[1].slice(0,words[1].length-2)

        }

        for(i = 0; i <= words.length-1; i++)     {     if (words[i].toUpperCase() == 'MIR') words[i] = 'ihnen'; else     if (words[i].toUpperCase() == 'DIR') words[i] = 'mir'; else     if (words[i].toUpperCase() == 'ICH') words[i] = 'sie'; else     if (words[i].toUpperCase() == 'DU') words[i] = 'ich'; else     if (words[i].toUpperCase() == 'MEIN') words[i] = 'ihr'; else     if (words[i].toUpperCase() == 'DEIN') words[i] = 'mein'; else     if (words[i].toUpperCase() == 'MEINE') words[i] = 'ihre'; else     if (words[i].toUpperCase() == 'DEINE') words[i] = 'meine'; else     if (words[i].toUpperCase() == 'MEINEN') words[i] = 'ihren'; else     if (words[i].toUpperCase() == 'DEINEN') words[i] = 'meinen'; else     if (words[i].toUpperCase() == 'MEINEM') words[i] = 'ihrem'; else     if (words[i].toUpperCase() == 'DEINEM') words[i] = 'meinem'; else     if (words[i].toUpperCase() == 'DICH') words[i] = 'mich'; else     if (words[i].toUpperCase() == 'MICH') words[i] = 'sich'     }

        im nächsten posting gehts weiter

        1. so hier gehts weiter:

          if (words.length > 2) {
              if (words[2].toUpperCase() == 'ES')
                if (words[1].toUpperCase() == 'GEHT') {
                  s = words[2]
                  words[2] = words[0]
                  words[0] = s
                }
            }

          if (words[0].toUpperCase().search(Possesiv) != -1) {
              words[1] = words[0] + ' ' + words[1]
              words.shift()
            }

          MakeAnAnswer = 0
            if (Math.floor(Math.random() * 2) == 0)
              MakeAnAnswer = 1

          if (MakeAnAnswer == 0)
              s = ComplexAnswerQ[Math.floor(Math.random() * ComplexAnswerQ.length)] + ' ' +
                  words[0] + ' '
            else
              s = ComplexAnswerA[Math.floor(Math.random() * ComplexAnswerA.length)] + ' ' +
                  words[0] + ' '

          for(i = 2; i <= words.length-1; i++)
              {
                s = s + words[i] + ' '
              }

          if (MakeAnAnswer == 0)
              s = s + words[1] + '?'
            else
              s = s + words[1] + '!'

          Eliza(s)
          }

          // GetLines() liefert die angezeigte (!) Zeilenanzahl im Textfeld

          function GetLines()
          {
            temp = window.document.Eliza.elizachat.value + '\n'
            linescount = 0
            while (temp.search(/\n/) != -1)
            {
              linescount = linescount + Math.floor(temp.search(/\n/) / 70)
              temp = temp.slice(temp.search(/\n/)+1)
              linescount = linescount + 1
            }
            return (linescount)
          }

          // Gibt eine Eingabe des Patienten aus und lässt Eliza antworten

          function Patient(SayWhat)
          {

          Say('Du',SayWhat)
            Answer(SayWhat)
          }

          // Löscht die oberste virtuelle (!) Zeile

          function DeleteTopLine()
          {
            FirstBreakPos = window.document.Eliza.elizachat.value.search(/\n/);
            window.document.Eliza.elizachat.value =
            window.document.Eliza.elizachat.value.slice(FirstBreakPos+1)
          }

          // Gibt Standartmeldung aus (da erste Zeile kann Say nicht verwendet werden)

          function SayHello()
          {
            window.document.Eliza.elizachat.value = 'Eliza: '+
            Greetings[Math.floor(Math.random() * Greetings.length)];
          }

          // Lässt Eliza etwas sagen

          function Eliza(SayWhat)
          {
            Say('Eliza',SayWhat)
          }

          //-->

          </script>

          </head>

          <body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000"
          background="back.jpg">

          <center>

          <form name="Eliza" action="" method=post>

          <br>

          <textarea name="elizachat" cols="70" rows="20" wrap=physical></textarea><br>

          <br>

          <input type="Text" name="talkedit" size=60 maxlength=-1
            onKeyPress="if (event.which == 13) Patient(window.document.Eliza.talkedit.value)">

          <input type="Button" name="" value="Sagen" width="90"
            onClick="Patient(window.document.Eliza.talkedit.value)">
          </form>

          </center>

          </body>
          </html>

          dann mal fröhliche unterhaltung :-)

        2. Hallo,
          ausserdem, scheint der Macher dieser Seite genauso intelligent zu sein, wie seine Eliza. Die Seite funktioniert gerade mal im Internet Explorer. Ziemlich schwach meiner Meinung nach.

          $xNeTworKx.

  2. Wem bisher der spaß vorenthalten blieb, sich längere Zeit mit eliza zu "unterhalten", dem mag eliza tatsächlich halbwegs "inteligent" vorkommen. Tatsächlich analysiert eliza aber bloß die Syntax und reagiert auf bestimmte Wortmuster ( Hauptsächlich mit
    Fragen/Gegenfragen! ). Zusätzlich werden noch bestimmte personen bezogene Schlüsselwörter ("ich", "dein", "mir", ...)  durch ihr entsprechendes Gegenstück ersetzt.

    Nehmen wir zum Beispiel den Satz "Ich bin böse". eliza erkennt das Wortmuster "Ich bin". Dazu wählt es zufällig aus einer Liste ein passendes Antwortfragment, wie z.B. "BEZWEIFELST DU, [...] ZU SEIN?" oder "SEIT WANN BIST DU DENN [...]" und fügt alles was auf "Ich bin" folgte ein...

    Im Endeffekt ist eliza nur eine raffinierte, aber gar nicht so komplizierte Syntaxanalysator- und transformator. eliza sagt auch nie etzwas konkretes, sondern greift immer nur gesagtes auf / weicht mit gegenfragen aus.

    Es lohnt sich, mal etwas mehr Zeit in eine "Konversation" mit eliza zu stecken, dann merkt man schnell, wie weit es m,it den wirklichen fähigkeiten dieses Programmes ist.

    1. Hallo,

      Es lohnt sich, mal etwas mehr Zeit in eine "Konversation" mit eliza zu stecken, dann merkt man schnell, wie weit es m,it den wirklichen fähigkeiten dieses Programmes ist.

      Vor allem, wenn man beginnt, auf jede Frage eine Gegenfrage zu stellen, dann ist Eliza ziemlich rasch am Ende;-)

      AFAIK ist Eliza inzwischen schon eine rüstige Dame im Alter von 50 oder so. Sie sollte eigentlich den Turing-Test bestehen, was aber irgendwie nicht so ganz klappte.
      Trotzdem hat sie Weltruhm erworden, da einige Psychiater sich von ihr den Konversationsstil abgeschaut haben (oder war's doch umgekehrt *g*).

      Grüße
        Klaus

  3. hallo,

    ICH -> hallo
    SIE -> hi
    ICH -> erzähl mir etwas
    SIE -> erzähl mir etwas von deiner arbeit
    ICH -> nein ich meinte erzähl mir etwas von dir
    SIE -> erzähl mir etwas von deiner arbeit
    ICH -> ich möchte mehr über dich wissen
    SIE -> erzähl weiter

    ende des gesprächs, lol

    na ja, etwas verschlossen die kleine, aber ich könnte
    mich stndenlang mit ihr unterhalten :-)

    schöne grüße
    FICHTL

  4. Hi,

    wie funktioniert eliza ?

    warum interessiert es Dich, wie eliza funktioniert?

    Cheatah, SCNR

    P.S.: Eliza ist ein absoluter Klassiker, ein erster interaktiver Sprachprozessor. Schon auf dem C-64 habe ich Tage damit verbracht, die Gesprächsqualität zu verbessern :-)