Essentials von GenDifS am Beispiel “Schnitzel”#

Handout zum Austauschforum “KI in der Lehre”, HAW Landshut, 2024-10-29

import qrcode; qrcode.make('https://www.jbusse.de/gendifs/schnitzel-intro.html')
_images/347adbdf04e6dde8da579684d343f26a07754b32f3fd1d4b9bffaec96de0e50f.png

Einführendes Beispiel:

  • Q: Was ist der Unterschied zwischen einem Schweineschnitzel und einem Kalbschnitzel?

    • A: Ein Schweineschnitzel stammt vom Schwein, ein Kalbschnitzel vom Kalb.

  • Q: Was ist der Unterschied zwischen einem Schweineschnitzel und einem Kinderschnitzel?

    • A: Ein Schweineschnitzel stammt vom Schwein; aber ein Kinderschnitzel stammt nicht vom Kind, sondern hat Kinder als Zielgruppe.

  • Q: Und wie passt ein Jägerschnitzel dazu?

    • A: Ein Jägerschnitzel hat eine Pilzsoße.

Begriffe zu unterscheiden, zu schärfen, zueinander in Beziehung zu setzen ist eine grundlegende analytische Tätigkeit jedes wissenschaftlichen Handelns.

Begriffssysteme zu entwickeln ist eine zentrale Aufgabe akademischer Lehre. Oft werden solche informell visualisiert. Eine Herausforderung besteht darin, solche informellen Begriffsmodelle auch computational zur Wirkung gelangen zu lassen. Mit Semantic Web Ontologien – heute vorwiegend in der Logik-Sprache Web Ontology Language, kurz OWL – lassen sich Begriffs-Systeme formallogisch axiomatisieren. Allerdings ist OWL schwer zu erlernen, und komplexere OWL-Ontologien sind sogar für Experten sehr fehleranfällig in der Erstellung und Wartung.

GenDifS ist eine (sog. “höhere”) Sprache zur grafischen, hier Mindmap-basierten Notation von speziellen Ontologien, nämlich (a) einer OWL-basierten Taxonomie zur Klassifikation von Entitäten auf Basis ihrer Eigenschaften, und (b) einem zugehörigen Begriffs-Baum auf Basis von SKOS. In Erweiterung einer reinen OWL-Ontologie unterstützt GenDifS zusätzlich auch einfache Integritäts-Tests einer Wissensbasis.

Im Kern orientiert sich GenDifS am Klassifikationsschema Genus proximum und differentia specifica, das seit über 2000 Jahren bekannt ist. In unserem Beispiel ist damit gemeint: Wenn X ein Schnitzel ist (genus); und X eine Eigenschaft “stammt von” mit dem Wert “Schwein” hat (differentia specifica): Dann können wir schlussfolgern, dass X ein Schweineschnitzel ist (species).

Es gibt viele Begriffe von Ontologie in der Literatur. Wir verstehen Ontologie als eine Unterschiedslehre. Um Begriffe unterscheiden, schärfen, zueinander in Beziehung setzen, als formales Modell darstellen zu können müssen müssen wir verstehen, welche Unterschiede einen Unterschied machen. Einen Begriff zu verstehen heißt zu verstehen, welchen Unterschied er macht.

Exkurs: Ist das überhaupt KI? Denn wir setzen in GenDifS ja ein ausdrucksstarkes Deduktionssystem (OWL-RL ) ein.

