Am 7. August 2023 fand auf dem Dach der SUB Hamburg ein weiterer Workshop aus der Reihe “Digital Humanities – Wie geht das?” statt. Diesmal war Thema die für Außenstehende durchaus kompliziert wirkende Named Entity Recognition (NER), also die automatisierte Erkennung von sogenannten “Entitäten” (also Personen, Orte, Werke, …) in Texten. Als Teilbereich des eh schon nicht wenig komplexen Methodenfundus des Natural Language Processing kamen nicht wenige Teilnehmer:innen mit der Motivation, endlich mal zu verstehen, wie das eigentlich funktioniert und befürchteten schon, sich mit mathematischen Funktionen und der Programmierung von Algorithmen auseinandersetzen zu müssen. Die Workshop-Leiterin Marie Flüh konnte in dieser Hinsicht beruhigen: Zwar ist NER durchaus arbeitsaufwändig, gerade wenn eigene Classifier trainiert werden, programmiert oder eigens berechnet werden muss hier aber dank Stanford CoreNLP Named Entity Recognizer nichts.
Bei bestem Hamburger “Schietwedder” trafen sich die Teilnehmer:innen also im trockenen Loft des Bücherturms, um anhand von Beispieldaten aus der Dehmel-Edition die Anwendung von NER, sowie das Training eigener Classifier zu lernen. Nach einer kurzen Vorstellungsrunde gab es zunächst einen inhaltliche Inputvortrag dazu, was NER eigentlich ist und was für Anwendungsfälle es für NER gibt. Dabei ist NER eine Methode aus der Computerlinguistik und wie schon geschrieben Teilbereich des Natural Language Processings. Die Grundlage bildet ein Modell, mit dem die Software so trainiert werden kann, dass sie automatisch Entitäten in Texten erkennen und markieren kann. Das ist etwa sinnvoll, wenn große Textmengen auf Entitäten hin untersucht werden sollen.
Als Beispiel könnte hier die Dehmel-Edition genannt werden, aus der auch die Beispieldaten für den Workshop stammten: Jeden Brief händisch auf Entitäten zu untersuchen würde einfach sehr viel Zeit brauchen. Über einen eigens auf Basis der Dehmel-Briefe trainierten Classifier kann hier Abhilfe geschaffen werden, da nur ein bestimmter Teil der Briefe manuell annotiert werden muss, um die Trainings- und Validierungskorpora zu erstellen. Der Rest kann dann automatisiert analysiert werden. Die Qualität der Annotation mag dann am Ende vielleicht nicht den gleichen Wert wie eine manuelle Annotation haben, immerhin ist dann aber ein großes Datenkorpus grundlegend strukturiert, annotiert und steht der Forschung für die weitere Arbeit und Verfeinerung zur Verfügung. Ein anderes Beispiel ist der Gender-Classifier von Mareike Schumacher und Marie Flüh. Hier dient NER zur Erkennung von Gender-Kategorien und gegenderten Wortformen, was etwa für die computergestützten Analyse von Genderrollen in Texten hilfreich ist.
Nach dem kurzen Vortrag konnten die Teilnehmer:innen dann selbst ausprobieren, wie NER funktioniert. Hierfür wurde das GUI der NER-Software aus der Stanford CoreNLP Suite mit allgemeinen Classifiern für die deutsche Sprache eingesetzt. Mit einfachem Copy’n’Paste konnte ein Beispielkorpus aus den Dehmel-Briefen in ein Textfeld kopiert werden und dann mit einem einfachen Klick analysiert werden. Anschließend konnte das Ergebnis etwa als XML exportiert werden. So einfach kann NER sein!
Etwas komplizierter wurde es dann im zweiten Teil des Workshops, in dem es darum ging, wie man ein eigenes Modell baut, um einen Classifier zu trainieren. Hierfür sind mehrere Schritte notwendig: Im Preprocessing müssen die Daten zunächst in das richtige Format gebracht werden. Als Beispieldatensatz dienten auch hier Texte aus der Dehmel-Edition. Diese müssen Tokenisiert (also in Tokens aufgeteilt) werden und anschließend in das .tsv
-Format transformiert werden, in dem die Annotation und schließlich das Training dann stattfinden kann.
# Schritt 1: Txt -> Tok
java -cp stanford-ner.jar edu.stanford.nlp.process.PTBTokenizer Beispieldaten.txt > Beispieldaten.tok
# Schritt 2: Tok -> Tsv
perl -ne 'chomp; print "$_\tO\n"' Beispieldaten.tok > Beispieldaten.tsv
Hier mussten Teilnehmer:innen erstmals mit der Konsole arbeiten, für manche ein absolutes Novum. Entsprechend machte sich hier und da eine gewisse Unsicherheit aus. Zudem war – wie immer, wenn verschiedene Setups und Betriebssysteme aufeinandertreffen – einiges an Problembewältigung, Raten, Ausprobieren und auf StackOverflow nach Lösungen schauen nötig. Aber auch das gehört dazu, es redet nur niemand drüber (will sagen: Es sollte mehr darüber geredet werden).
Heraus kam eine Tabelle, die in jeder Zeile ein Token und in der zweiten Spalte ein “O” stehen hatte, was bedeutet, dass hier keine besondere Entität vorliegt. Hier musste nun händisch Token für Token überlegt werden, ob etwa eine Person, ein Ort, ein Werk oder andere Entitäten vorliegen und der Wert in der zweiten Spalte entsprechend angepasst werden. Dieser Schritt ist die Annotation. Was genau wie bezeichnet wird, ist Gegenstand von Vorüberlegungen und sollte immer gut dokumentiert werden – schließlich bildet dieser Schritt die Grundlage dafür, was die automatisierte Erkennung am Ende zuordnet. So muss etwa überlegt werden, ob Titel für Personen als Teil des Namens verstanden werden, oder nicht.
Alles, was bis hierher getan wurde, muss zweimal gemacht werden, mit unterschiedlichen Basisdaten. Ein annotierter Datensatz wird dann fürs Training verwendet, einer wird dafür verwendet, die Performanz des Classifiers zu prüfen, also wie gut der trainierte Classifier am Ende überhaupt funktioniert.
Nun muss eine .prop
-Datei angelegt werden, in der die Informationen hinterlegt werden müssen, auf der Basis welcher Daten der Classifier trainiert werden soll. Hier ein Auszug aus der Datei, die im Workshop angelegt wurde:
#mein_classifier.prop
# Welches .tsv soll als Trainingsdatensatz dienen?
trainFile = PATH/Beispieldaten.tsv
# Wie soll der Classifier benannt werden?
serializeTo = mein_classifier.ser.gz
# Hier wird festgelegt, dass das Wort in Spalte 0 (also der ersten Spalte),
# die Bedeutung des Wortes in Spalte 1 (also der zweiten Spalte) steht
map = word=0,answer=1
...
Schließlich wird mit java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -prop mein_classifier.prop
das eigentliche Modelltraining durchgeführt.
Dieses kann jetzt im GUI des Named Entity Recognizer wie oben beschrieben einfach anstelle des allgemeinen Classifiers ausgewählt und damit auf die zu analysierenden Texte angewendet werden. Doch bevor das geschieht, sollte die Performanz des Classifiers getestet werden, um zu sehen, wie gut dieser eigentlich funktioniert. Vorab wurden ja bereits zwei verschiedene Datensets vorbereitet, von denen das eine in ein Modell überführt wurde. Das zweite dient jetzt dem Test:
java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier mein_classifier.ser.gz -testFile Testtexte.tsv
Als Ergebnis kommt dann eine Tabelle als Ausgabe, die so etwa aussehen könnte. Hierbei zeigt das P den Precision-Wert (also den prozentualen Anteil korrekt erkannter Entitäten) an, das R den Recall-Wert (die Wahrscheinlichkeit, mit der eine Entität korrekt erkannt wird) und F1 die Balance zwischen den beiden Werten. Der F1-Wert ist am Ende also in der Regel derjenige, der unterm Strich und vereinfacht am besten Aussage über die Performanz des Classifiers geben kann. TP, FP und FN stehen für True Positive, also richtige Erkennungen, False Positive, also falsch als Entität erkannte Tokens und False Negative, also falsch nicht als Entität erkannte Tokens. Aber was bedeutet das? Grundsätzlich ist ein F1-Score von 0.8-0.9 gut und wünschenswert, alles darüber ist sehr gut, alles darunter zeigt an, dass Nachbesserungen nötig wären. Nachbesserungen bedeuten in der Regel vor allem größere Mengen an Trainingsdaten und eine bessere Konsistenz in der Annotation (deshalb sollten auch immer Annotationskonventionen festgelegt werden). Im Beispiel hier müsste also definitiv am Modell gearbeitet werden.
In einer Abschlussrunde wurde schließlich über das gelernte reflektiert und alle Teilnehmer:innen waren sich einig, dass der Workshop nicht nur lehrreich war im Hinblick auf eine neu erlernte Methode und den ersten Einblick in die Technologien der computergestützten Textanalyse, es wurde auch mehrfach darauf hingewiesen, dass man sich ob der sehr komplex scheinenden Materie eine hohe Einstiegsschwelle vorgestellt hatte, nun aber ob des vergleichsweise einfachen Zugangs erleichtert sei. Zwar ist das Training von Classifiern viel Arbeit, aber für Endanwender:innen rein technisch doch beherrschbar – vorausgesetzt es gibt keine kryptischen Java-Fehler, von denen man auch auf StackOverflow noch nie etwas gehört hat. 🙂
Danke an Marie Flüh für den interessanten Workshop, die Teilnehmer:innen für die Teilnahme und die angenehme Arbeitsatmosphäre und natürlich auch Dank an das Hamburger Wetter für das Rütteln und Pladdern und Pfeifen über den Dächern von Hamburg!
Die Materialien und Folien des Workshops können hier noch eingesehen werden: https://github.com/MarieFlueh/Workshop-NER-fuer-GeisteswissenschaftlerInnen
OpenEdition schlägt Ihnen vor, diesen Beitrag wie folgt zu zitieren:
Jonas Müller-Laackman (9. August 2023). Workshop-Bericht: “Named Entity Recognition für Geisteswissenschaftler:innen mit Stanford CoreNLP” DH³. Abgerufen am 5. Oktober 2024 von https://doi.org/10.58079/nkeb