Suche
Teil 3: Was zwischen den Zeilen steht

Machine Learning Tutorial: Maschinelle Schlussfolgerung

Masoud Amri

©Shutterstock/ProStockStudio

Während Ärzte, Rechtsanwälte und andere Berater ihren Patienten bzw. Klienten zuhören, versuchen sie, aus der gesamten Konversation Fakten herauszufiltern. Sie dienen ihnen als Basis, um effektiv behandeln und beraten zu können. Fakten zu sammeln und daraus zu schlussfolgern, ist für Menschen selbstverständlich. Für Maschinen ist dies jedoch eine große Herausforderung. In diesem Artikel möchten wir den Cogniology-Ansatz zur Wissensbasis und deren Umgang mit Fakten und Schlussfolgerungen erläutern.

Menschen stellen sich selber Fragen, etwa: „Wo habe ich meinen Schlüssel hingelegt?“, „Wer ist Frau Wagner?“ oder „Woraus besteht Luft?“. Wenn wir uns solche Fragen stellen, versuchen wir, in unseren Erinnerungen nach Informationen zu suchen, die uns gerade auf Anhieb nicht einfallen. Das ist auch der Fall, wenn wir aus unserem bestehenden Wissen verschiedene Informationen zusammenstellen möchten, um daraus eine Antwort auf eine Frage zu geben. In diesem Zusammenhang geht Cogniology davon aus, dass Menschen Informationen aus ihrem Gedächtnis unbewusst durch W-Fragen abrufen und aus logischen Zusammenhängen zwischen diesen Informationen Schlussfolgerungen ziehen. Analog zu dieser Vorstellung organisieren wir auch die Informationen bzw. die Fakten in unserer Wissensbasis über W-Fragen.

Artikelserie
Teil 1: Sentence Component
Teil 2: Natürliche Datentypen (Natural Datatypes)
Teil 3: Maschinelle Schlussfolgerung
Teil 4: Maschinelles Lernen und Verstehen
Teil 5: Programmierung in natürlicher Sprache I
Teil 6: Programmierung in natürlicher Sprache II

Nehmen wir folgende W-Fragen und deren Antworten als Beispiel und zeigen, wie die Fakten in der Wissensbasis gespeichert und abgerufen werden.

Frage: Wo ist Berlin?
Antwort: Berlin ist in Deutschland.

Frage: Wer ist Frau Wagner?
Antwort: Frau Heidi Wagner ist Zahnarzthelferin in der Praxis für Kiefer- und Gesichtschirurgie in Frankfurt.

Frage: Woraus besteht Luft?
Antwort: Die Atmosphäre der Erde enthält rund 78 Prozent Stickstoffgas (N2), 21 Prozent Sauerstoffgas (O2), das restliche Prozent besteht aus Kohlendioxid (CO2), Wasserstoff (H2) und weiteren Gasen in minimalen Mengen.

Die inhaltlichen Elemente des ersten Frage-Antwort-Paars sind Berlin und Deutschland. Nach unserem Ansatz werden diese inhaltlichen Elemente als zwei Objekte betrachtet, die durch eine entsprechende W-Frage miteinander assoziiert werden. Ein solches Frage-Antwort-Paar wird in einem Tripel (W-Frage, Fakten in Frage, Fakten in Antwort) gespeichert (Abb. 1).

Für das Frage-Antwort-Paar „Wo ist Berlin?“ – „Berlin ist in Deutschland.“ fügen wir z. B. das Tripel („wo.ist“, „Berlin“, „Deutschland“) in die Wissensbasis ein. Die beiden Objekte werden durch die Angabe einer Zeichenkette assoziiert, die immer mit einem W-Fragewort anfängt und durch weitere Wörter konkretisiert wird. Dabei geht es nicht um die grammatisch korrekte Formulierung der W-Frage, sondern um das Erfassen der wichtigsten Information in einer Kurzform.

