Dialog@Home

Ein Masterprojekt 2019/2020 der Universität Bremen

Digitaler Projekttag der Informatik 2020

Auf dieser Seite finden Sie Informationen über die Arbeiten im Projekt "Dialog@Home" in einem Video-Vortrag sowie aufbereitet als Text.

Video-Vortrag

Präsentation

Falls es Probleme mit der Präsentation gibt, kann diese auch alternativ hier gefunden werden.

Was ist das BAALL und wofür Dialog@Home

Bei dem Masterprojekt “Dialog@Home” handelt es sich um ein Informatik-Projekt, welches sich mit einer Dialog-Schnittstelle zum BAALL (dem Bremen Ambient Assisted Living Lab) beschäftigt. Übergeordentes Ziel ist es ein System zu erschaffen, dass Nutzer*innen des BAALLs, beziehungsweise einer Wohnung zum unterstützen Leben, ermöglicht, mittels Sprache die Wohnung zu steuern. Hierfür wurde ein Dialog-System erschaffen, dass die Steuerung der Elemente in der Wohnung, wie Lichter und Türen, auf Sprachebene abbildet.

Ziel des Master-Projektes

Das Bachelorprojekt 2018/2019 befasste sich damit neue Funktionen in das bereits bestehende System einzubauen. Das bestehende System konnte bereits eine Eingabe entgegen nehmen, erkennen und in eine maschinen-lesbare Form umsetzen. Anhand dieser maschinen-lesbaren Form konnte dann eine Graphdatenbank manipuliert und so der geforderten Befehl umgesetzt werden. Weiterhin konnte einen Prozess über den Prozessmanager gestartet werden und basierend auf der Eingabe eine entsprechende Ausgabe formuliert werden, um den User zu informieren. Dabei waren einige Dialog-spezifische Gegebenheiten bereits berücksichtigt, beispielsweise die Koreferenzierung. Hat ein Nutzer oder eine Nutzerin ein spezielles Licht in einer vorherigen Anfrage anschalten lassen und möchte es nun über den Satz “Mach es wieder aus”, wieder ausschalten lassen, so wird berücksichtigt, dass sich “es” im Satz auf einen vorhergehenden Teil des Dialogs bezieht und entsprechend aufgelöst werden muss. Bei der Arbeit mit dem bestehenden System sind allerdings auch einige Probleme aufgetreten. Durch die Datenstruktur der maschienen-lesbaren Form eines Eingabesatzes (siehe prädikaten-logische Struktur), sind in der Erkennung und Erzeugung von grammitsch korrekten deutschen Sätzen einige Schwierigkeiten aufgetreten.

Weiterhin gab es Probleme bei der Verknüpfung des Systems mit einer Wortdatenbank, also einer Datenbank, die alle benötigten deutschen Wörter mit all ihren deklinations-Formen enthält, auf die das System dann zugreifen kann. Außerdem gab es kein einheitliches Verfahren, wie aus den gewonnen Informationen eine grammatisch korrekte Ausgabe formuliert wird, sodass es eher einem fallbezogenen Flickenteppich ähnelt. Die maschienen-lesbare Darstellungsform ist darüber hinaus auch noch sehr mächtig und umfangreich gewählt, in seiner Struktur aber sehr rechenintensiv, sodass es hier zu einer Verlangsamung im System kommt. Basierend auf diesen aufgefallenen Problemen hat sich das Masterprojekt dann das Ziel gesetzt das Sytem auszuräumen und zu überarbeiten, damit folgende Projekte auf einer einfacheren Struktur aufbauen können. Dabei wurde eine neue maschienen-lesbare Darstellungsform der Eingabe und Ausgabesätze gewählt. Das hat zur Folge, dass alle Komponenten auf diese neue Darstellungsform angepasst werden müssen. Das Ziel wurde also die Frame-based Semantik, eine spezielle Darstellungsform von Sprache in der Computerlinguistik, in das vorhandene System einzubauen und damit die prädikatenlogische Baumstruktur so gut es geht zu ersetzen.

Frame-Semantik

