Textklassifikation mit Elasticsearch

Die Suchmaschine Elasticsearch ist weitverbreitet und auch als Analytics-Tool bekannt. Dass sie sich auch fürs Text-Mining einsetzen lässt, ist vielen hingegen weniger vertraut. Dieser Artikel stellt deswegen die Klassifikation von Texten mit Elasticsearch vor.

Know-how  –  0 Kommentare
Textklassifikation mit Elasticsearch
Anzeige

Elasticsearch überzeugt durch den leichten Einstieg, Geschwindigkeit und zahlreiche Möglichkeiten, komplexe Funktionen vergleichsweise einfach zu konfigurieren. Wer viel mit dem Werkzeug arbeitet, entdeckt irgendwann, dass es viel mehr als nur eine klassische Suchmaschine ist. So lassen sich damit auch Probleme aus den Bereichen Computerlinguistik und Text-Mining lösen, für die sonst spezielle Tools zum Einsatz kommen.

Die meisten Aufgaben im Bereich der Computerlinguistik beginnen mit einer Standard-Vorverarbeitungs-Pipeline mit folgenden Komponenten:

  1. Datenakquise (Web-Crawling, vom Dateisystem, von einer Datenbank etc.)
  2. Extraktion des Rohtexts
  3. Satzgrenzen bestimmen (Sentence splitting)
  4. Tokenisierung
  5. Normalisierung (Stemming, Lemmatisierung)
  6. Entfernen von Stoppwörtern
  7. Part-of-Speech Tagging

Einige Aufgaben der Computerlinguistik wie syntaktisches Parsing erfordern eine tiefenlinguistische Analyse. Für diese Art von Aufgaben ist Elasticsearch nicht die ideale Software. Für alles, was über das Token-Level hinausgeht, sind Plug-ins zu implementieren beziehungsweise zu verwenden, die den kompletten Text eines Dokuments bearbeiten.

Für Aufgaben wie Klassifikation, Clustering, Extraktion von Keywords und Messung der Ähnlichkeit reicht für gewöhnlich eine normalisierte und eventuell gewichtete "Bag of Words"-Repräsentation eines Dokuments.

Die Schritte 1 und 2 aus der Vorverarbeitungs-Pipeline lassen sich mit dem Ingest Attachment Processor Plugin (vor Version 5.0 Mapper Attachments Plugin) für Elasticsearch umsetzen. Die Rohtextextraktion der beiden Plug-ins basiert auf der Bibliothek Apache Tika, die es ermöglicht, aus gängigen Dateiformaten (HTML, PDF, Word etc.) das Markup zu entfernen und den Text zu extrahieren. Die Schritte 4, 5 und 6 übernehmen automatisch beim Indexieren Language Analyzer. Die meisten dieser Analyzer in Elasticsearch bestehen aus einem Tokenizer, einem Stemmer und einer sprachspezifischen Stoppwortliste.

Sample-Mapping:

{"properties": {
"content": {
"type": "text",
"analyzer" : "german"
}
}
}

Es wird also kein weiterer Code benötigt, um ein Dokument (PDF, HTML etc.) in eine interne "Bag of Words"-Repräsentation zu überführen. Man kann sogar den dedizierten Analyseendpunkt aufrufen und sich das vorverarbeitete Dokument ausgeben lassen:

curl -XGET "http://localhost:9200/_analyze?analyzer=english" -d'
{
"text" : "This is a test."
}'

{
"tokens": [
{
"token": "test",
"start_offset": 10,
"end_offset": 14,
"type": "<ALPHANUM>",
"position": 3
}
]
}

Für Sprachen mit geringerer Verbreitung kann das eine gute Lösung sein (z. B. für dänisch). Klassischerweise wird solch eine Pipeline wie folgt implementiert: Mittels eines Skripts wird der Text aus einer Quelle gezogen und der Rohtext extrahiert. Dann benötigt man eine Bibliothek speziell für die linguistische Vorverarbeitung wie NLTK, OpenNLP, Stanford NLP oder Spacy und im Anschluss ist noch über eine Stoppwortliste zu filtern. Das kostet jedes Mal wieder Zeit. Mit den in Elasticsearch eingebauten sprachspezifischen Analyzern geschieht das alles automatisch beim Indexieren.

Anzeige