Fügen wir ein zweites Tripel („wo.ist“, „Frankfurt“, „Deutschland“) der Wissensbasis hinzu, wird das System prüfen, ob es für eines der beiden Objekte ein ähnliches Objekt in der Wissensbasis gibt. Trifft dies zu, wird das Objekt an dieser Stelle hinzugefügt (Abb. 1)

Abb. 1: Frage-Antwort-Paar in einem Tripel

Abb. 1: Frage-Antwort-Paar in einem Tripel

Somit können die Informationen in Form von Tripeln durch beliebige Sentence Components unabhängig voneinander der Wissensbasis hinzugefügt und es kann damit das Wissen in Form eines Baums immer stärker erweitert werden. Umfangreiche Fakten in der Wissensbasis allein reichen jedoch nicht aus, um daraus Schlussfolgerungen zu ziehen. Eine einfache Schlussfolgerung wie beispielsweise „Berlin ist in Deutschland“ kann aus einfachen Verfahren gezogen werden. Komplexere Schlussfolgerungen, wie zum Beispiel bei Rechtsberatungen, die aus den Konversationen mit Mandanten einen rechtsverbindlichen bzw. logischen Schluss ziehen sollen, lassen sich mit einfachen Verfahren nicht bewältigen.

Die richtigen Schlüsse ziehen

Unser Verfahren zum Schlussfolgern basiert auf drei Gruppen von Sentence Components. Die ersten sammeln die Information bzw. die Fakten aus einer Aussage. Wir nennen sie Faktensammler. Die zweiten erstellen Themen (Themenersteller) und die dritten interpretieren die Themen in Zusammenhang mit den Fakten aus der Wissensbasis und ziehen daraus Schlussfolgerungen. Wir bezeichnen sie als Fakteninterpreten. Ein praktisches Beispiel für Faktensammler ist eine Sentence Component, die das Frage-Antwort-Paar „Wer ist Frau Wagner?“ und „Frau Heidi Wagner ist Zahnarzthelferin in der Praxis für Kiefer- und Gesichtschirurgie in Frankfurt.“ bearbeitet. Die Satzdefinition einer Sentence Component bezieht sich immer auf die Antwort einer W-Frage, also nicht auf die Frage selbst. Die folgende Sentence Component implementiert dafür einen Faktensammler.

public class PersonenFaktenSammler
{
  Person person = null;
  Job job = null;

  @Sentence("Irgendeine Person hat irgendeinen Job.")
  public void collectFact()
  {
KnowledgeBase.insert("wer.ist", person); 
KnowledgeBase.insert("welchen.beruf.hat", person, job); 
  }

  @NaturalTypeMethod(naturalName = " irgendeine Person", naturalType = "Person")
  public void setPerson(Person person){
    this.person = person;
  }

  @NaturalTypeMethod(naturalName = " irgendein Job", naturalType = "Beruf")
  public void setJob(Job job){
    this.job = job;
  }
}

Wir haben in der obigen Sentence Component zwei natürliche Datentypen, Person und Beruf, verwendet:

@NaturalTypeMethod(naturalName = " irgendeine Person", naturalType = "Person")
@NaturalTypeMethod(naturalName = " irgendein Job", naturalType = "Beruf")

Im letzten Artikel haben wir uns mit natürlichen Datentypen intensiver beschäftigt und haben detailliert erklärt, wie ein Softwareentwickler beliebige natürliche Datentypen erstellen kann. Die natürlichen Datentypen konvertieren die inhaltlichen Elemente einer Aussage in einen technischen Datentyp. Zum Beispiel beinhaltet die Aussage „Ich hätte nächste Woche Montagvormittag um 10 Uhr Zeit“ ein konkretes Datum, das durch den Mechanismus der natürlichen Datentypen in eine Instanz des Datums (06.11.2017 10:00) konvertiert wird. Diese wird dann durch die Plattform an eine Methode der Sentence Component zur weiteren Verarbeitung übergeben.