Die Frame-based Semantik oder Frame-Semantik ist eine Form der Darstellung von Sprache in maschinen-verarbeitbarer Form. Hierbei handelt es sich um ein Konzept, dass von C. J. Fillmore et. al. in der Computerlingustik entwickelt wurde und für einen großen Teil der englischen Sprache umgesetzt wurde. Vorallem ging es darum, die Erkennung von Sprache und das Wandeln in eine Form, die vom Computer verarbeitet werden kann, zu automatisieren. Kernkonzept sind die Frames, also die “Rahmen”. Das Verständnis eines gesprochenen Satzes basiert auf dem Wissen, Glauben und den Erfahrungen der sprechenden Person. Um dieses zusammenfassend abzubilden haben sich Fillmore et. al. diese Rahmen überlegt, die bestimmte Situationen darstellen sollen. So gibt es zum Beispiel einen Rahmen, der ein einfaches Gespräch abbilden kann, zu dem immer eine Menge von Gesprächspartner*innen gehört (mit mindestens 2 Teilnehmenden) und ein Thema des Gespräches. Fillmore et. al. haben so definiert, dass, um einen Umstand eines Gesprächs sprachlich zu beschreiben, diese Elemente auf jeden Fall vorhanden sein müssen. Nebenbei gibt es dann noch Elemente, die auftreten können aber nicht müssen, damit der Rahmen erfüllt ist, wie zum Beispiel die Länge des Gesprächs oder der Ort an dem sich das Gespräch abgespielt hat. Auch ohne diese Information kann sprachlich verständlich ein Gespräch beschrieben werden. Diese Inhalte der Frame-Semantik werden auch Frame Elements genannt. Ein Frame besitzt also eine definierte Menge an notwenigen und nicht notwendigen Frame Elements. Notwendige Elemente sind die Elemente die in eine Situation vorhanden sein müssen, damit eine Situation korrekt beschrieben ist. Nicht notwendige Elemente sind Inhalte, die vorhanden sein können aber nicht müssen. Die Frame-Elements bilden nun also die semantischen Rollen einer Situation/eines Satzes. Als semantische Rolle versteht man ein inhaltliches bzw thematisches Konzept einer Aussage, das mit der Grammatik in Verbindung steht. In dem obigen Beispiel des Gesprächs kann man einen Gesprächspartner als semantische Rolle definieren.

“Anna redet mit Bob über Essen” beinhaltet, dass Anna und Bob als Repräsentationen der semantischen Rolle der Gesprächspartner*innen verstanden werden können. Das “Essen” ist in dem Beispiel die Repräsentation der semantische Rolle des Gesprächsthemas. Ein weiterer Inhalt der Frame-Semantik sind die Valence-Pattern. Die Idee der Valence-Pattern ist es, die semantischen Gegebenheiten (also die inhaltlichen Rollen eines Satzes) mit den syntaktischen Notwendigkeiten zu verknüpfen. Ein gesprochener Satz, der also auf eine bestimme syntaktische Weise nur korrekt ist (wobei es in der deutschen Sprache viele grammatische Möglichkeiten gibt), kann über die Valence-Pattern mit den entsprechenden semantischen Rollen versehen werden. Dabei muss allerdings jede syntaktische Reihenfolge eines Satzes analysiert und händisch mit semantischen Rollen versehen werden. Anhand dieser Valence-Pattern kann das System aus dem syntaktischen Satz an den definierten (grammatischen) Stellen die semantischen Rollen identifizieren und damit die Frame Elements festlegen. Um von einem Eingabesatz nun auf den richtigen Frame zu kommen, welcher dann die Valence-Pattern bereitstellt, gibt es sogenannte Lexical Units. Diese sind dazu da, dass bestimmte Worte und ihre syntaktische Verwendung den Frame hervorrufen. In einem Geprächs-Frame könnten das zum Beispiel die Wörter “reden” oder “besprechen” sein sowie viele andere Verben und Worte. Hier wird eine Menge an Wörtern für einen Frame definiert, ebenfalls händisch, sodass man diese so wählen kann, wie es für den Anwendungszweck der Software geeignet ist. Mit dieser oben beschriebenen Darstellungsform der Frame-Semantik kann man nun durch eine Eingabe ein Frame erkennen und die Eingabe in seine Frame-bezogenen Einzelteile zerlegen. Diese Einzelteile können dann vom System verwendet werden. In welcher Form das in unserem System “Dialog@Home” passiert, soll anhand jeder einzelnen Komponente beschrieben werden.

