14Natürliche Sprachen I
Lösungen
14.1Natürlichsprachliche Abfragen zu Datenbanken
Schreiben Sie ein einfaches ad hoc Front-End für natürlichsprachliche Abfragen zu relationalen Datenbanken. Als konkretes Beispiel können Sie Staaten (und Städte) in Europa nehmen, z.B.:
/* state( Name, Population, Area, Capital). */
state( switzerland, 6, 41, bern). /* etc. */
/* city( Name, In_state, Population */
city( zurich, switzerland, 0.5). /* etc. */
Folgende Abfragen sollten möglich sein:
- what is the capital of switzerland ?
- capital of switzerland is what ?
- capital of switzerland ?
- what is population of zurich ?
- . . .
Hinweise:
- Im Satz wird nur nach dem Pattern "PROPERTY of OBJECT" gesucht.
- Die Abfrage wird als Liste eingegeben:
?- query( [capital, of, switzerland], Q). => bern.
Lösung 14.1
14.2Tokenizer
Schreiben Sie einen Tokenizer, der aus einer Liste von Buchstaben eine Liste von Wörtern erzeugt, z.B.
?- tokenize( "the man arrived", L).
⇒ L = [ the, man, arrived]
Mit Hilfe von tokenize implementieren Sie eine interaktive Shell talk, die Sätze des Benutzers einliest, verarbeitet und das Resultat ausschreibt. Als Beispiel für die Verarbeitung wird der Satz wiederholt und dahinter die Anzahl Wörter geschrieben:
?- talk.
> the man arrived
the man arrived /3
> bla blabla
bla blabla /2
> bye
?- …
Hinweise:
- Das Zeichen ">" ist die Aufforderung des Computers, danach folgt die Benutzereingabe. bye beendet die talk Shell.
- Verwenden Sie das eingebaute Prädikat read_string( String), das eine Zeile in String einliest.
- talk ist durch eine failure-driven loop implementiert.
Lösung 14.2
14.3ELIZA
Simulieren Sie einen Psychiater nach der Art von ELIZA. Die folgende Konversation sollte möglich sein:
> i am very unhappy
How long have you been very unhappy ?
> six months.
Please go on.
> can you help me?
What makes you think I can help you ?
> you remind me of my father
Please tell me more about father .
> i like teasing father
Does anyone else in your family like teasing father ?
> no, only me
Please go on.
> bye
Goodby. I hope I have helped you.
Das Programm versucht die Eingabe mit Patterns (Templates) der Form
pattern( [i, am, 1], ['How long have you been', 1, ?])
zu matchen, um die passende Anwort zu finden. Die Zahl 1 ist ein Platzhalter, der für beliebig viele Wörter steht.