Die Implementierung des natürlichen Datentyps Person beinhaltet mehr als eine halbe Million Vor- und Nachnamen inklusive deren Geschlecht. Aus der Aussage „Frau Heidi Wagner ist Zahnarzthelferin bei der Praxis für Kiefer- und Gesichtschirurgie in Frankfurt“ erkennt der natürliche Datentyp Person, dass Heidi ein weiblicher Vorname und Wagner ein Nachname ist. Daraus erzeugt er eine Instanz der Klasse Person mit den entsprechenden Daten. Daraufhin weist die Plattform diese Instanz der entsprechenden Methode zu: public void setPerson(Person person). Analog zur Person entnimmt der natürliche Datentyp Beruf aus der Aussage den Satzteil „Zahnarzthelferin in der Praxis für Kiefer- und Gesichtschirurgie in Frankfurt“ und erzeugt eine Instanz der Klasse Job. Die Plattform weist diese Instanz als Parameter der Methode setJob(Job job) zu. Wenn die Plattform die Methode collectFact() aufruft, wird durch den Aufruf der Methode insert(„was.macht.beruflich“, person, job) ein Tripel in die Wissensbasis eingetragen (Abb. 2).

Abb. 2: Methode „insert("was.macht.beruflich", person, job)“

Abb. 2: Methode „insert(„was.macht.beruflich“, person, job)“

Wenn wir diese Sentence Component in der Plattform hochladen und folgende Aussagen aus Wikipedia in das Eingabefeld eingeben, wird unsere Wissensbasis durch unsere einfache Sentence Component um weitere Personen erweitert. „Barack Hussein Obama (* 4. August 1961 in Honolulu, Hawaii) ist ein US-amerikanischer Politiker.“ Durch diese Aussagen erhalten wir wertvolle Informationen, womit wir unsere Wissensbasis effizienter gestalten können. Wir erweitern unsere Klasse PersonenFaktensammler:

public class PersonenFaktensammler
{
  /* unverändert */

  @Sentence("Irgendeine Person hat irgendeinen Job.")
  public void collectFact()
  {
KnowledgeBase.insert("welches.geschlecht.hat", person.vorname, person.geschlecht); 
KnowledgeBase.insert("welches.geschlecht.hat", person.mittelname, person.geschlecht); 

KnowledgeBase.insert("wo.ist", person.ort.name, person.ort.land); 

KnowledgeBase.insert("wer.ist", person); 
KnowledgeBase.insert("welchen.beruf.hat", person, job); 
  }

  /* unverändert */
}

Der natürliche Datentyp Person konvertiert den Satzteil „Barack Hussein Obama (* 4. August 1961 in Honolulu, Hawaii)“ in den technischen Datentyp Person.

public class Person
{
  public String vorname;
  public String nachname;
  public String mittelname;
  public String geschlecht;
  public Date geburtsdatum;

  // Mit der folgenden Annotation werden Person und Ort zueinander assoziiert.
  @ interrogative("wo.ist.geboren")
  public Ort geburtsort;
}

Der natürliche Datentyp Person vergleicht jedes Wort in der Aussage mit den Vornamen in seiner Datenbank. In diesem Fall findet er Barak als Vornamen und Obama als Nachnamen. Hussein ist allerdings nicht in seiner Datenbank aufgeführt. Da Hussein zwischen Vorname und Nachname steht, geht er davon aus, dass Hussein ein Mittelname ist. Diese neue Erkenntnis kann in der Wissensbasis ungeachtet dessen, ob diese Information in ihr schon vorhanden ist oder nicht, eintragen werden:

KnowledgeBase.insert("welches.geschlecht.hat", person.vorname, person.geschlecht);

KnowledgeBase.insert("welches.geschlecht.hat", person.mittelname, person.geschlecht);

