Endlich einer, der mich versteht!

cubido
von cubido
5 Min. Lesezeit
Montag, 23. Dezember 2019

In diesem Beitrag möchte ich von meinen Erfahrungen mit Luis, einem Service von Microsoft Azure, berichten. Luis steht für „Language Understanding Intelligent Service“. Man erkennt schon, dass der Name nicht durch Zufall entstanden ist, sondern sich jemand ganz offensichtlich Mühe gegeben hat, hier etwas zu erschaffen, das man sich auch gut merken kann.

Die Bezeichnung ist nicht nur gut gewählt, sondern suggeriert damit auch zwei Eigenschaften, die Luis eigentlich so gar nicht hat. Luis kann nämlich weder Sprache verstehen noch ist er in irgend einer Weise intelligent. Warum Luis dennoch ausgesprochen nützlich ist, möchte ich in weiterer Folge gerne anhand eines Beispiels zeigen.

Man erreicht die Weboberfläche von Luis unter http://luis.ai. Hier ist auch bereits der erste Stolperstein verborgen. Befindet man sich in Westeuropa, so muss man die Url http://eu.luis.ai verwenden, ansonsten wird der Webservice eine kryptische Fehlermeldung zurückliefern oder man scheitert bereits an der Auswahl der Subscription.

Was ist Luis?

Doch zunächst eine kurze Einführung, wer bzw. was Luis eigentlich ist. Bei Luis handelt es sich um einen Service, der es ermöglicht, aus natürlicher Sprache bestimmte, genau definierte Informationen zu extrahieren. Dabei wird Machine Learning angewandt und im Zuge dessen, ein entsprechendes Modell mit Beispielsätzen gefüttert und anschließend „trainiert“.

Sobald das Modell trainiert ist und publiziert wurde, kann man dem Service Sätze schicken und bekommt die Daten aus den Sätzen entsprechend zerlegt zurück, sodass man diese in der eigenen Applikation gut weiterverarbeiten kann. Dabei unterscheidet Luis zwischen Absichten und Entitäten. Kurz gesagt: Was will der User und womit bzw. wodurch?

Was willst Du?

Um es Luis nun zu erleichtern, bestimmte Absichten besser zu erkennen, pflegt man für jede Absicht mehrere Beispielsätze ein. Für die Absicht „Warenkorb anzeigen“ könnte man zum Beispiel folgende Sätze verwenden:

  • Zeig mir den Warenkorb
  • Bitte zeig mir den Warenkorb
  • Was ist in meinem Warenkorb?
  • Zeig mir den Einkaufskorb
  • Zeig mir die Liste
  • ...

Luis erspart dem Entwickler damit die Arbeit, die Eingabe des Benutzers zu analysieren und findet selbst heraus, welche Absicht dieser verfolgt. Dabei ist es nicht nötig, dass einer dieser Sätze exakt so eingegeben wird, wie er zuvor erfasst wurde. Für die Eingabe „Was habe ich auf der Liste?“ wird Luis erkennen, dass es sich dabei um die Absicht „Warenkorb anzeigen“ handelt. Dazu bekommt man einen Wahrscheinlichkeitswert, der einen darüber informiert, zu wie viel Prozent sich Luis sicher ist, die entsprechende Absicht korrekt erkannt zu haben.

Man kann sich das in etwa so vorstellen, wie bei Bilderkennung. Dabei wird ein Modell mit z.B. 200 Bildern trainiert, auf denen jeweils unterschiedliche Hunde abgebildet sind. Anschließend führt man ein Bild zu, auf dem ebenfalls ein Hund abgebildet ist, jedoch keiner, der auf einem der anderen 200 Bilder zu sehen war. Der Algorithmus wird dann ermitteln, zu wie viel Prozent auf dem Bild ein Hund abgebildet ist und z.B. 82% ausgeben, wenn es sich tatsächlich um einen Hund handelt oder nur 37%, wenn auf dem Bild eine Katze abgebildet ist. Der Vorteil dieser Methode ist, dass geringfügige Unterschiede eben nicht zu einem völlig anderen Ergebnis führen. Ein Hund mit spitzen Ohren ist immer noch ein Hund und der Algorithmus wird das entsprechend erkennen.

Bei natürlicher Sprache stößt diese Methode jedoch an ihre Grenzen, denn hier können selbst geringfügige Abweichungen die Bedeutung völlig verändern.

Luis wird die Anweisung „Bitte zeig mir den Warenkorb nicht“ ebenfalls als die Absicht „Warenkorb anzeigen“ einstufen, auch wenn sie tatsächlich das genaue Gegenteil bedeutet.

Absichten und Entitäten

Wirklich sehr nützlich ist Luis aber beim Herausfiltern von Variablen und sonstigen Werten. Hier am besten wieder ein Beispiel, um das zu verdeutlichen. Diesmal wollen wir bestimmte Waren in den Warenkorb legen. Beispielsätze könnten folgende sein:

  • Lege 3 Kilo Tomaten in den Warenkorb
  • Ich möchte 2 Liter Milch kaufen
  • Ich kaufe 13 Stück Brot
  • Gib 17 Packungen Reis in den Warenkorb
  • ...