An AI system is a machine-based system that, for explicit or implicit objectives, infers, from the input it receives, how to generate outputs such as predictions, content, recommendations, or decisions that can influence physical or virtual environments. Different AI systems vary in their levels of autonomy and adaptiveness after deployment. (https://oecd.ai/en/wonk/definition)

(1) ‘AI system’ means a machine-based system that is designed to operate with varying levels of autonomy and that may exhibit adaptiveness after deployment, and that, for explicit or implicit objectives, infers, from the input it receives, how to generate outputs such as predictions, content, recommendations, or decisions that can influence physical or virtual environments; (EU AI Act, Article 3: Definitions, https://artificialintelligenceact.eu/article/3/

A key characteristic of AI systems is their capability to infer. The techniques that enable inference while building an AI system include […] logic- and knowledge-based approaches that infer from encoded knowledge or symbolic representation of the task to be solved. (https://artificialintelligenceact.eu/recital/12/)

GenDifS ist trotz der Verwendung eines Reasoners keine KI in Sinne des EU AI Act:

Moreover, the definition should be based on key characteristics of AI systems that distinguish it from simpler traditional software systems or programming approaches and should not cover systems that are based on the rules defined solely by natural persons to automatically execute operations. […] The capacity of an AI system to infer transcends basic data processing by enabling learning, reasoning or modelling. (https://artificialintelligenceact.eu/recital/12/)

Die OWL Inferencing-Regeln werden nicht von der Software gelernt, sondern sind manuell vom Menschen formuliert; das System arbeitet rein deterministisch und hat keinerlei Autonomie, keinerlei Fähigkeit zur Adaption; Lernen findet an keiner Stelle statt. Letztlich bewegen wir uns im Gebiet von Good old fashioned artificial intelligence (GOFAI) – ein Gebiet, das ohne die überzogenen Visionen der KI-Gründungsväter im heutigem Kontext von LLM vielleicht eine robuste Hndwerkstechnik ist, aber auch nicht mehr. Bis vor dem Erscheinen von LLM war das noch KI vom Feinsten, heute ist OWL immerhin noch ein schönes Beispiel für schöne deklarative Programmierung. Ende Exkurs.

Wir führen im Folgenden am Schnitzel-Beispiel diese Idee weiter aus.

Schnitzel vom Schwein, vom Kalb, vom Kind?#

Beispiel 1:

Schnitzel
    Schweineschnitzel
    Kalbschnitzel

Ein entscheidender Unterschied zwischen einem Schweine- und einem Kalbschnitzel ist offensichtlich die Herkunft des Fleisches. Außerdem ist Schweinefleisch preisgünstiger, ein Kalbschnitzel zarter. Es gibt also viele Möglichkeiten, Schweine- und Kalbschnitzel voneinander zu unterscheiden. Wer eine Ontologie baut ist interessiert daran zu eruieren, welcher der vielen Unterschiede in diesem Fall der eigentlich relevante ist.

Wir nehmen im Folgenden an, dass der mehr oder weniger essentielle Unterschied zwischen Schweine- und Kalbschnitzel die Herkunft, also Schwein oder Kalb lautet, jedenfalls essentieller als der Preis oder die Zartheit.

Beispiel 2:

Schnitzel
    Kinderschnitzel
    Seniorenschnitzel

In Restaurants werden als Kinderschnitzel typischerweise preisgünstige und dick panierte Schweineschnitzel, als Seniorenschnitzel eher hochpreisige und premiumgarnierte Kalbschnitzel angeboten. Exakt wie Schweine- und Kalbschnitzel unterscheiden sich Kinder- und Seniorenschnitzel im Preis und in der Zartheit, aber vermutlich sind auch das nicht die essentiellen Unterschiede. Wir wollen annehmen, dass der entscheidende Unterschied hier Kind oder Senior lautet.

Dabei fällt uns sofort auf, dass unserer bisherigen Art und Weise, Unterscheidungen zu treffen, eine Schwachstelle hat: In Beispiel 1 ist bei Schwein oder Kalb die Herkunft des Schnitzels gemeint, in Beispiel 2 ist bei Kind oder Senior die angesprochene Zielgruppe gemeint.

Wir halten fest: Es genügt nicht, nur Kind oder Senior oder Schwein oder Kalb zur Unterscheidung heranzuziehen, sondern wir sollten auch angeben, ob wir hier über die Herkunft oder die Zielgruppe sprechen.

Beispiel 3:

Schnitzel
    Schweineschnitzel
    Kinderschnitzel

Wer auf solch eine Unterscheidung trifft, mag zurecht bemerken: “Da geht einiges durcheinander, so kann man das nicht machen”. Wodurch entsteht das Problem? offensichtlich ist beim Schweineschnitzel das Schwein als Herkunft, beim Kinderschnitzel das Kind als Zielgruppe gemeint.

Im folgenden Beispiel werden Schweineschnitzel nach Sauce weiter unterschieden:

Beispiel 4:

Schnitzel
    Jägerschnitzel

When KOSs are not Simple Anymore#

  • KOS: Knowledge Organization System

  • SKOS: Simple Knowledge Organization System, https://www.w3.org/2004/02/skos/; eine weit verbreitete Thesaurus-Norm aus dem Semantic Web Technology Stack

Die folgende Darstellung folgt der Notation von “Collections of Concepts” im SKOS-Primer, Section 4: Advanced SKOS: When KOSs are not Simple Anymore und gibt die einzelnen Beipiele zusammengefasst wider:

Schnitzel
    <Schnitzel nach Herkunft>
        Schweineschnitzel
        Kalbschnitzel
    <Schnitzel nach Zielgruppe>
        Kinderschnitzel
        Seniorenschnitzel
    <Schnitzel nach Sauce>
        Jägerschnitzel

In dieser Darstellung sind folgende Aussagen implizit enthalten:

  • Unser Schnitzel hat als Herkunft entweder Schwein oder Kalb, beides zugleich ist biologisch nicht möglich.

  • Auch Senioren bestellen für sich selbst bisweilen ein Kinderschnitzel, wenn sie Panade mögen und/oder die Rente knapp ist. (Bei unserem Imbiss an der Ecke unterscheiden sich Kinder- und Seniorenschnitzel nur in der Beilage Majo oder Dosengemüse).

  • Herkunft und Zielgruppe sind in anderer Weise unterschiedlich als Kinder und Senioren oder Schweine- und Kalbschnitzel.

Offensichtlich lassen sich die jeweiligen Schnitzel-Typen gruppieren, z.B. Schnitzel nach Herkunft, Schnitzel nach Zielgruppe.

  • Innerhalb einer Schnitzel-Gruppe haben wir ein exklusives Entweder-Oder (XOR). Mathematisch ist das eine Zerlegung in paarweise disjunkte Teilmengen, eine Partitionierung

  • Ein Schnitzel lässt sich leicht durch jede einzelne Schnitzel-Gruppe genauer beschreiben, hier herrscht keine Konkurrenz: Herkunft oder Zielgruppe eines Schnitzels sind paarweise unabhängige Dimensionen (Achsen) zur Beschreibung von Schnitzeln, Schweine- / Kalb- oder Kinder- / Senioren-Schnitzel sind unterschiedliche Werte der jeweiligen Achse. (Und auch Einkaufspreis und Finanzkraft sind Achsen, dazu später mehr).

Hier sind wir unvermittelt im Feld der philosophischen Ontologie angekommen: In unserem Beispiel sind “Schwein” und “Kalb” Entitäten aus der biologischen Welt, und “Kind” und “Senior” sind Entitäten aus der sozialen Lebenswelt. Ganz anders hingegen “Herkunft” und “Zielgruppe”: Auch das sind Entitäten aus der sozialen Lebenswelt, die wir aber in unserem Beispiel - in anderen Beispielen und Kontexten mag das ganz anders sein - in einer zusätzlichen Funktion, nämlich zur Unterscheidung von Unterscheidungen verwenden.

Die vollständige Schnitzel-Ontologie in GenDifS#

mm_txt = """
TAXONOMY schnitzel_intro
  Schnitzel
    BY hat_Herkunft FROM Tier
        Schweineschnitzel
          SOME Schwein
        Kalbschnitzel
          SOME Kalb
    BY wendet_sich_an FROM Zielgruppe
        Kinderschnitzel
          SOME Kind
        Seniorenschnitzel
          SOME Senior
    BY serviert_an FROM Sauce
        Jägerschnitzel
          SOME Pfifferlinge
"""
import gd071
mm = gd071.GenDifS(from_string=mm_txt)
mm.compile()
schnitzel_intro = mm.taxonomies_by_name["schnitzel_intro"]

In einer GenDifS-Mindmap können verschiedene Taxonomien unabhängig voneinander angelegt werden; hier haben wir nur das Taxonomie-Objekt mm.taxonomies_by_name["schnitzel_intro"]. Jede Taxonomie wird dann in verschiedene Ontologie-“Sprachen” exportiert, typischerweise RDFS, OWL (genauer: OWL1-Lite) und SKOS.

schnitzel_intro.rdf_graphs
{'SKOS': <Graph identifier=N8ac3c1f5896b4f24b835f01eb72f981f (<class 'rdflib.graph.Graph'>)>,
 'RDFS': <Graph identifier=Neba69a7ccc544d23a5e51b58d0a344b9 (<class 'rdflib.graph.Graph'>)>,
 'RDFStest': <Graph identifier=N558a632be6cb448ba89d72abe436bbdc (<class 'rdflib.graph.Graph'>)>,
 'OWL': <Graph identifier=N1f0b79084ce04da585a129bb0e3554a6 (<class 'rdflib.graph.Graph'>)>,
 'OWLtest': <Graph identifier=Nba502b3fb31047db967f38c22aac5a04 (<class 'rdflib.graph.Graph'>)>,
 'DE': <Graph identifier=Nae93ee8dc49b427686315a2371d3745d (<class 'rdflib.graph.Graph'>)>}

Exemplarisch schauen wir und aus der ttl-Serialisierung der SKOS-Version alle Absätze an, die etwas mit “Kind” oder “Schwein” zu tu haben. (Die Utility-Function gd071.focus() zeigt in einer Turtle- (ttl-) Serialisierung alle Absätze an, die einen der angegebenen Strings enthalten – eine triviale, aber funktionale Methode, um aus umfangreichen ttl-Code wesentliche Zusammenhänge herauszufiltern).

schnitzel_intro_skos_ttl = schnitzel_intro.rdf_graphs["SKOS"].serialize()

focus = ["Schwein", "Kind"]
print( gd071.focus( focus, schnitzel_intro_skos_ttl ) )
cpt:BY_4_intersection a skos:Collection ;
    rdfs:label "cpt:Schnitzel BY cpt:hat_Herkunft FROM cpt:Tier" ;
    skos:member cpt:Kalbschnitzel,
        cpt:Schweineschnitzel .

cpt:BY_9_intersection a skos:Collection ;
    rdfs:label "cpt:Schnitzel BY cpt:wendet_sich_an FROM cpt:Zielgruppe" ;
    skos:member cpt:Kinderschnitzel,
        cpt:Seniorenschnitzel .

cpt:Kind a skos:Concept ;
    skos:broader cpt:Zielgruppe .

cpt:Schwein a skos:Concept ;
    skos:broader cpt:Tier .

cpt:Kinderschnitzel a skos:Concept ;
    skos:broader cpt:Schnitzel .

cpt:Schweineschnitzel a skos:Concept ;
    skos:broader cpt:Schnitzel .
# kompletter SKOS-Export
print( schnitzel_intro_skos_ttl )
@prefix cpt: <http://example.net/namespace/cpt#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

cpt:BY_14_intersection a skos:Collection ;
    rdfs:label "cpt:Schnitzel BY cpt:serviert_an FROM cpt:Sauce" ;
    skos:member cpt:Jägerschnitzel .

cpt:BY_4_intersection a skos:Collection ;
    rdfs:label "cpt:Schnitzel BY cpt:hat_Herkunft FROM cpt:Tier" ;
    skos:member cpt:Kalbschnitzel,
        cpt:Schweineschnitzel .

cpt:BY_9_intersection a skos:Collection ;
    rdfs:label "cpt:Schnitzel BY cpt:wendet_sich_an FROM cpt:Zielgruppe" ;
    skos:member cpt:Kinderschnitzel,
        cpt:Seniorenschnitzel .

cpt:Kalb a skos:Concept ;
    skos:broader cpt:Tier .

cpt:Kind a skos:Concept ;
    skos:broader cpt:Zielgruppe .

cpt:Pfifferlinge a skos:Concept ;
    skos:broader cpt:Sauce .

cpt:Schwein a skos:Concept ;
    skos:broader cpt:Tier .

cpt:Senior a skos:Concept ;
    skos:broader cpt:Zielgruppe .

cpt:hat_Herkunft a rdfs:Property ;
    rdfs:subPropertyOf skos:related .

cpt:serviert_an a rdfs:Property ;
    rdfs:subPropertyOf skos:related .

cpt:wendet_sich_an a rdfs:Property ;
    rdfs:subPropertyOf skos:related .

cpt:Jägerschnitzel a skos:Concept ;
    skos:broader cpt:Schnitzel .

cpt:Kalbschnitzel a skos:Concept ;
    skos:broader cpt:Schnitzel .

cpt:Kinderschnitzel a skos:Concept ;
    skos:broader cpt:Schnitzel .

cpt:Sauce a skos:Concept .

cpt:Schweineschnitzel a skos:Concept ;
    skos:broader cpt:Schnitzel .

cpt:Seniorenschnitzel a skos:Concept ;
    skos:broader cpt:Schnitzel .

cpt:schnitzel_intro a skos:ConceptScheme .

cpt:Tier a skos:Concept .

cpt:Zielgruppe a skos:Concept .

cpt:Schnitzel a skos:Concept ;
    skos:inScheme cpt:schnitzel_intro .

[] owl:imports <http://www.w3.org/TR/skos-reference/skos-owl1-dl.rdf> .