Was sind die Vor- und Nachteile der Frame-Semantik?

Die Frame-Based Semantik bietet in der Theorie viele Möglichkeiten einen gesprochenen Satz automatisiert auf maschienen-lesbare Form abzubilden. Die hauptsächlichen Vorteile der Frame-Semantik kommen vorallem durch die Definition und damit einhergehenden Eigenschaften eine Frames. Die Frame-Elements (siehe oben) sind die Darstellung der semantischen Rollen eines Satzes. Um den Inhalt eines gesprochenen Satzes erfassen zu können, müssen auch immer die semantischen Rollen bedient werden. Über diese wird erfasst, welche inhaltlichen Gegebenheiten sich in einem Satz befinden. Da es in der Sprache unendlich viele verschiedene semantische Rollen geben kann (auch davon abhängig, wie sie definiert werden), fasst die Frame-Semantik die semantischen Rollen für eine bestimmte Situation in einem Frame zusammen. Dabei wird dann direkt mit angegeben, welche semantischen Rollen in der Situation des gesprochenen Satzes vorhanden sein müssen, damit der Satz inhaltlich verstanden werden kann. Beschreibt man zum Beispiel ein Gespräch mit “Ich rede.”, dann sind zu viele Gegebenheiten ungeklärt, als dass man verstehen kann, was mit dem Satz ausgedrückt werden sollte. Ähnlich handhabt das die Frame-Semantik. Sind zu viele semantische Rollen notwendiger Art ungeklärt, kann das System den Satz nicht erfassen. Diese Gruppierung der Frame-Elements als semantische Rollen in die Kategorien der Situationen als Frames bietet eine schnelle Verarbeitung des Satzes und Einteilung der Satzteile in seine inhaltlichen Komponenten. Um diese Einteilung gewährleisten zu können, gibt es die bereits angesprochenen Valence-Pattern, die die semantischen Rollen mit ihrem syntaktischen Eigenschaften im Satz verbindet. Anhand dieser Verknüpfung kann man die semantischen Rollen im Satz durch ihre syntaktischen Eigenschaften ausfindig machen und entsprechend zuweisen. Die Lexical Units bieten den Vorteil, dass man aus einer riesen Menge Frames mit Hilfe bestimmter vorkommender Worte auf eine kleinere Menge Frames schließen und diese dann aussortieren kann.

In einem Frame werden mithilfe der Lexical Units die Worte definiert, die dazu führen, dass ein Frame aufgerufen wird. Vorallem Verben eignen sich als Lexical Units besonders, da sie häufig eine Tätigkeit beschreiben, die auch in einem Frame zusammengefasst werden kann. Generell kann aber jedes Wort jeder Wortart zu einem Lexical Unit definiert werden. Durch die beschriebenen Vorteile ist eine leichte und schnelle Struktur gegeben, mit der Sätze erkannt und auf eine maschienen-lesbare Darstellungsform abgebildet werden können. Der große Nachteil ist, dass die Frames und ihre Inhalte per Hand definiert werden müssen. C. J. Fillmore et al. haben bereits Mechanismen entwickelt, um Valence-Pattern automatisiert für bereits vorhandene Frames zu erzeugen, indem große Mengen an z.B Zeitungsaritkel ausgelesen und, wenn noch nicht im entsprechenden Frame vorhanden, als Valence-Pattern angelegt wurden. Diese waren jedoch für unser Projekt nicht von Nutzen, da wir in unserer Domäne lediglich eine begrenzte Menge an Ein- und Ausgabe Sätzen besitzen, aus denen wir ohnehin händisch die entsprechenden Frames erzeugen und ihm Rahmen dessen die semantischen Rollen der einzelnen Satzfragmente analysieren mussten. Daher ist der größte Nachteil die Erzeugung der Frames. Einmal angelegt können diese aber leicht erweitert und verändert werden und haben insgesamt keinen hohen Wartungsaufwand, was unsere Erfahrung bisher betrifft. Ein weiterer Nachteil bezogen auf unser System ist die große Unterschiedlichkeit der semantischen Repräsentation in Form von Frames zur vorhergehenden prädikaten-logischen Repräsentationsform. Dadurch, dass der Dialogmanager all seine Arbeit auf der prädikaten-logischen Baumstruktur ausgeführt hat, muss eine komplette Umstellung des Dialogmanagers stattfinden (oder wie wir als Übergangslösung überlegt haben: Eine sinnvolle Transformation von Frames in prädikaten-logische Bäume).

