import cbtc_Pipe as Pipe # Diese Zeile lädt ein von mir entwickeltes regelbasiertes Sprachmodell. (Es kommt keinerlei maschinelles Lernen vor).
from pprint import pp as pprint # zur besseren Lesbarkeit
Bsp = "Die Absätze 1 und 2 sind auf die nach den §§ 70 und 71 geschützten Ausgaben, die nach § 72 geschützten Lichtbilder, die nach § 77 Abs. 2 Satz 1, §§ 85, 87, 94 und 95 geschützten Bild- und Tonträger \
und die nach § 87b Abs. 1 geschützten Datenbanken entsprechend anzuwenden."
Vereinfacht könnte man diesen Satz als "<Aufzählung_1> ist auf <Aufzählung_2> entsprechend anzuwenden." schreiben. (Numerus vom finiten Teil der Verbphrase (VP) angepasst ("ist anzuwenden" statt "sind anzuwenden")). Das Adjektiv "entsprechend" gehört nicht direkt zur VP, sondern ist adverbiales Adjektiv (AdjA) der VP.
In diesem Satz ist <Aufzählung_1> das NominativObjekt (NO) der VP und <Aufzählung_2> ist ein PräpositionalObjekt (PO), wobei die Präposition "auf" eine 'stehende Phrase' mit dem Vollverb der Verbphrase ("anwenden") bildet ("anwenden auf"), daher kann es als verbgebundenes PO (POV) bezeichnet werden.
Im Bsp enthalten aber die Aufzählungselemente von <Aufzählung_2> teilweise wieder Aufzählungen (["den §§ 70 und 71", "§ 77 Abs. 2 Satz 1, §§ 85, 87, 94 und 95", "Bild- und Tonträger"]).
Alle Kommata im Bsp sind also Aufzählungskommata ("\$,,") und keine Verbphrasenkommata ("\$,"). Auch werden alle Konnektoren (KONN) ("und") durch die Aufzählungen 'verbraucht' und konnektieren daher also keine Verbphrasen (diese werden daher als "KONN-" getäggt).
Alle Elemente von <Aufzählung_2> haben den gleichen Aufbau, "<die|ARTB> <nach|APRR> <P$PPK> <geschützten|ADJPP> <NN>".
Dabei wird durch den bestimmten Artikel (ARTB) eine Nominalphrase (NP) 'geöffnet', in die eine präpositionale Ergänzung (PE) eingebettet ist ("nach <Paragrahpenkette>" (\$PPK, hier aber durch Präposition gebunden, daher P\$PPK)). Das "nach" als Präposition der PE bindet dabei an das ADJPP ("geschützt nach") der NP (daher "PEAdj") und beantwortet die für Juristen so wichtige Frage nach der Rechtsgrundlage.
Angemerkt sei nochmal ausdrücklich, dass alle "die" im Satz bestimmte Artikel sind, die zur restlichen NP (<ADJPP> <NN>) gehören und somit keine Pronomen sind (im Gegensatz zum "die" nach dem letzten Komma in diesem Satz).
Ein Sprachmodell sollte alle diese Abhängigkeiten und Beziehungen abbilden können.
Erg = Pipe.analysiere(Bsp, default_GVO="UrhG") # Das Bsp durch das Sprachmodell analysieren lassen, als zusätzliches Argument wird das Gesetzeskürzel ("UrhG") hier mit an die Funktion übergeben, dazu später mehr.
print('VP:\t', "sind anzuwenden") # Der erhöhten Lesbarkeit wegen hier explizit angegeben
for k, v in Erg['Objekte']['VP_0'].items(): # Code zum Ausgeben der Objekte der ersten VP (VP_0) (hier auch die einzige VP im Satz) mit erhöhter Lesbarkeit der Ausgabe (dafür mit schwer leserlicher Eingabe)
if not isinstance(v[0], list):
print("%s:\t %s" % (k, Pipe.Chunker.bilde_Text_aus_Lexemen(v)))
else:
print("%s:\t %s" % (k, [Pipe.Chunker.bilde_Text_aus_Lexemen(e) for e in v]))
VP: sind anzuwenden AdjA: entsprechend NO: Die Absätze 1 und 2 POV: ['auf die geschützten Ausgaben', 'die geschützten Lichtbilder', 'die geschützten Bild- und Tonträger', 'die geschützten Datenbanken']
Wie man dieser vereinfachten Ausgabe entnehmen kann, wurde der Hauptstruktur des Satzes richtig analysiert (Die "[ ]" symbolisieren eine Liste, deren Elemente die Hauptelemente der <Aufzählung_2> sind).
Es wurden aber auch die Paragraphenketten richtig erkannt und verarbeitet:
Erg['Absätze'][0]['PPKn'] # Die genannten Paragraphenketten, hier wird das an die Analysefunktion übergegbene "UrhG" genutzt, da Verweise innerhalb eines Gesetzes ohne Nennung des Gesetzes stehen.
# Die $PPK_0 fehlt hier, da diese nicht vollständig im Satz steht, da nur III des § 119 UrhG hier als Beispiel genutzt wird. Wird das gesamte Gesetz analysiert, erkennt die Funktion das es sich um eine Referenz auf I & II des § 119 UrhG handelt.
# Diese Strings sollten als Keywords in eine Datenbank (bspw. ein Elasticsearch), daher ohne "§" und mit allen höheren Ebenen einzeln:
# Genannt wurde nur "77 II 1", es sollte dann aber auch "77 II" und "77" in den Index, damit beim Suchen nach bspw. Referenzen auf "77 II" auch dieser Satz gefunden wird (obwohl die Referenz noch eine Ebene tiefer geht und auch den Satz nennt).
['70 II UrhG', '70 UrhG', '71 UrhG', '72 UrhG', '77 II 1 UrhG', '77 II UrhG', '77 UrhG', '85 UrhG', '87 UrhG', '94 UrhG', '95 UrhG', '87b I UrhG', '87b UrhG']
Als Referenz folgt noch das komplexe Analyseergebnis, dabei gibt es folgende Spalten:
Num = Nummerierung der Token (Textschnipsel)
sNum = Nummerierung der Sätze (hier nur ein einziger Satz, daher immer 0 (Computer fangen das zählen nicht bei 1, sondern bei 0 an))
Lex = Lexem (der Text des Schnipsels wie er im Satz vorkam. Die 'Oberflächenform')
Lem = Lemma (die Grundform des Schnipseltextes, verbessert den Index und erleichtert damit das Suchen.)
pTag = Part-of-Speech Täg (die Wortklasse des Token, angelehnt an das STTS (Stuttgart Tübingen Täg Set))
cTag = Chunktäg (Elemente eine Satzgliedes tragen den selben cTag, aber auch Elemente einer Paragraphenkette)
sR = syntaktische Relation
Hinweise:
- Die Spalten von oben nach unten lesen.
- Das Lemma von "Bild-" ist "Bildträger", denn zum Lemma gehört der Kopf, der bei Komposita aber häufig nur durch ein "-" symbolisiert wird.
- Innerhalb der () im sR-Key steht der Bezug: "NO(VP_0)" ist also das NominativObjekt der VP_0. Bei den PEAdj steht dort t_
, dies ist zu lesen als: Bezug ist der Token mit der "Num" . Der Chunk P$PPK_1 bezieht sich also auf Token 14. - Nach der ersten "==" Zeile folgt nochmals eine komplexere Ausgabe, von dem was von "In [3]" geprintet wurde.
print(Erg)
Num: 0 sNum: 0 Lex: Die Lem: d pTag: ARTB+ cTag: $PPK_0 sR: {'NO(VP_0)'}
Num: 1 sNum: 0 Lex: Absätze Lem: Absatz pTag: $P cTag: $PPK_0 sR: {'NO(VP_0)'}
Num: 2 sNum: 0 Lex: 1 Lem: pTag: CARD cTag: $PPK_0 sR: {'NO(VP_0)'}
Num: 3 sNum: 0 Lex: und Lem: und pTag: KONN cTag: $PPK_0 sR: {'NO(VP_0)'}
Num: 4 sNum: 0 Lex: 2 Lem: pTag: CARD cTag: $PPK_0 sR: {'NO(VP_0)'}
Num: 5 sNum: 0 Lex: sind Lem: sein pTag: VAFIN cTag: VP_0 sR: set()
Num: 6 sNum: 0 Lex: auf Lem: auf pTag: APPR cTag: PP_1 sR: {'POV(VP_0)'}
Num: 7 sNum: 0 Lex: die Lem: d pTag: ARTB cTag: PNP_39_0|AZ sR: {'POV(VP_0)'}
Num: 8 sNum: 0 Lex: nach Lem: nach pTag: APPR cTag: PP_2 sR: {'PEAdj(t_14)'}
Num: 9 sNum: 0 Lex: den Lem: d pTag: ARTB cTag: P$PPK_1 sR: {'PEAdj(t_14)'}
Num: 10 sNum: 0 Lex: §§ Lem: pTag: $P cTag: P$PPK_1 sR: {'PEAdj(t_14)'}
Num: 11 sNum: 0 Lex: 70 Lem: pTag: CARD cTag: P$PPK_1 sR: {'PEAdj(t_14)'}
Num: 12 sNum: 0 Lex: und Lem: und pTag: KONN cTag: P$PPK_1 sR: {'PEAdj(t_14)'}
Num: 13 sNum: 0 Lex: 71 Lem: pTag: CARD cTag: P$PPK_1 sR: {'PEAdj(t_14)'}
Num: 14 sNum: 0 Lex: geschützten Lem: geschützt pTag: ADJPP cTag: PNP_39_0|AZ sR: {'POV(VP_0)'}
Num: 15 sNum: 0 Lex: Ausgaben Lem: Ausgabe pTag: NN cTag: PNP_39_0|AZ sR: {'POV(VP_0)'}
Num: 16 sNum: 0 Lex: , Lem: pTag: $,, cTag: $,, sR: set()
Num: 17 sNum: 0 Lex: die Lem: d pTag: ARTB cTag: PNP_39_1|AZ sR: {'POV(VP_0)'}
Num: 18 sNum: 0 Lex: nach Lem: nach pTag: APPR cTag: PP_3 sR: {'PEAdj(t_21)'}
Num: 19 sNum: 0 Lex: § Lem: pTag: $P cTag: P$PPK_2 sR: {'PEAdj(t_21)'}
Num: 20 sNum: 0 Lex: 72 Lem: pTag: CARD cTag: P$PPK_2 sR: {'PEAdj(t_21)'}
Num: 21 sNum: 0 Lex: geschützten Lem: geschützt pTag: ADJPP cTag: PNP_39_1|AZ sR: {'POV(VP_0)'}
Num: 22 sNum: 0 Lex: Lichtbilder Lem: Lichtbild pTag: NN cTag: PNP_39_1|AZ sR: {'POV(VP_0)'}
Num: 23 sNum: 0 Lex: , Lem: pTag: $,, cTag: $,, sR: set()
Num: 24 sNum: 0 Lex: die Lem: d pTag: ARTB cTag: PNP_39+85_3|AZ sR: {'POV(VP_0)'}
Num: 25 sNum: 0 Lex: nach Lem: nach pTag: APPR cTag: PP_4 sR: {'PEAdj(t_41)'}
Num: 26 sNum: 0 Lex: § Lem: pTag: $P cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 27 sNum: 0 Lex: 77 Lem: pTag: CARD cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 28 sNum: 0 Lex: Abs. Lem: pTag: $P cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 29 sNum: 0 Lex: 2 Lem: pTag: CARD cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 30 sNum: 0 Lex: Satz Lem: Satz pTag: $P cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 31 sNum: 0 Lex: 1 Lem: pTag: CARD cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 32 sNum: 0 Lex: , Lem: pTag: $, cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 33 sNum: 0 Lex: §§ Lem: pTag: $P cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 34 sNum: 0 Lex: 85 Lem: pTag: CARD cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 35 sNum: 0 Lex: , Lem: pTag: $, cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 36 sNum: 0 Lex: 87 Lem: pTag: CARD cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 37 sNum: 0 Lex: , Lem: pTag: $, cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 38 sNum: 0 Lex: 94 Lem: pTag: CARD cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 39 sNum: 0 Lex: und Lem: und pTag: KONN cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 40 sNum: 0 Lex: 95 Lem: pTag: CARD cTag: P$PPK_3 sR: {'PEAdj(t_41)'}
Num: 41 sNum: 0 Lex: geschützten Lem: geschützt pTag: ADJPP cTag: PNP_39+85_3|AZ sR: {'POV(VP_0)'}
Num: 42 sNum: 0 Lex: Bild- Lem: Bildträger pTag: NN- cTag: PNP_39+85_3|AZ sR: {'POV(VP_0)'}
Num: 43 sNum: 0 Lex: und Lem: und pTag: KONN- cTag: PNP_39+85_3|AZ sR: {'POV(VP_0)'}
Num: 44 sNum: 0 Lex: Tonträger Lem: Tonträger pTag: NN cTag: PNP_39+85_3|AZ sR: {'POV(VP_0)'}
Num: 45 sNum: 0 Lex: und Lem: und pTag: KONN- cTag: KONN|AZ sR: set()
Num: 46 sNum: 0 Lex: die Lem: d pTag: ARTB cTag: PNP_39_4|AZ sR: {'POV(VP_0)'}
Num: 47 sNum: 0 Lex: nach Lem: nach pTag: APPR cTag: PP_5 sR: {'PEAdj(t_52)'}
Num: 48 sNum: 0 Lex: § Lem: pTag: $P cTag: P$PPK_4 sR: {'PEAdj(t_52)'}
Num: 49 sNum: 0 Lex: 87b Lem: 87b pTag: CARDBK cTag: P$PPK_4 sR: {'PEAdj(t_52)'}
Num: 50 sNum: 0 Lex: Abs. Lem: pTag: $P cTag: P$PPK_4 sR: {'PEAdj(t_52)'}
Num: 51 sNum: 0 Lex: 1 Lem: pTag: CARD cTag: P$PPK_4 sR: {'PEAdj(t_52)'}
Num: 52 sNum: 0 Lex: geschützten Lem: geschützt pTag: ADJPP cTag: PNP_39_4|AZ sR: {'POV(VP_0)'}
Num: 53 sNum: 0 Lex: Datenbanken Lem: Datenbank pTag: NN cTag: PNP_39_4|AZ sR: {'POV(VP_0)'}
Num: 54 sNum: 0 Lex: entsprechend Lem: entsprechend pTag: ADJPP cTag: AP_0 sR: {'AdjA(VP_0)'}
Num: 55 sNum: 0 Lex: anzuwenden Lem: anwenden pTag: VVIZU cTag: VP_0 sR: set()
Num: 56 sNum: 0 Lex: . Lem: pTag: $. cTag: $. sR: set()
========================================================================================================================================================================================================
Num: 5 sNum: 0 Lex: sind Lem: sein pTag: VAFIN cTag: VP_0 sR: set()
Num: 55 sNum: 0 Lex: anzuwenden Lem: anwenden pTag: VVIZU cTag: VP_0 sR: set()
----------------------------------------------------------------------------------------------------
{'AdjA': [{'Lexem': 'entsprechend', 'Span': (248, 260), 'Num': 54, 'pTag': 'ADJPP', 'Lemma': ['entsprechend'], 'Flex': {'P--'}, 'sNum': 0, 'cTag': 'AP_0', 'sR': {'AdjA(VP_0)'}}],
'NO': [{'Lexem': 'Die', 'Span': (0, 3), 'Num': 0, 'pTag': 'ARTB+', 'Lemma': ['d'], 'cTag': '$PPK_0', 'sNum': 0, 'Flex': {'NSF', 'NPM', 'NPN', 'NPF'}, 'sR': {'NO(VP_0)'}},
{'Lexem': 'Absätze', 'Span': (4, 11), 'Num': 1, 'pTag': '$P', 'cTag': '$PPK_0', 'Lemma': ['Absatz'], 'sNum': 0, 'Flex': {'NSM'}, 'sR': {'NO(VP_0)'}},
{'Lexem': '1', 'Span': (12, 13), 'Num': 2, 'pTag': 'CARD', 'cTag': '$PPK_0', 'sNum': 0, 'sR': {'NO(VP_0)'}},
{'Lexem': 'und', 'Span': (14, 17), 'Num': 3, 'pTag': 'KONN', 'Lemma': ['und'], 'cTag': '$PPK_0', 'sNum': 0, 'sR': {'NO(VP_0)'}},
{'Lexem': '2', 'Span': (18, 19), 'Num': 4, 'pTag': 'CARD', 'cTag': '$PPK_0', 'sNum': 0, 'sR': {'NO(VP_0)'}}],
'POV': [[{'Lexem': 'auf', 'Span': (25, 28), 'Num': 6, 'pTag': 'APPR', 'cTag': 'PP_1', 'Lemma': ['auf'], 'sNum': 0, 'Flex': {'APF'}, 'sR': {'POV(VP_0)'}},
{'Lexem': 'die', 'Span': (29, 32), 'Num': 7, 'pTag': 'ARTB', 'Lemma': ['d'], 'sNum': 0, 'Flex': {'APF'}, 'cTag': 'PNP_39_0|AZ', 'sR': {'POV(VP_0)'}},
{'Lexem': 'geschützten', 'Span': (55, 66), 'Num': 14, 'pTag': 'ADJPP', 'cTag': 'PNP_39_0|AZ', 'Flex': {'APFw'}, 'Lemma': ['geschützt'], 'sNum': 0, 'sR': {'POV(VP_0)'}},
{'Lexem': 'Ausgaben', 'Span': (67, 75), 'Num': 15, 'pTag': 'NN', 'cTag': 'PNP_39_0|AZ', 'Lemma': ['Ausgabe'], 'sNum': 0, 'Flex': {'APF'}, 'sR': {'POV(VP_0)'}}],
[{'Lexem': 'die', 'Span': (77, 80), 'Num': 17, 'pTag': 'ARTB', 'sNum': 0, 'Flex': {'APN', 'NPN'}, 'cTag': 'PNP_39_1|AZ', 'Lemma': ['d'], 'sR': {'POV(VP_0)'}},
{'Lexem': 'geschützten', 'Span': (91, 102), 'Num': 21, 'pTag': 'ADJPP', 'cTag': 'PNP_39_1|AZ', 'Flex': {'APNw', 'NPNw'}, 'Lemma': ['geschützt'], 'sNum': 0, 'sR': {'POV(VP_0)'}},
{'Lexem': 'Lichtbilder', 'Span': (103, 114), 'Num': 22, 'pTag': 'NN', 'cTag': 'PNP_39_1|AZ', 'Lemma': ['Lichtbild'], 'sNum': 0, 'Flex': {'APN', 'NPN'}, 'sR': {'POV(VP_0)'}}],
[{'Lexem': 'die', 'Span': (116, 119), 'Num': 24, 'pTag': 'ARTB', 'sNum': 0, 'Flex': {'NPM', 'NPN', 'APF', 'APM', 'APN', 'NPF'}, 'cTag': 'PNP_39+85_3|AZ', 'Lemma': ['d'], 'sR': {'POV(VP_0)'}},
{'Lexem': 'geschützten', 'Span': (166, 177), 'Num': 41, 'pTag': 'ADJPP', 'cTag': 'PNP_39+85_3|AZ', 'Flex': {'NPFw', 'APFw', 'APMw', 'NPMw', 'APNw', 'NPNw'}, 'Lemma': ['geschützt'], 'sNum': 0, 'sR': {'POV(VP_0)'}},
{'Lexem': 'Bild-', 'Span': (178, 183), 'Num': 42, 'pTag': 'NN-', 'cTag': 'PNP_39+85_3|AZ', 'Lemma': ['Bildträger'], 'sNum': 0, 'Flex': {'NPM', 'NPN', 'APF', 'APM', 'APN', 'NPF'}, 'sR': {'POV(VP_0)'}},
{'Lexem': 'und', 'Span': (184, 187), 'Num': 43, 'pTag': 'KONN-', 'Lemma': ['und'], 'cTag': 'PNP_39+85_3|AZ', 'sNum': 0, 'sR': {'POV(VP_0)'}},
{'Lexem': 'Tonträger', 'Span': (188, 197), 'Num': 44, 'pTag': 'NN', 'cTag': 'PNP_39+85_3|AZ', 'Lemma': ['Tonträger'], 'sNum': 0, 'Flex': {'NPM', 'ASM', 'GPM', 'DSM', 'APM', 'NSM'}, 'sR': {'POV(VP_0)'}}],
[{'Lexem': 'die', 'Span': (202, 205), 'Num': 46, 'pTag': 'ARTB', 'sNum': 0, 'Flex': {'NPF', 'APF'}, 'cTag': 'PNP_39_4|AZ', 'Lemma': ['d'], 'sR': {'POV(VP_0)'}},
{'Lexem': 'geschützten', 'Span': (224, 235), 'Num': 52, 'pTag': 'ADJPP', 'cTag': 'PNP_39_4|AZ', 'Flex': {'NPFw', 'APFw'}, 'Lemma': ['geschützt'], 'sNum': 0, 'sR': {'POV(VP_0)'}},
{'Lexem': 'Datenbanken', 'Span': (236, 247), 'Num': 53, 'pTag': 'NN', 'cTag': 'PNP_39_4|AZ', 'Lemma': ['Datenbank'], 'sNum': 0, 'Flex': {'NPF', 'APF'}, 'sR': {'POV(VP_0)'}}]]}
========================================================================================================================================================================================================
Sie haben Fragen, Anmerkungen oder Kritik? Oder Sie brauchen Unterstützung bei komplexen Textanalysen? Zögern Sie nicht und kontaktieren Sie mich!