Textklassifikation mit Elasticsearch

Traditionell und Elasticsearch

Traditionelle Methode für die Textklassifikation

Textklassifikation wird normalerweise mit Methoden des überwachten maschinellen Lernens gelöst. Zum Trainieren der Modelle benötigt man Dokumente mit Label. Die Minimalversion eines solchen Dokuments besteht aus zwei Feldern: "text" und "label". Für maschinelles Lernen stehen zahlreiche Open-Source-Bibliotheken zur Verfügung: SciKit Learn, Weka, NLTK, Apache Mahout et cetera.

Die meisten Algorithmen im Machine Learning benötigen eine Repräsentation der Daten als Vektoren (Lineare Algebra). Die Dimensionen (oder Features) bestehen meist aus den zum Beispiel 10.000 wichtigsten Wörtern oder Bigrammen eines Datensatzes.

Wie lässt sich nun ermitteln, wie wichtig ein Wort in einem gegebenen Kontext ist? Ein bewährtes und erprobtes Maß hierfür ist tf–idf. Diese Formel wurde bereits in den 70er-Jahren erfunden. Hat ein Wort in einem Dokument einen hohen tf–idf-Wert, ist es für dieses besonders charakteristisch und unterscheidet es so von allen anderen besonders gut.

Die Keywords mit den höchsten tf–idf-Scores in einer Teilmenge von Dokumenten repräsentieren ein Thema, wenn die Daten viel Fachterminologie enthalten. Daher liegt es nahe, für die Textklassifikation mit tf–idf gewichtete Keywords als Features für die Vektoren zu verwenden. Nachdem jedes Dokument aus dem Training-Set in diese Form überführt wurde, werden alle Datensätze nach Labels gruppiert und zum Beispiel mit einer Support Vector Machine (SVM) oder einem Naive-Bayes-Algorithmus trainiert. Damit lassen sich neue Dokumente klassifizieren. Die Klasse, die dem neuen Dokument am ähnlichsten ist, bekommt den höchsten Score.

Textklassifikation mit Elasticsearch

All das lässt sich auch mit Elasticsearch (oder Lucene) lösen, und zwar deutlich einfacher. Dazu sind nur die folgenden vier Schritte auszuführen:

  1. Setze das Mapping explizit ("inhalt" : "text", "kategorie" : "keyword").
  2. Indexiere die Dokumente.
  3. Führe eine More Like This Query (MLT Query) mit dem neuen Dokument als like_text aus.
  4. Schreibe ein kleines Skript, um die Label der Top-Ergebnisse mit Score zu aggregieren.

Die MLT Query ist sehr wichtig im Text-Mining. Sie kann beliebigen Text als Input nehmen, extrahiert daraus automatisch die besten n Keywords relativ zum aktuellen Index und baut dann intern eine Bool-Query mit diesen Schlüsselwörtern zusammen. Mit ihr kann man vor allem nach ähnlichen Dokumenten suchen. Wenn alle im Index ein Label haben (Kategorie) und pro Klasse eine ähnlich große Anzahl an Dokumenten vorliegt (balancierter Trainingskorpus), ist diese Methode äquivalent zur Klassifikation mit einem Machine-Learning-Verfahren.

PUT sample
POST sample/document/_mapping
{
"properties": {
"content": {
"type": "text",
"analyzer" : "english"
},
"category": {
"type": "text",
"analyzer" : "english",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}

POST sample/document/1
{
"category" : "Apple (Fruit)",
"content" : "Granny Smith, Royal Gala, Golden Delicious and
Pink Lady are just a few of the thousands of different kinds
of apple that are grown around the world! You can make dried
apple rings at home - ask an adult to help you take out the core,
thinly slice the apple and bake the rings in the oven at a
low heat."
}

POST sample/document/2
{
"category" : "Apple (Company)",
"content" : "Apple is an American multinational technology
company headquartered in Cupertino, California, that designs,
develops, and sells consumer electronics, computer software,
and online services. Its hardware products include the iPhone
smartphone, the iPad tablet computer, the Mac personal computer,
the iPod portable media player, the Apple Watch smartwatch, and
the Apple TV digital media player. Apple's consumer software
includes the macOS and iOS operating systems, the iTunes media
player, the Safari web browser, and the iLife and iWork
creativity and productivity suites. Its online services include
the iTunes Store, the iOS App Store and Mac App Store, Apple
Music, and iCloud."
}

GET sample/document/_search
{
"query": {
"more_like_this": {
"fields": [
"content",
"category"
],
"like_text": "The apple tree (Malus pumila, commonly and
erroneously called Malus domestica) is a deciduous tree in
the rose family best known for its sweet, pomaceous fruit,
the apple. It is cultivated worldwide as a fruit tree, and
is the most widely grown species in the genus Malus. The tree
originated in Central Asia, where its wild ancestor, Malus
sieversii, is still found today. Apples have been grown for
thousands of years in Asia and Europe, and were brought to
North America by European colonists. Apples have religious and
mythological significance in many cultures, including Norse,
Greek and European Christian traditions.",
"min_term_freq": 1,
"max_query_terms": 20
}
}
}

Dieses Beispiel dient nur zur Veranschaulichung. Für die Klassifikation benötigt man mehr Daten. Hier nun ein Python-Skript zum Ermitteln der besten Kategorie:

def get_best_category(response):
categories = {}
for hit in response['hits']['hits']:
score = hit['_score']
for category in hit['_source']['category']:
if category not in categories:
categories[category] = score
else:
categories[category] += score

if len(categories) > 0:
sortedCategories = sorted(categories.items(),
key=operator.itemgetter(1), reverse=True)
category = sortedCategories[0][0]
return category

Anwendungszenarien

Es gibt zahlreiche praktische Anwendungsfälle für die Textklassifikation, zum Beispiel im E-Commerce-Bereich, denn schließlich gibt es viele Online-Shops oder Meta- beziehungsweise Preisvergleichssuchmaschinen. Die Daten kommen oft aus Affiliate-Netzwerken und meist aus mehreren Shops, wobei jeder sein eigenes Kategoriensystem hat. Also sind die Kategoriensysteme zu vereinheitlichen oder aber die Daten in ein neues zu überführen.

Ein weiterer praktischer Anwendungsfall liegt im Bereich Business Intelligence: Eine Firma möchte ihre Kunden einer Branche zuordnen. Als Trainingsmodell könnte man die Wikipedia-Einträge zu den jeweiligen Branchen heraussuchen und vielleicht noch weitere Daten. Die Firmen werden dann durch ihre Webseite repräsentiert.