Die Methode insert() prüft selbst, ob die Daten in der Wissensbasis vorhanden sind. Ist das der Fall, verwirft sie die Daten wieder. Das Gleiche gilt auch für den Ort, der durch den natürlichen Datentyp Ort ermittelt wird. Aus dem Satzteil „in Honolulu, Hawaii“ wird ein Objekt der Klasse Ort erstellt. Der natürliche Datentyp kann aus der Aussage den Ort erkennen, indem er davon ausgeht, dass nach „in“ und vor „Hawaii“ nur ein Ort folgen kann. Diese neue Erkenntnis kann durch die Methode insert(„In.welchem.bundesland.liegt“, person.ort.name, person.ort.land) in die Wissensbasis eingetragen werden (Abb. 3).

Abb. 3: Methode „insert("In.welchem.bundesland.liegt", person.ort.name, person.ort.land)“

Abb. 3: Methode „insert(„In.welchem.bundesland.liegt“, person.ort.name, person.ort.land)“

Kommen wir nun zum Themenersteller. Wenn wir von etwas reden, hören oder lesen, können wir uns allein aufgrund einiger Begriffe vorstellen, worum es sich handelt. Beispielsweise schließen wir aus der Aussage: „Pressekonferenz von Frau Merkel und Barack Obama fand gestern statt. Sie ließ ihm den Vortritt am Rednerpult“, dass das Thema der Pressekonferenz Politik war. Das liegt daran, dass wir die beiden Namen kennen und schon wissen, dass sie Politiker sind. Wir erkennen, dass Personen oder Gegenstände, von denen die Rede ist, Bestandteile des aktuellen Geschehens sind. So können wir im einfachsten Fall erkennen, welche Person gemeint ist, wenn wir „er“ oder „sie“ oder eine Umschreibung hören oder sagen.

Das Erkennen solcher einfachen Zusammenhänge erfolgt bei Menschen intuitiv. Für einen Digitalassistenten ist es jedoch eine Herausforderung. Diese Problematik ist in der Linguistik und der künstlicher Intelligenz unter dem Begriff Kohärenz bekannt. Unter Kohärenz verstehen wir die semantischen Zusammenhänge der Sentence Components und bieten mit unserem Konzept Themenkohärenz eine effiziente Lösung dafür. Ein einfaches Beispiel zur Erklärung der Themenkohärenz ist die Begrüßung.

public class Begruessung
{
  Person person = null;

  @Sentence("Guten Morgen irgendeine Person.")
  public void sayHello()
  {
KnowledgeBase.addTopic( "wer.ist.anwesend", person); 
  }

  @NaturalTypeMethod(naturalName = " irgendeine Person", naturalType = "Person")
  public void setDatum(Person person){
    this. person = person;
  }
}

Die Aussagen „Guten Morgen, Herr Obama“ und „Guten Morgen, Herr Dr. König“ rufen beide die Sentence Component @Sentence(„Guten Morgen, irgendeine Person.„) auf. Wichtig ist dabei, dass die Gegrüßten schon vorher in der Wissensbasis aufgenommen wurden, sonst hätte der Begrüßende den Namen des Gegrüßten nicht gekannt. Mit der Methode addTopic merkt der Digitalassistent, dass zwei Personen gerade begrüßt worden sind. KnowledgeBase.addTopic( „wer.ist.begruesst“, person);.

Durch die Methode addTopic() können alle Aktoren oder Gegenstände, die gerade in einem Geschehen involviert sind, erkannt werden. An dieser Stelle ist zu berücksichtigen, dass die Topics keine Fakten bzw. Wissen speichern, wie es bei den Faktensammlern der Fall war. Sie dienen lediglich dazu, dass die Fakteninterpreten aus Fakten in Form von Tripels und Topics die richtigen Entscheidungen treffen können. Wenn wir davon ausgehen, dass der Digitalassistent Herrn Obama und seinen Beruf als Politiker schon vorher in die Wissensbasis aufgenommen hat, dann wird durch „Hallo, Herr Obama“ kein neues Wissen über ihn selbst erzeugt, sondern seine Präsenz in der Stadt erkannt.