Das System

Das System ist grundlegend in Form eines Erzeuger-Verbraucher-Systems aufgebaut und besteht aus sieben Komponenten, welche im Folgenden beschrieben werden.

Syntaktische Analyse

In der syntaktischen Analyse wird der Eingabesatz mithilfe eines Part-Of-Speech-Taggers (POS-Tagger) getaggt und geparst. Diese POS-Tags beinhalten Wortinformationen zu jedem Wort und geben wieder, in was für einer syntaktischen Beziehung die Wörter zueinander stehen. Diese werden in eine Baumstruktur mit den zugehörigen Wörtern gewandelt und weitergegeben. Da wir mit natürlicher Sprache arbeiten und diese nicht immer übereinstimmt mit geschriebener Sprache, ist das Taggen der Wörter nicht immer korrekt. Dieses erfolgt nämlich nach heuristischen Regeln der geschriebenen Sprache und zeigt deutliche Defizite bei unvöllständigen oder nicht grammatikalisch korrekten Sätzen, was bei unserer Domäne (potenziell kognitiv beeinträchtige Personen durch Alter oder Krankheit) in der echten Anwendung Probleme bereiten kann. Entsprechend fehlertolerant müssen demnach die Valence-Pattern der einzelnen Frames gestaltet werden.

Ähnliche Schwierigkeiten zeichnen sich durch die fehlende Deutung von Mimik, Gestik und Intonation ab. Momentan arbeitet die Syntax an einer eigenen API, um Wörter aus dem Wiktionary mit der dazu bereitgestellten MediaWiki-API zu laden und diese dem Projekt bereit zu stellen. Das Wiktionary ist ein freies Wörterbuch und wird von Wikimedia vetrieben, welche auch Wikipedia vetreiben. Unsere API wird mittels Python umgesetzt, da uns dadurch eine große und mächtige Standardbibliothek zur Verfügung steht. Da eine API gebaut wird, in der alle nötigen Informationen zu einem Wort in einer geordneten Struktur zurückgegeben werden und diese Informationen sehr umfangreich sein können, wird zu Gunsten der Performanz überlegt, eine Datenbank als Cache für alle Anfragen zu nutzen. Ziel ist dabei, einen möglichst lückenlosen Dialog führen zu können und Nutzende des Systems nicht lange auf Antworten oder Feedback warten zu lassen.

Semantische Analyse

Die Semantische Analyse beschäftigt sich mit den analysieren und repräsentieren der Bedeutung eines Eingabesatzes. Anstastt also, wie in der Syntaktischen Analyse, den grammatikalischen Aufbau eines satzes zu bestimmen, möchten wir hier beantworten, was der benutzer überhaupt erreichen will. Dazu erzeugen wir in diesem Modul eine sogenannte Semantische Repräsentation, welche im Dialogmanager genutzt wird, um die Intention zu erfüllen. Diese wird in der form eines befüllten Frames weitergegeben. Die Semantische Analyse kann grob in Drei Schritte aufgeteilt werden. Zunächst müssen wir aufgrund des Eingabesatzes mögliche Frames auswählen. Dies tun wir über die Lexical Units.

Dazu wird im Eingebastz nachgeschaut welche Lexical Units dieser enthält und mit allen uns bekannten Frames abgeglichen. Wenn wir eine Menge an möglichen Frames besitzen, so müssen wir den besten aus dieser Menge bestimmen. Dies tun wir, indem wir uns die verschiedenen Valence-Pattern der Frames angucken und mit dem Eingabesatz abgleichen. Der Frame mit dem Valence-Pattern, welches am besten zum Eingabesatz passt, wird ausgewählt. Zu guter letzt müssen wir diesen Frame noch befüllen. Dazu nehmen wir uns den Eingabesatz und befüllen den Frame entsprechend der Valence-Pattern mit den Worten des Satzes. Wir besitzen dann einen Frame, welcher ein Valence-Pattern besitzt, mit welchem wir weiter Arbeiten können.

