Skip to content

Feature-Konzept: Grammatik-API / Progressionsanalyse


Anwendungsfall

Texte in Lehrbüchern, z.B. prima, wo bestimmte grammatikalische Begriffe (Aktiv, Indikativ, andere Tempora) noch unbekannt sind. S der 5. Jgst. klickt "laudat" an und soll nur die "3. Ps. Sg." sehen. Im Moment werden alle grammatikalischen Kategorien angezeigt (Akt. Ind. 3. Ps. Sg. Präs.).

Funktionsprinzip

  • Grammatik kann einer Lerneinheit zugeordnet werden.
  • Aus den Grammatiken mehrerer Lerneinheiten kann eine kumulative Liste erstellt werden. ( = Grammatik BIS Lerneinheit X)
  • Die Resultate der FormAnalysator-API werden mittels einer weiterer Methode (applyGrammarScope()) erweitert.
  • In dieser Methode werden die Resultate der FormAnalysator-API mit der kumulativen Grammatikliste verglichen und nicht bekannte Grammatikalische Kategorien herausgefiltert.
  • Die Methode verweist auf eine Service-Klasse, die die Grammatik-Regeln verwaltet.

Wissenswertes für die Entwicklung

  • Formanalyse-Endpoint, der die die FormAnalysator-API aufruft: /analyze/{form}

  • Dieser gibt folgende mit /analyze/{amor} folgenden JSON-String zurück:

    java
    // = FormAnalysis
    {
    "Form": "amor",
    // Die Config-Optionen die dem Konstruktor übergeben werden. Hier ist ggf. die Eigenschaft `scope_grammar` möglich, um die Grammatik-Regeln zu definieren.
    "config": {
    "show_pos": true,
    "show_morpho": true,
    "show_bedeutungen": true,
    "show_accepted_reading": true
    },
    "Lemmata": [
    // = LemmaAnalysis
    {
      "id": "460",
      "lemma": "amare",
      "info": ", amo, amavi, amatum",
      "pos": "verb",
      "morpho": "[\"v1spip---\"]",
      "bedeutung": "lieben, mögen",
      "is_accepted_reading": false
    },
    {
      "id": "173",
      "lemma": "amor",
      "info": ", amoris",
      "pos": "nomen",
      "morpho": "[\"n-s---mn-\", \"n-s---mv-\"]",
      "bedeutung": "die Liebe",
      "is_accepted_reading": false
    }
    ],
    "Format": "hermeneusv3"
  • Feature-Test für die FormAnalysator-API: test_an_analysis_is_requested_on_a_scope_of_vocab (Kann mit PHPUnit für einen bequemen Entwicklugnsworkflow verwendet werden.)

  • Der JSON-String der Eigenschaft morpho wird im Frontend von einer Vue-Componente interpretiert.

Naming-Conventions (Vorschlag für eine Refaktorierung 💩, gerne weitere Vorschläge ergänzen)

  • FormAnalysis: Resultat, das vom FormAnalysator (get()-Methode) zurückgegeben wird und alle Informationen zur Analyse enthält.
  • LemmaAnalysis: Einzelnes JSON-Objekt, das die Analyse eines einzelnen Lemma enthält.
  • GrammarScope: Klasse, die ein Regelset für erlaubte Grammatikalische Kategorien enthält, die aus einer kumulativen Liste LerneinheitGrammatik erstellt wurde.
  • MorphoAnalysis: Grammatikalische Kategorien, die in der Eigenschaft morpho eines LemmaAnalysis-Objekts enthalten sind.
  • MorphoString: String, der die Grammatikalischen Kategorien eines Lemmas enthält. (z.B. "v1spip---")
  • MorphoTag: Einzelne Grammatikalische Kategorie eines Lemmas. (z.B. v, 1, s, p), die dann als Verb, 1. Person, Singular, Präsens interpretiert werden können.

Aufgabenverteilung

  • Blumenfelder
    • Feature: Grammatik kann Lerneinheit zugeordnet werden.
    • Grammatik-Klasse erweitern: Wie wird Grammatik grundsätzlich erfasst? Ggd. known_morpho als Tabellenspalte
      • Vermutlich
    • GrammarScope-Klasse/Model erstellen, die die Grammatik-Regeln enthält.
      • In dieser soll festgelegt sein, ob
        • Unbekannte Tags herausgefiltert werden sollen
        • Das Analyseergebnis der unbekannten Form wieder gelöscht werden soll (=> Unbekannte Grammatik => Kein Ergebnis)
    • GrammarScope-Methode compose() erstellen, die die kumulative Grammatik-Regeln aus verschiedener LerneinheitGrammatik erstellt.
  • Hotz:
    • FormAnalysator-Klasse erweitern: applyGrammarScope($GrammarScope)-Methode erstellen, die die Grammatik-Regeln anwendet und die MorphoStrings filtert.

Testszenario:

Codierung der bekannten Grammatik:

  • a-Konjugation
    Ruleset, das in der Datenbankspalte known_morpho gespeichert ist:
    java
    [
      {
        "v": {
          "1": [
            "1",
            "2",
            "3"
          ],
          "2": [
            "s",
            "p"
          ],
          "7": [
            "1"
          ]
        }
      }
    ]

Erklärung: An Stringposition 1 sind die Werte 1, 2 und 3 erlaubt, an Stringposition 2 sind s und p erlaubt, an Position 7 ist 1 erlaubt. Alles andere wird entfernt.

  • e-Konjugation
    java
    [
      {
        "v": {
          "1": [
            "1",
            "2",
            "3"
          ],
          "2": [
            "s",
            "p"
          ],
          "7": [
            "2"
          ]
        }
      }
    ]
  • i-Konjugation
    java
    [
      {
        "v": {
          "1": [
            "1",
            "2",
            "3"
          ],
          "2": [
            "s",
            "p"
          ],
          "7": [
            "4"
          ]
        }
      }
    ]

Die Rulesets funktionieren additiv, müssen also nach Wortart und Stringposition gruppiert werden, sodass ein gemeinsames additives Ruleset entsteht:

java
[
  {
    "v": {
      "1": [
        "1",
        "2",
        "3"
      ],
      "2": [
        "s",
        "p"
      ],
      "7": [
        "1",
        "2",
        "4"
      ]
    }
  }
]

Mit diesem Ruleset kann nun der MorphoString modifiziert werden.

Für laudamus wird zunächst v1ppia---- zurückgegeben (bei LatinWordnet v1ppia--1-
=> Übrigbleiben soll v1p------- bzw. v1p-----1-