ML.NET: Named-entity recognition (NER) mit C# ausprobiert

ML.NET: Named-entity recognition (NER) mit C# ausprobiert
Foto von Pixabay: https://www.pexels.com/de-de/foto/briefblocke-247819/
Wenn Sie diese Seite aufgrund von Problemen mit ML.NET und NER besuchen, muss ich Sie leider enttäuschen - dieser Artikel bietet keine Lösungen. Auch ich bin auf Probleme gestoßen und konnte diese bisher nicht lösen.

Einleitung

Im Rahmen meiner Seminararbeit "KI in der Pflege" für meinen Masterstudiengang in Wirtschaftsinformatik habe ich erneut mit ML.NET gearbeitet. Named Entity Recognition (NER) ist eine Komponente der natürlichen Sprachverarbeitung (NLP), die vordefinierte Objekte oder Schlüsselwörter in einem Text identifizieren kann. Diese Tokens umfassen Personennamen, Organisationen, Orte, medizinische Codes, Zeitangaben, Mengenangaben, Geldwerte und vieles mehr. Kurz gesagt ermöglicht NER die Extraktion von Informationen aus einem Text, was insbesondere dann nützlich ist, wenn Personen Freitexte eingeben und bestimmte Informationen für spezifische Zwecke benötigt werden.

Leider sind viele Anleitungen zur Entwicklung von KI-Anwendungen auf Python ausgerichtet. Obwohl PyTorch und TensorFlow leistungsstarke Tools und Frameworks für Python bieten, möchte Microsoft mit ML.NET .NET-Entwicklern die Möglichkeit geben, KI-Anwendungen zu entwickeln und dabei im gleichen Ökosystem zu bleiben. Auf diese Weise kann die KI in C# trainiert und unter anderem in ASP.NET Core verwendet werden.

Durch AutoML und das Model Builder UI wird die Entwicklung von KI-Modellen vereinfacht. Es stehen verschiedene Algorithmen und Einstellungen zur Verfügung. AutoML sucht automatisch den besten Algorithmus für eine spezifische Aufgabe. Der Model Builder stellt eine grafische Benutzeroberfläche (GUI) in Visual Studio bereit, um eine KI zu trainieren. Dort kann die Art der KI (Klassifizierung, Regression, Objekterkennung, NER usw.) ausgewählt werden, und anschließend können die Datenquelle und die Trainingseinstellungen festgelegt werden.

Anwendungsszenario


In unserem IT-Systemhaus in Dortmund ist ein Hauptbestandteil meiner Arbeit die Programmierung eines Ticketsystems. Unser Ziel ist es, die Probleme unserer Kunden so schnell wie möglich zu lösen. Um eine effiziente Organisation zu gewährleisten, erfassen wir alle Vorfälle in einem Ticketsystem. Kunden haben die Möglichkeit, eigene Tickets zu erstellen oder uns per E-Mail zu kontaktieren.

Die Nutzung von Named Entity Recognition (NER) könnte besonders bei der Verarbeitung von E-Mails von Vorteil sein. Durch NER könnten relevante Informationen wie Gerät, Ansprechpartner und Standort aus den E-Mails extrahiert werden, um daraus automatisch ein entsprechendes Ticket anzulegen.

NER

Quelle: https://towardsdatascience.com/named-entity-recognition-ner-meeting-industrys-requirement-by-applying-state-of-the-art-deep-698d2b3b4ede

Es gibt leider kaum Anleitungen für NER in ML.NET. Auf der Microsoft-Dokumentationsseite wird lediglich knapp der Aufbau der benötigten Daten beschrieben, ansonsten finde ich dazu nichts.

Bei mir war der mitgelieferte ML.NET Model Builder nicht auf dem neuesten Stand, daher musste ich die aktuellste Version von der Website herunterladen.

Anschließend konnte ich NER (Szenario) zum Trainieren auswählen. Die Bedienung des Fensters wird ebenfalls dort beschrieben.

NER im Model Builder auswählen

Nachdem NER ausgewählt wurde, müssen zwei Dateien angegeben werden: die Entity Key Map und die Trainingsdaten.

Die Entity Key Map ist eine Liste mit den Objekten/Labels.

Device
Person
Priority

Bei den Trainingsdaten handelt es sich um eine Liste von Sätzen und den oben genannten Objekten. Die erste Spalte repräsentiert den Satz, während die anderen Spalten die jeweiligen Objekte enthalten. Die Spalten sind durch Tabs getrennt. Ein vollständiges Beispiel kann aus dem offiziellen Repository von ML.NET auf GitHub entnommen werden.

Joseph hat Probleme mit dem Gerät dc-de-un-66. Die Anmeldung ist nicht mehr möglich. Es ist wichtig.	Person	0	0	0	0	0	0	Device	0	0	0	0	0	0	0	0	Priority
Chantal hat Probleme mit dem Gerät adfs-us-un-34. Die Anmeldung ist nicht mehr möglich. Es ist unwichtig.	Person	0	0	0	0	0	0	Device	0	0	0	0	0	0	0	0	Priority

Zuerst habe ich die Daten in Excel erstellt und als TXT-Datei mit Tab-Abständen gespeichert. Jedoch konnte der Model Builder die Datei nicht einlesen. Nachdem ich die Daten anschließend in Notepad erstellt habe, konnte sie erfolgreich eingelesen werden. Wenn Umlaute verwendet werden, muss die Datei als UTF-8 gespeichert sein.

In der Vorschauversion von ML.NET habe ich gesehen, dass auch das Zuweisen eines Labels zu einer Wortgruppe gelöst wurde. Eine Wortgruppe könnte beispielsweise "Max Mustermann" sein. Dabei handelt es sich um eine Person und der Name besteht aus zwei Wörtern. In der Entity Key Map werden "B_Person" und "Person" hinzugefügt. Im Entity Key Map erhält das erste Wort das Label "B_Person" und alle darauf folgenden Wörter, die zum selben Label gehören, das Label "Person".

Fazit

Bisher hatte ich immer gute Erfahrungen mit ML.NET und dem Model Builder gemacht, abgesehen von einigen kleineren Fehlern. Diesmal war es jedoch anders. Trotz mehrerer Versuche konnte ich kein positives Ergebnis erzielen. Ich habe es sowohl mit 20.000 generierten Zufallssätzen als auch mit den Test-Trainingsdaten von GitHub versucht. Leider ohne Erfolg.


Auf dem Bild ist deutlich zu erkennen, dass das Label falsch zugewiesen wird und das Label "Priorität" überhaupt nicht erkannt wird. Interessant ist, dass "Chantal" erkannt wird, aber "hat" das Label "Person" erhält. Zunächst dachte ich, dass es sich um einen Anzeigefehler im Model Builder handelt, aber das gleiche Ergebnis erhielt ich auch im Programmcode.

Meine Vermutung ist, dass das Tool sich noch in der Beta-Phase befindet und daher noch nicht einwandfrei funktioniert. Zudem wird nach meinen Informationen ein vortrainiertes Modell (BERT) verwendet. Es ist wahrscheinlich darauf ausgelegt, eher für die englische Sprache als für Deutsch zu funktionieren.

Ein alternativer Ansatz könnte darin bestehen, den NerTrainer direkt zu verwenden, ohne den Model Builder einzubeziehen. Möglicherweise liegt der Fehler dort und nicht am Algorithmus.