Dialogmanager

Der Dialogmanager ist die größte Komponente des Systems. Von der Semantischen Analyse erhält er als Eingabe einen logischen Ausdruck, verarbeitet die Intention des Nutzers und gibt die Antwort als logischen Ausdruck an die Semantische Synthese aus. Eine Intention könnte sein das Licht an/aus zu schalten, zu fragen ob eine Tür auf oder zu ist oder was sich in einem bestimmten Raum befindet. Der Dialogmanager arbeitet eng mit der Wissensbasis und dem Prozessmanager zusammen.

Die Wissensbasis wird angesprochen wenn der Nutzer etwas über das BAALL wissen oder den Zustand eines Objektes (zum Beispiel einer Lampe) ändern möchte. Der Prozessmanager wird angesprochen wenn die vom Nutzer gewünschte Aktion erst nach einiger Zeit ausgeführt werden soll. Dann wird die Äußerung des Nutzers im Prozessmanager zwischengespeichert und zur gegebenen Zeit an den Dialogmanager zurückgegeben. Für die Zukunft ist angedacht den Dialogmanager so umzubauen, dass er auf Frames arbeitet und nicht mehr auf logischen Ausdrücken.

Prozessmanager

Der Prozessmanager ermöglicht und verwaltet Prozesse, welche komplexere Aufgaben im BAALL bewältigen können. Beispiele solcher Prozesse in natürlicher Sprache sind “mach alle Lichter aus”, “mach in 20 Sekunden das Licht in der Küche aus” oder sogar “wenn die Tür offen ist, mach alle Lichter an”. Diese Prozesse können zur Laufzeit über eine eigene textuelle Syntax oder Java-domänenspezifische Sprache (Java-DSL) definiert und ausgeführt werden. Durch die Java-DSL ist das gesamte Dialogsystem mit dem Prozessmanager verbunden.

Der Prozessmanager implementiert die Sprache des SHIPtool, zwei Kernkomponenten der Prozesssprache sind vor allem die Monitore und Aktionen. Monitore können zum Beispiel die Prozesssequenz anhalten bis ihre logische Formel eine Variablenbelegung hat die wahr ist. Diese Formeln können bestimmte Zeitpunkte und Zustände des BAALL beschreiben. Aktionen können (bedingt) Zustandsänderungen im BAALL durchführen, sprich - das Licht in der Küche an machen. Dabei ist anzumerken, dass alle Zugriffe auf das BAALL über die Wissensbasis erfolgen. Über Monitore und Aktionen hinaus sind die Prozesse mit weiteren Komponenten wie Try-Catches, Switch-Cases und (strikte/nicht strikte) parallele Ausführungen ein mächtiges Werkzeug.

Der Prozessmanager ist in der Java Virtual Machine (JVM) Sprache Scala implementiert, mit akka als zentrales Aktor-Framework. Jeder Prozess erhält dabei einen sogenannten Aktor, der wiederum Teilaufgaben des Prozesses an weitere Kindaktoren verteilt. Das Aktor-System ermöglicht ein paralleles Ausführen der Prozesse, da jeder Aktor seinen eigenen gekapselten Zustand hat und dieser nur über Nachrichten anderer Aktoren verändert werden kann. Die größte Herausforderung dabei ist es den Nachrichtenfluss zwischen den Aktoren effizient und fehlerfrei zu gestalten, da dieser überwiegend asynchron abläuft.

Ein neues Feature des Prozessmanagers ist die Visualisierung laufender Prozesse. Dafür wurde ein neues Modul erstellt - der Prozessmanager-Client. Dabei handelt es sich um einen Webclient, der modular zusammengestellt ist und in seiner ersten Version eine Übersicht aller Prozesse, sowie eine detaillierte Übersicht einzelner Prozesse anzeigt. Durch Scala.js ist die Übersetzung von Scala- in Javascript-Code möglich, sowie das Teilen einer gemeinsamen Codebasis zwischen Client und Server.

