Im ersten Teil dieser Blog-Serie wurde die Bedeutung von NLP im unternehmerischen Kontext mit Fokus auf die Bankenwelt motiviert. Nun sollen anhand eines eigenen Skripts einige Wege angerissen werden, welche bei der praktischen Implementation bedacht werden müssen.
Das vorliegende Skript erlaubt das Laden, Aufbereiten und Säubern von Text-Dokumenten verschiedener Formate (aktuell vor allem txt, word und pdf). Es ist in Python geschrieben und verwendet das Paket spacy. Mit minimaler Eingabe seitens des Nutzers werden einige grundlegende Eigenschaften der Texte zurückgegeben. Dazu zählen die Sprache, die häufigsten verwendeten Wörter relevanter Wortarten, erkannte Entitäten (wie etwa Unternehmen) und die Tonalität des Textes (ob der Text eher neutral ist oder viele emotionale Ausdrücke enthält). Diese Informationen werden als strukturierte Tabelle ausgegeben, die für weiterführende Anwendungen genutzt werden können. Zuletzt wird automatisiert eine interaktive html-Grafik erstellt, welche die genannten zentralen Charakteristika der Texte veranschaulicht und so den ersten Eindruck abrundet.
Dabei kann das Skript von jedem Nutzer, der Python aufgesetzt hat, einfach genutzt werden (es dauert initial etwas, bis alle benötigten Pakete installiert sind). Dazu wird das Skript ausgeführt und der Ordner angegeben, der die zu analysierenden Dokumente enthält. Zudem erlaubt das Skript die Angabe, ob Dokumente enthalten sind, die in mehr als einer Sprache verfasst sind – also z.B. Sammelbände mit Beiträgen aus mehreren Sprachen. In diesem Fall wird der gesamte Corpus satzweise nach erkannten Sprachen geordnet, was allerdings die Geschwindigkeit beeinträchtig. Ohnehin empfiehlt es sich, das Skript (je nach Grösse / Anzahl der zur Analyse eingelieferten Texte) auf einem leistungsfähigen Rechner mit gutem Grafikprozessor oder gleich in der Cloud auszuführen.
Paket
Auch in Python führen viele Wege nach Rom. Die zentralen Prozesse dieses Skripts basieren auf Pipelines von Spacy. Das von einem Berliner Start-Up entwickelte Paket hat sich als Industrie-Standard etabliert. Dies insbesondere aufgrund der einfachen Integration von modernen ML-Anwendungen, während traditionelle NLP-Pakete wie NLTK etwas in die Jahre gekommen sind. Einige weitere Pakete wie FARM, FLAIR oder gensim eignen sich generell oder für spezifische Anwendungen. Aufgrund der guten Performanz, den vortrainierten Modellen, der guten Dokumentation sowie der weiten Verbreitung wird für dieses Skript Spacy verwendet.
Text-Import
Vor Start der Pipeline werden zunächst alle pdf-Dateien in das txt-Format konvertiert. Aufgrund der uneinheitlichen Kodierung des pdf-Formats ist dies ein komplexes Unterfangen – man denke etwa an Tabellen oder gescannte Dokumente. In diesem Skript wird primär das Paket PyMuPDF verwendet, das für unsere Zwecke eine gute Balance zwischen Geschwindigkeit und Verlässlichkeit bietet (siehe Tabelle unten). Auch aus Word-, Powerpoint- und Excel-Dateien wird mittels textract Text extrahiert. Je nach Anwendungsfall müssten spezifischere Lösungen entwickelt werden – etwa, wenn Text aus Tabellen auf bestimmte Weise persistiert werden soll.
Paket |
Update |
Fazit |
2016 |
Nicht mehr maintained |
|
2016 |
Funktionen wie PdfFileReader werden in der eigenen |
|
2018 |
Einfache Funktionalität, für die meisten Tasks |
|
Aktuell |
Wirft bei vielen PDFs Fehler, arbeitet mit pdftotext, |
Sprache: Pipeline 1
Der Anspruch des Skriptes ist es, Dokumente in den Sprachen Englisch, Deutsch, Spanisch, Französisch, Italienisch und Portugiesisch in ähnlicher Qualität verarbeiten zu können. Zu diesem Zweck kann entweder je Sprache ein eigenes Modell verwendet werden oder auf ein multi-linguales Modell zurückgegriffen werden. Spacy enthält ein solches. Eine spannende Alternative zu Spacy ist hier ein Buchstaben-basiertes Modell wie das der FLAIR-Library, da es relativ einfach mit mehrsprachigem Text umgehen kann. Allerdings ist ein mehrsprachiges Modell niemals so präzise wie eines, das für die jeweilige Sprache optimiert ist. Mit der Beschränkung auf die oben genannten populären Sprachen bietet sich der Weg über sprachenspezifische Modelle an.
Hierzu muss für jedes Dokument das Sprachenmodell bestimmt werden, mit welchem es analysiert wird. Zu diesem Zweck wird in einem ersten Schritt (also vor der eigentlichen Analyse in spacy) eine Spracherkennung vollzogen.
Für die Spracherkennung eignen sich mehrere Pakete / Modelle. Einerseits ein Modell auf Basis von facebooks fasttext. Daneben gibt es das Paket CLD2, auf dem wiederum das Modul polyglot detect basiert. Schliesslich gibt es eine spacy pipeline, die standardmässig auch auf einem anderen Paket zur Spracherkennung aufbaut.
Das fasttext Modell ist recht genau. Allerdings ist eine Aufteilung eines Dokuments anhand der Sprache hier nicht möglich, da es stets nur eine Sprache vorhersagt. Das Modell gibt zwar an, wie sicher es sich in der Vorhersage ist, jedoch bezieht sich dieser Sicherheits-Score auf die Existenz von Text in dieser Sprache, lässt aber keine Schlüsse zu, ob das Dokument mehrheitlich in dieser Sprache verfasst ist. Selbiges gilt für das Polyglot-Modul. Da wir für alle anderen Aufgaben spacy nutzen, macht es Sinn, auch im ersten Schritt schon hierauf zurückzugreifen. Dies auch, weil es einfach ist, eine vorgängige Säuberung der Texte einzubinden und die Spracherkennung auf Dokument- oder Satzebene auszuführen.
Die Vorhersage auf Satzebene ist aufgrund des Ziels des Skripts, diverse Dokumente adäquat zu verarbeiten, hilfreich. Hierfür wird der Nutzer zu einer Eingabe aufgefordert, ob die Spracherkennung auf Dokument- oder Satzebene stattfinden soll. Sammelbände in unterschiedlichen Sprachen oder solche mit Zitaten in anderen Sprachen können so anhand der Sprache aufgesplittet werden.
Allerdings ist diese Spracherkennung nicht immer verlässlich, insbesondere bei unsauberen Dokumenten. Zudem ist die satzweise Erkennung wesentlich rechenintensiver. Die verwendete Funktion enthält einige Massnahmen, um das Risiko falscher Vorhersagen abzufedern – beispielsweise werden prognostizierte Sprachen, die nur selten im Dokument auftreten, ausgeschlossen. Somit wird beispielsweise das Latein-Zitat heraussortiert und verfälscht nicht die spätere Angabe der auffälligsten Terme des Dokuments.
Säuberung: Pipeline 2
Auch für die Säuberung von Texten gibt es zahlreiche Optionen, die sich je nach Anwendungsfall anbieten. Aufgrund des Anspruches, möglichst breit anwendbar zu sein, wurde im Zweifel eine einfachere Säuberung angewendet. Überdies wurde auf die Verfahren Stemming oder Lemmatisierung verzichtet, die bei Verwendung neuer Modelle wie der Transformer meist nicht mehr notwendig sind. Überschüssige Absätze und Leerzeichen sowie URLs werden eliminiert, Sonderzeichen werden teilweise in Text übersetzt (z.B. “Euro” statt “€”) und Grossschreibungen werden teilweise normalisiert. Zudem werden Symbole, welche nicht in den zugelassenen Sprachen vorkommen können, heraussortiert, was Probleme bei falschen Encodierungen mitigiert. Einige der Funktionen sind vereinfachte Versionen des Moduls nlpre. Zuletzt werden noch Wortarten gefiltert, die keinen semantischen Inhalt transportieren (Punktationen z.B.), wobei der Original-Text dennoch nicht verworfen wird.
Informations-Extraktion
Im Anschluss an die Text-Säuberung beginnt die Sammlung allfälliger relevanter Informationen über die Texte. Hierzu werden
- die häufigsten Verben, Nomen und Adjektive (Adverbien) des jeweiligen Dokuments aufgelistet
- die erkannten Entitäten gespeichert
- die Polarität des Textes errechnet anhand des verwendeten Vokabulars sowie
- Textlänge, -Sprache und -Name in separaten Listen dokumentiert.
Im Anschluss daran wird das Paket Scattertext aufgerufen. Scattertext basiert ebenso auf Spacy und bietet ansprechende Visualisierungen. Das Paket ist entgegen dem in Python populären matplotlib auf NLP optimiert und erlaubt selbst einige NLP-Funktionalitäten.
So wird zunächst eine inverse Dokumenten-Term-Matrix aufgebaut. Diese Matrix gibt die Wörter an, die für das vorliegende Dokument besonders charakteristisch sind im Vergleich mit anderen Dokumenten derselben Sprache. Darauf aufbauend nutzt Scattertext eine kategorische Variable (wie die Sprache oder die Polarität), um für eine Kategorie spezifische Vokabeln mit jenen aller anderen Kategorien zu vergleichen. So entsteht eine anschauliche html-Grafik, welche einen guten Überblick für den gesamten Corpus gibt.
Fazit
Mit dem einfachen Programm können grundlegende Informationen über die Dokumente im Zielordner gewonnen werden. Für dedizierte Anwendungen im Business-Kontext können einzelne Funktionen aus dem Code wiederverwendet oder neue Funktionen in die pipeline integriert werden. Die Vielzahl an frei zugänglichem Codes und Repositories, die neueste Anwendungsmöglichkeiten von NLP verfügbar machen, erlaubt es, für zahlreiche unternehmerische Ideen schnell einen Eindruck über Machbarkeit, Hürden und Chancen zu gewinnen. Auf diese Weise aufgebautes Know-How ermöglicht die Selektion passender Partner aus dem wachsenden Bereich der NLP-Startups. Mehr dazu im dritten Teil dieser Blog-Serie.
2 thoughts on “NLP im unternehmerischen Kontext II –Technischer Teil”