Hier kommt nun die eigentliche Stärke von Luis zum Vorschein, jedoch muss man zuerst natürlich definieren, an welcher Stelle bei diesen Sätzen jeweils die Menge, die Einheit und das Produkt vorkommen.

Hierfür erstellen wir sogenannte Entitäten. Die erste Entität ist „Product“, weiters benötigen wir noch „Value“, „Unity“ und „Amount“. Amout ist dabei ein Spezialfall. Es handelt sich um eine sogenannte „Composite Entity“, also eine zusammengesetzte Entität, die ihrerseits aus „Value“ und „Unity“ besteht.

Um diese Entitäten nun zuzuordnen, klickt man in den Beispielsätzen auf das jeweilige Wort, eine Liste erscheint und man wählt die betreffende Entität aus. Die zusammengesetzte Entität ist hier eine kleine Herausforderung, denn man muss zuerst das erste Wort anklicken, dann öffnet sich die Liste und dann klickt man das zweite Wort an und wählt anschließend „in zusammengefasste Entität zusammenfassen“ aus der Liste.

Anschließend sieht das in etwa so aus:

  • Lege Value Unity Product in den Warenkorb
  • Ich möchte Value Unity Product kaufen
  • Ich kaufe Value Unity Product
  • Gib Value Unity Product in den Warenkorb
  • ...

Die zusammengesetzte Entität (hier gelb markiert) wird in der Oberfläche von Luis durch grünes Unterstreichen angezeigt.

Hat man nun genügend Beispielsätze mit korrekt markierten Entitäten angelegt und das Modell trainiert, so kann man dazu übergehen, es zu testen. Dazu gibt es in der Oberfläche von Luis eine eigene Schaltfläche mit der Aufschrift „Testen“. Gibt man dort einen Satz ein, zeigt Luis sofort an, welche Absicht erkannt wurde und wenn man den erkannten Satz anklickt, öffnet sich noch eine Detailansicht, welche einem die erkannten Entitäten anzeigt.

Hier probiert man nun am besten einen Satz, der nur von der Struktur her zu den Beispielsätzen passt, nicht aber vom Inhalt. Also zum Beispiel „Ich kaufe 25 Meter Obst“. Nichts davon kommt in meinem Beispielsätzen tatsächlich vor, dennoch erkennt Luis, dass 25 ein Value, „Meter“ eine Einheit und „Obst“ ein Produkt ist, auch wenn das Ganze inhaltlich nur bedingt Sinn ergibt. Nun probieren wird „Ich will 13 Liter Saft“. Klappt ebenfalls.

Je nachdem, wie man Luis in seine Applikation einbindet, kann man entweder über ein Objekt in der jeweiligen Programmiersprache auf das Ergebnis zugreifen oder man bekommt einen JSON String den man entsprechend parsen kann.

Auch hier merkt man jedoch wieder sehr schnell, dass Luis eigentlich nichts versteht. Gibt man zum Beispiel ein „Gib 3 Eier in den Warenkorb“, erkennt Luis zwar eventuell die Absicht richtig, nicht jedoch die Amount bzw. das Produkt. Hierfür muss man weitere Trainingssätze hinzufügen, bei welchen der Amount nur aus der Zahl besteht, die Einheit jedoch fehlt und das Ganze wieder entsprechend Markieren. Das funktioniert dann auch wieder so, wie es soll, jedoch benötigt man dafür bereits eine ganze Menge an Beispielsätzen. Aktuell bin ich hier bereits bei über 20 Sätzen angekommen.

Man braucht übrigens nicht unbedingt alles selbst zu definieren. Luis hat bereits eingebaute Entitäten und erkennt zum Beispiel Namen. Jedoch funktioniert das aktuell nur in der englischen Sprachversion.

Wartung und Pflege

Eine Luis Applikation bedarf eines gewissen Ausmaßes an Pflege. Es reicht nicht aus, einige Beispielsätze zu definieren und das Ganze anschließend sich selbst zu überlassen. Vielmehr muss man, gerade in der Anfangsphase, immer wieder nachjustieren und es ist auch sehr zu empfehlen, das zu tun. Sprache ist schließlich sehr vielfältig und man kann im Vorhinein unmöglich alle möglichen Aussagen vorhersehen, die einem Benutzer einfallen können, um seine Absicht kund zu tun.

Zu diesem Zweck stellt Luis ebenfalls ein nützliches Werkzeug zur Verfügung. Unter „Endpunktäusserungen überprüfen“ kann man sehen, was die Benutzer eingegeben haben und was Luis dabei zu erkennen glaubt. Indem man nun jeweils angibt, ob die Absicht richtig erkannt wurde oder im umgekehrten Fall die erkannte Absicht korrigiert, kann man helfen, das Modell weiter zu verfeinern.

Fazit

Luis ist eine sehr nützliche Hilfe, wenn es darum geht, natürliche Sprache auf bestimmte Inhalte hin zu analysieren. Durch das Definieren von Absichten mit dazugehörigen Beispielsätzen ist es möglich, in einer Applikation die Absicht des Benutzers korrekt zu erkennen, ohne jede mögliche Benutzereingabe exakt konfigurieren zu müssen. Laufende Pflege sowie regelmäßiges Nachjustieren verbessern das Ergebnis nochmals deutlich.

Verfasst von Thomas Polaschek