Fakten richtig interpretieren

Ein Fakteninterpret kann allein aufgrund des Berufs der Person (US-amerikanischer Politiker) davon ausgehen, dass das aktuelle Thema bzw. der aktuelle Kontext der Konversation Politik ist.
Als Beispiel für einen einfachen Fakteninterpreten können wir auf unseren Digitalassistenten für Zahnärzte zurückgreifen. Dabei können wir als Themenersteller unsere Sentence Component @Sentence(„Guten Morgen irgendeine Person.„) anwenden und die bestehende Sentence Component für die Interpretation des Topics erweitern. Hierfür zeigen wir das Szenario aus unseren letzten Artikeln noch einmal:

Dr. König: Guten Morgen, Herr Müller, schön Sie zu sehen. Schön sonnig heute, der Frühling kommt so langsam in Schwung.
Hr. Müller: Guten Morgen, Herr Dr. König, ja, das stimmt.
Dr. König: So, dann schauen wir uns mal die Zähne an. Das sieht beim Eckzahn leider gar nicht gut aus. Da brauchen wir einen Termin für eine Füllung. Wann könnten Sie denn?
Hr. Müller: Oh weh, das hört sich nicht gut an. Aber muss ja dann wohl leider sein. Ich könnte nächsten Montagmorgen um 10 Uhr. Ginge das?
Dr. König: Alles klar! Dann sehen wir uns also nächste Woche. Auf Wiedersehen und einen schönen Tag.

Die beiden Personen, Herr Müller und Herr Dr. König, werden in diesem Szenario begrüßt. Durch Sentence Component @Sentence(„Guten Morgen irgendeine Person.“) können diese beiden Aussagen bearbeitet werden und in Topics zwei Personen eintragen werden. Die vorhandene Sentence Component @Sentence(„Ich habe an irgendeinem Datum Zeit.“) kann anhand dieser Topics entscheiden, an wen eine E-Mail mit einem konkreten Terminvorschlag gesendet werden soll.

public class Terminvereinbarung
{
  Date datum;

  @Sentence( "Ich habe an irgendeinem Datum Zeit." )
  public String createCalenderEntry()
  {
    Person zahnArzt = KnowledgeBase. select ("wer.ist.Person.beruf", "zahnarzt", Person.class);
    Person helferin = KnowledgeBase.select("wer.ist.person.beruf", "helferin", Person.class);

    List topics = KnowledgeBase.getTopics("wer.ist.begruesst", Person.class); 
    for (Person person : topics)
    {
      if ( person.getLastName().equals( zahnarzt. getLastName() )  )
      {
        continue;
      }
      else if ( person.getLastName().equals( helferin.getLastName() )  )
      {
        continue;
      }

      return "Guten Tag Liebe/r Herr/Frau " + person.nachname + "\n"
        "Wir haben Ihnen in unserem Terminkalender einen Termin für " +
        datum.toString();
        " eingetragen." +
        "Viele Grüße" +
        "Ihre Zahnarztpraxis";
    }
  }

  @NaturalTypeMethod(naturalName = "an irgendeinem Datum", naturalType = "Datum")
  public void setDatum(Date datum)
  {
    this.datum = datum;
  }
}

Mit der Methode select() werden in obigen Sentence Components zwei Objekte aus der Wissensbasis abgeholt.

Person zahnArzt = KnowledgeBase. select ("wer.ist.Person.beruf", "zahnarzt", Person.class);
Person helferin = KnowledgeBase.select("wer.ist.person.beruf", "helferin", Person.class);

Mit der Methode select() werden in obigen Sentence Components zwei Objekte aus der Wissensbasis abgeholt.