Wissensbasis

Die Wissensbasis ist das Gehirn hinter dem System. In dieser Komponente wird sowohl das gesamte Wissen über alle Objekte, welche sich im BAALL befinden, zusammengefasst und gespeichert, als auch das Wissen der Frame Semantik beherbergt. Somit ist es über Anfragen an diese Komponente möglich, den Ort und den aktuellen Status einer bestimmten Lampe beispielsweise im BAALL zu erfragen. Damit ist es möglich bei Anfragen an das System möglich entsprechend zu reagieren und Statusänderungen zu erkennen. Bei dem Thema Frame Semantik sorgt die Wissensbasis dafür, dass bestimmte Strukturen des Anfragesatzes vorhanden sein müssen, damit eine vernünftige Reaktion seitens des Systems stattfinden kann.

Es validiert also den Eingabesatz anhand der Regeln, welche für jeden Fall gespeichert sind und teilt dem System damit präziser mit, welche Aktion ausgeführt werden soll und welche Antwort vom Nutzer erwartet wird. All dieses Wissen wird hierfür in einer Graphdatenbank gespeichert, genauer gesagt in Ontologien. Diese Haben die spezielle Eigenschaft, dass das gespeicherte Wissen in Beziehung zu einander stehen. So gibt es beispielsweise einen Eintrag “Räume” und einen Eintrag “Küche”. Durch eine Relation (Beziehung) zwischen diesen beiden Einträgen kann man dann sagen, dass eine Küche eine Unterkategorie von Räumen ist. Man fügt also ein gewisses Wissen zur normalen Datenbankstruktur hinzu.

Semantische Synthese

Die Semantische Synthese ist der Teil des Systems welcher die Satzstruktur der Ausgabe bestimmt. So wird hier zum Beispiel bereits unter anderem das Nomen bestimmt. Oder auch das Verb und das Objekt. Der tatsächliche Satz wird dann in der Syntaktischen Synthese gebaut. Die Semantische Synthese soll natürlich auch mit Frames arbeiten. Dazu gibt es auch wieder Drei Schritte. Zunächst muss der korrekte Frame genommen werden. Dies ist einfacher als bei der Analyse, da wir uns hier zu nutze machen können, das jeder Frame der Analyse einen entsprechenden Frame in der Synthese besitzt. Wir können also einfach gucken, welcher Frame in der Analyse genutzt wurde und direkt den entsprechenden Frame für die Synthese nehmen.

Dann müssen wir diesen Frame befüllen. Dazu nehmen wir den logischen Ausdruck, welcher uns von dem Dialogmanager gegeben wurde. Mit diesem können wir wieder das Valence-Pattern befüllen, welches am besten passt. Zu guter letzt müssen wir mithilfe des nun gefüllten Frames die Satzstruktur bauen, also die verschiedenen essenziellen Informationen für den Ausgabesatz erstellen. Sobald dies geschehen ist, können wir diese Informationen weiter an die Syntaktische Synthese geben, damit diese einen vollständigen deutschen Satz bauen können.

Syntaktische Synthese

In der syntaktischen Synthese wird die Ausgabe aus der semantischen Synthese genommen und in einen grammatisch korrekten Satz umgeformt. Dabei werden die übergebenen Wörter abhängig von ihrer Position im Satz dekliniert und in eine Satzform gebracht, die in natürlicher Sprache ausgegeben werden kann.

Das Ziel wird sein, diesen Prozess zu verbessern indem er verallgemeinert wird und das System für weitere Anwendungsbeispiele entweder nur leicht oder gar nicht erweitert werden muss. Dazu sollen dann alle Satzbaupläne, wie beispielsweise hier beschrieben, bestmöglich eingebaut werden, um dann verwendet werden zu können.

Kontakt

Dialog@Home Projektraum (Cartesium)
Raumnummer 1.05
Enrique-Schmidt-Straße 5
28359 Bremen

dath-crew@mailman.zfn.uni-bremen.de

DFKI
Universität Bremen