Chatbox mit Delphi programmieren

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Wenn du schreibst "für die Schule", glaub ich nicht, dass das ne richtige KI werden soll oder? Wie lange sollt ihr denn dafür Zeit haben? Ne andere Möglichkeit als ne riesige Datenbank mit verschiedenen Verhaltensweisen im Zusammenhang mit den von dir bereits aufgezeigten Schlüsselwörtern würde mir da jetzt auchnicht einfallen.

      Grundsätzlich könntest du das mit Pos machen.

      Quellcode

      1. string := 'Hallo wie gehts?';
      2. int := pos('geht', string);
      3. if (int = 0) then //blabla was auch immer passieren soll wenn geht/Vater/nach was auch immer du suchen willst nicht gefunden wurde
      4. else //was passieren soll wenns gefunden wurde


      EDIT: String ist dabei ne Variable vom Typ string und int halt eine von integer. Dass man die nicht so nennen kann ist dir hoffentlich klar ;)

      pos(...) gibt übrigens immer die Stelle zurück an der dein gesuchtes Wort beginnt. In diesem Fall also 11. (wenn ich mich nicht verzählt hab ^^)
    • pLUt0n schrieb:


      II. Satzbauerkennung der schlichten Art (vgl. Sätze 2 und 3):
       ELIZA erkennt Sätze der Form „Ich habe <weitere Worte>“ und reagiert auf diese wie folgt: „Sie haben <die gleichen weiteren Worte>?“
       ELIZA erkennt Sätze der Form „Ich bin <weitere Worte>“ und reagiert auf diese wie folgt: „Sie sind <die gleichen weiteren Worte>?“
       ELIZA erkennt Sätze der Form „Ich will <weitere Worte>“ und reagiert auf diese wie folgt: „Sie wollen <die gleichen weiteren Worte>?“
       ELIZA erkennt Sätze der Form „Ich meine <weitere Worte>“ und reagiert auf diese wie folgt: „Sie meinen <die gleichen weiteren Worte>?“
       ELIZA erkennt Sätze der Form „Ich denke <weitere Worte>“ und reagiert auf diese wie folgt: „Sie denken <die gleichen weiteren Worte>?“


      Das kann man mit pos sicher machen. Ich weiß allerdings nicht, wie solche Chatbots normalerweise geschrieben werden und ob es da nicht elegantere Methoden gibt (gibt es sicherlich).

      Du kannst das wie folgt machen:

      writeln und readln kennst du hast du gesagt. Also beginnen wird ja alles mit der "Hallo. Wie geht es Ihnen?" Frage vom Bot. (Die du einfach mit writeln ausgibst). Danach liest du mit readln ein, was der Benutzer antwortet. Die Antwort speicherst du beispielsweise in die Variable "antwort" vom Typ String.
      Die Aufgabenstellung unter Punkt II. heißt "Satzbauerkennung". Ich würde also jetzt einfach 5 weitere Variablen vom Typ String erstellen (bzw einen Array vom Typ String) und diesen wie folgt belegen:

      Quellcode

      1. sbe[0] := ' habe';
      2. sbe[1] := ' bin';
      3. sbe[2] := ' will';
      4. sbe[3] := ' meine';
      5. sbe[4] := ' denke';


      Nachdem der Benutzer jetzt eine Antwort eingegeben hat, lässt du eine Schleife laufen: (Ich sag mal vorweg, dass ich länger nichtsmehr mit Delphi gemacht hab und deshalb die Syntax wahrscheinlich an einigen Stellen nicht 100% richtig ist ;))

      Quellcode

      1. var temp: Integer;
      2. var antwortende: String;
      3. while i < length(sbe) do begin
      4. temp := pos(sbe[i],antwort);
      5. if (temp <> 0) then begin
      6. antwortende := copy(antwort, temp, length(antwort)); //Was die Zeile macht: In "antwortende" wird der Teil der Antwort des Benutzers ab der Stelle wo das Schlüsselwort gefunden wurde und bis zum Ende der Antwort geschrieben.
      7. writeln('Sie '+sbe[i]+antwortende);
      8. end;
      9. end;


      Soviel zur Schleife zu Aufgabe II. Kannst das ganze auch in ne eigenständige Funktion machen wenn ihr das schon hattet, machts sicher übersichtlicher. Du kannst auch einfach den sbe Array größer machen und nochmehr Schlüsselwörter hinzufügen, sollte kein Problem sein. (Wie ich oben schon geschrieben hab weiß ich allerdings nicht, ob ich z.B. das writeln richtig gemacht hab ;))

      pLUt0n schrieb:


      III. Logische Schlüsselwörter (vgl. Sätze 4 und 5)
      Auf Benutzersätze, die mit „ja“ oder „nein“ beginnen, bittet ELIZA um Konkretisierung bzw. Reformulierung der Antwort.


      Das ist denkich einfach, wenn du bis hierher alles verstanden hast.
      Mach noch ein Array/schreibs einfach in sbe rein mit "ja" und "nein", such nach ja/nein mit pos (temp := pos('ja',antwort)), wenn ja oder nein gefunden wurde (if (temp <> 0)) dann sag dass es konkretisiert werden soll (writeln('Konkretisieren...'))

      pLUt0n schrieb:


      IV. Kontextbezogene Schlüsselwörter (vgl. Sätze 6 und 7)
      Deine ELIZA kennt (mindestens!) die familienbezogenen Schlüsselwörter „Vater“, „Mutter“, „Tochter“ und „Sohn“. Wenn eines dieser Wörter in einem Satz erscheint, bittet ELIZA darum, noch mehr von der Familie zu erzählen.


      Ebenfalls das Selbe. Nach den Schlüsselwörtern suchen und nach mehr von der Familie fragen wenns gefunden wurde.

      pLUt0n schrieb:


      V. Keine Regel anwendbar (vgl. Sätze 8 und 9)
      Wenn keine der oberen Regeln anwendbar ist, reagiert ELIZA mit einer von mindestens offenen Fragen. Um den Dialog möglichst lange abwechslungsreich zu gestalten, kennt ELIZA mindestens drei entsprechender offener Fragen, die es abwechselnd nutzt.


      Wenn nichts gefunden wurde (also: if (temp = 0)) dann denkste dir irgendwelche Fragen aus.



      Das solltest du jetzt verstehen. Wenn nicht, dann google n bisschen nach den von mir verwendeten Funktionen (copy, pos) und lies dir Erklärungen durch.

      Du kannst das Ganze mit Verzweigungen (case ... of) sehr gut machen. Ergänze einfach den von mir angelegten sbe-Array um "ja", "nein", "Mutter", "Vater" uswusw und schreib dann in der Funktion die ich oben gezeigt hab in die "if (temp <> 0)"-Abfrage:

      Quellcode

      1. case i of
      2. 0..4: begin
      3. antwortende := copy(antwort, temp, length(antwort));
      4. writeln('Sie '+sbe[i]+antwortende);
      5. end;
      6. 5, 6: writeln('Konkretisieren...');
      7. 7..10: writeln('Mehr über deine Familie...');


      und dann unten unter die "if temp..."-Abfrage einfach "else begin" und dann da deine ausgedachten Fragen zu Teil V. rein.



      Sooooooo das ist jetz eigentlich schon ne komplette Lösung. Das bisschen Nachdenken was noch übrig bleibt solltest du selbst machen.