Person zahnArzt = KnowledgeBase. select („wer.ist.Person.beruf“, „zahnarzt“, Person.class);
Person helferin = KnowledgeBase.select(„wer.ist.person.beruf“, „helferin“, Person.class);

Die Methode select() ruft die Daten aus der Wissensbasis ab. Sie erwartet drei Argumente. Das erste Argument ist eine Zeichenkette, bestehend aus mehreren Wörtern, die immer mit einem W-Fragewort anfängt. Die Wörter werden durch Punkte voneinander getrennt. In der Zeichenkette kann ein Wort mit einem Großbuchstaben anfangen, der dem Objektnamen der inhaltlichen Elemente der W-Frage entspricht. Diesem Objektnamen kann ein Pfad folgen, der zu seiner Variablen navigiert. Das zweite Argument gibt den zu suchenden Inhalt und das dritte den Datentyp der Rückgabe der Methode select() an. Der Rückgabewert der Methode select() entspricht dem Objekt der Antwort. Die Suche nach Zahnarzt wird im Wer-Baum begonnen, und durch die indizierten W-Fragen kann sehr schnell die entsprechende Person gefunden werden.

Lesen Sie auch: Artificial Intelligence: Miracle or Menace – wie AI unsere Zukunft verändert

Während die Methode Insert() ein Triple in die Wissensbasis einträgt, gelangt das Triple erst ins Kurzzeitgedächtnis der Wissensbasis. Wird diese weiter selektiert, wird durch einen internen Zeitstempel und Zähler immer höherer priorisiert. Erreicht ein Element im Kurzzeitgedächtnis eine bestimmte Anzahl von Aufrufen, wird es ins Langzeitgedächtnis übertragen. Die Lebensdauer der vorgehaltenen Elemente in beiden Gedächtnissen hängt von der Kapazität der dafür vorgesehenen Speichergröße ab. Somit besteht die Wissensbasis aus Kurz- und Langzeitgedächtnis sowie Themenkohärenz (Topics). Der Grund für diese Unterteilung hat nicht nur damit zu tun, dass das menschliche Gehirn die Informationen wahrscheinlich ebenso verwaltet. Es hat auch damit zu tun, dass so vermieden wird, unbrauchbare Informationen zu sammeln.

Das Langzeitgedächtnis wird wiederum in zwei Bereiche unterteilt: privat und öffentlich. Der öffentliche Bereich beinhaltet Informationen, die für die breite Masse der Benutzer interessant sind. Der private Bereich ist nur für den einzelnen Digitalassistenten interessant. Die Informationen über Zahnarzt und Zahnarzthelferin befinden sich im privaten Langzeitgedächtnis, sodass nur der gesuchte Zahnarzt und die Zahnarzthelferin gefunden werden.

Fazit

In den letzten beiden Artikeln sind wir ausführlich auf die Implementierung von Sentence Components und natürlichen Datentypen eingegangen. Wir haben gezeigt, dass die natürlichen Datentypen nicht nur die inhaltlichen Elemente eines Texts in technische Datentypen konvertieren, sondern durch Polymorphismus auch eine Lösung für das Problem der Mehrdeutigkeit in natürlicher Sprache darstellen. In diesem Artikel haben wir Faktensammler, Themenersteller und Fakteninterpreten vorgestellt und gezeigt, wie grundsächlich mit Schlussfolgerungen umgegangen werden kann. Im nächsten Artikel werden wir zeigen, wie eine Maschine durch natürliche Sprache von Menschen lernt und Gelerntes versteht.

Geschrieben von
Masoud Amri
Masoud Amri ist Informatiker mit über zwanzig Jahren Erfahrung als Softwareentwickler und Softwarearchitekt bei namhaften Unternehmen (IBM, Mercedes, Volksbank, Fraunhofer etc.) Er arbeitet seit 2012 an der Theorie und Umsetzung der Cogniology.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: