Text Classification made easy with Elasticsearch | Elastic Blog
Cas Utilisateur

Elasticsearch facilite la classification de textes

Elasticsearch est bien connu en tant que moteur de recherche et d'analyse. Mais saviez-vous qu’il peut aussi servir en tant qu’API de text mining ?

Dans l’article suivant, je vais vous présenter comment utiliser Elasticsearch dans le cadre de la classification de textes. Grâce à ma formation en linguistique informatique et à mon expérience professionnelle en tant que freelance dans le domaine du text mining, j’ai eu la possibilité de mettre en œuvre et de tester les techniques suivantes dans différents scénarios.

Lorsque je suis tombée sur Elasticsearch la première fois, j’ai été fascinée par sa facilité d’utilisation, sa vitesse d’exécution et ses options de configuration. À chaque fois que je m’en servais pour travailler, je trouvais un moyen toujours plus simple d’obtenir les résultats que je recherchais jusque-là en utilisant des outils et techniques classiques de traitement automatique du langage naturel (TALN).

Je me suis rendue compte à un moment donné qu’Elasticsearch permettait de résoudre directement un grand nombre de choses que j’avais l’habitude de traiter de zéro.

La plupart des tâches de TALN démarrent par un pipeline de prétraitement standard :

  1. Collecte des données
  2. Extraction du texte brut
  3. Séparation des phrases
  4. Conversion en tokens
  5. Normalisation (racinisation, lemmatisation)
  6. Suppression des mots non significatifs
  7. Étiquetage morpho-syntaxique

Certaines tâches de TALN, telle que l’analyse syntaxique, nécessitent une analyse linguistique approfondie.

Pour ce type de tâches, Elasticsearch ne fournit pas directement l’architecture idéale ni le format de données optimal. C’est-à-dire que, pour les tâches qui vont au-delà des tokens, il est nécessaire d’écrire ou d’utiliser des plug-ins personnalisés accédant à l’intégralité du texte.

Mais les tâches telles que la classification, le clustering, l’extraction de mots-clés, la mesure de similarité, etc. nécessitent uniquement une représentation par sac de mots normalisée et potentiellement pondérée d’un document donné.

Les étapes 1 et 2 peuvent être résolues à l’aide du plug-in Ingest Attachment Processor (désigné par plug-in Mapper Attachments dans les versions précédant la 5.0) d’Elasticsearch.

L’extraction du texte brut pour ces plug-ins se base sur Apache Tika, qui est compatible avec les formats de données les plus courants (HTML/PDF/Word etc.).

Les étapes 4 à 6 sont gérées à l’aide d’analyseurs linguistiques prêts à l’emploi.

Exemple de mapping :

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

Si le type de mapping pour un champ donné est "text" (avant 5.0 : "analyzed string") et que l’analyseur est configuré sur l’une des langues prises en charge de façon native par Elasticsearch, la conversion en tokens, la racinisation et l’élimination des mots non significatifs seront automatiquement exécutées au moment de l’indexation.

Aussi, pas besoin de code personnalisé ni d’autre outil pour obtenir une représentation par sac de mots d’un type de document quel qu’il soit lorsqu’il est pris en charge par Apache Tika.

Les analyseurs linguistiques peuvent être également appelés par l’intermédiaire de l’API REST lorsqu’Elasticsearch est en cours d’exécution.

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
       }
    ]
  }

Si vous n’utilisez pas Elasticsearch, voici à quoi votre approche ressemblerait :

Collecte du texte avec un code personnalisé, analyse du document à la main ou avec la bibliothèque Tika, utilisation d’une bibliothèque TALN traditionnelle ou d’une API telle que NLTK, OpenNLP, Stanford NLP, Spacy ou tout autre outil ayant été conçu dans un service de recherche. Sachez néanmoins que les outils mis au point dans un service de recherche ne sont généralement pas adaptés au contexte d’une entreprise. La plupart du temps, les formats de données sont propriétaires, les outils doivent être compilés et exécutés sur la ligne de commande, et les résultats sont souvent présentés de façon simpliste dans une sortie standard. Les API REST constituent une exception.

Avec les analyseurs linguistiques Elasticsearch, vous devez simplement configurer votre mapping et indexer les données. Le prétraitement démarre automatiquement au moment de l’indexation.

Approche traditionnelle de la classification de textes

La classification de textes est une tâche habituellement gérée par un Machine Learning supervisé. Pour entraîner un modèle, on utilise un ensemble de documents balisés. Un document JSON contenant deux champs,

"content" et "category", serait un exemple de représentation minimale.

En général, la classification de textes est gérée à l’aide d’un outil comme SciKit Learn, Weka, NLTK, Apache Mahout etc.

Création des modèles

La plupart des algorithmes de Machine Learning s’appuient sur la représentation d’un modèle vectoriel des données. L’espace de description correspond habituellement à un certain volume des mots les plus importants d’un ensemble de données spécifique, par exemple 10 000 mots. Comment peut-on mesurer l’importance d’un mot ?

En général, en utilisant TF-IDF. Il s’agit d’une formule qui a été inventée dans les années 1970. TF-IDF est une pondération qui permet d’attribuer une note à un terme dans un document spécifique par rapport au reste de l’ensemble de données. Si un terme a une note TF-IDF élevée, cela signifie qu’il s’agit d’un mot-clé extrêmement caractéristique et qu’il permet de faire ressortir un document par rapport à d’autres documents.

Les mots-clés ayant les notes TF-IDF les plus élevées dans un sous-ensemble de documents peuvent représenter une thématique. Dans le cadre de la classification de textes, il est courant que l’espace de description soit constitué des n mots ayant la plus haute note TF-IDF.

Chaque document est converti en un vecteur de description. Ensuite, un modèle est créé avec toutes les instances d’entraînement de chaque classe/catégorie. Par la suite, les nouveaux documents peuvent être classés en fonction du modèle. Il faut donc convertir le document en vecteur de description pour que toutes les ressemblances puissent être calculées. Le document sera balisé en fonction de la catégorie ayant la note la plus élevée.

Classification de textes avec Elasticsearch

Avec Elasticsearch (ou Lucene), la procédure abordée ci-dessus peut être grandement simplifiée.

Vous devez simplement exécuter quatre étapes :

  1. Configurer votre mapping ("content" : "text", "category" : "keyword")
  2. Indexer vos documents
  3. Exécuter une requête More Like This (requête MLT)
  4. Rédiger un script court qui agrège les résultats de cette requête en fonction des notes
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."
  }

La requête MLT joue un rôle essentiel dans le text mining.

Comment fonctionne-t-elle ? Elle peut traiter un texte arbitraire, extraire les n premiers mots-clés vers le "modèle" réel et exécuter une recherche par correspondance booléenne avec ces mots-clés. Cette requête sert généralement à collecter des documents similaires.

Si tous les documents ont un balisage de classe/catégorie et un nombre similaire d’instances d’entraînement par classe, cela équivaut à une classification. Exécutez simplement une requête MLT avec le document d’entrée, comme le champ Like, et rédigez un script court qui agrège la note et la catégorie des n premiers résultats.

GET sample/document/_search
  {
    "query":{
       "more_like_this":{
          "fields":[
             "content",
             "category"
          ],
          "like":"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
       }
    }
  }

Cet exemple sert uniquement à illustrer le workflow. Pour effectuer une classification réelle, vous aurez besoin d’un plus grand volume de données. Aussi, ne vous affolez pas si vous n’obtenez pas de résultat réel avec cet exemple. Ajoutez tout simplement d’autres données pour le faire fonctionner.

Vous trouverez ci-dessous un petit script Python qui traite la réponse et renvoie la catégorie la plus probable pour le document d’entrée.

from operator import itemgetter
  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=itemgetter(1), reverse=True)
         category = sortedCategories[0][0]
     return category

Et voici votre système de classification de textes Elasticsearch !

Cas d'utilisation

La classification de textes est un cas d'utilisation concret très commun pour le TALN. Pensez aux données du commerce en ligne (produits). Bon nombre de personnes gèrent des boutiques de commerce en ligne avec des liens affiliés. Les données proviennent de plusieurs boutiques et sont souvent accompagnées d’une balise de catégorie. Mais chaque boutique dispose d’une balise de catégorie différente. Il faut donc unifier les systèmes de catégorie, puis re-classifier toutes les données en fonction de la nouvelle arborescence de catégories. Autre exemple : une application de Business Intelligence, dans laquelle les sites web d’une entreprise doivent être classifiés en fonction de leur secteur (coiffure ou boulangerie, etc.).

Évaluation

J’ai évalué cette approche à l’aide d’un ensemble de données de classification de textes standard : 20 Newsgroups. La précision la plus élevée que j’ai obtenue (92 % de balises correctes) a été atteinte avec un seuil de note de haute qualité incluant seulement 12 % des documents. Lors du balisage des documents (rappel à 100 %), 72 % des prédictions étaient correctes.

Les meilleurs algorithmes pour la classification de textes dans l’ensemble de données 20 Newsgroup sont généralement SVM et Naive Bayes. Ils offrent en effet une précision moyenne plus élevée au niveau de l’ensemble de données intégral.

Aussi, vous vous demandez certainement pourquoi choisir Elasticsearch pour la classification si ces algorithmes sont d’une plus grande précision ?

Pour des raisons pratiques : l’entraînement d’un modèle SVM demande beaucoup de temps, en particulier lorsque vous travaillez dans une startup ou lorsque vous avez besoin de vous adapter rapidement à des clients et des cas d'utilisation différents qui pourraient devenir des problèmes concrets. Vous n’aurez peut-être pas la possibilité d’entraîner votre modèle à chaque fois que vos données changent. C’est ce que j’ai constaté par moi-même alors que je travaillais sur un projet pour une grande banque allemande. Ce qui va donc se passer, c’est que vous allez travailler avec des modèles obsolètes, qui ne seront plus aussi adaptés.

Lorsque vous optez pour l’approche Elasticsearch, l’entraînement se fait au moment de l’indexation et votre modèle peut être mis à jour de façon dynamique n’importe quand sans qu’il y ait d’interruption de votre application. Si vos données sont stockées dans Elasticsearch, vous n’avez pas besoin d’infrastructure supplémentaire. Avec plus de 10 % de résultats hautement précis, vous pouvez généralement remplir la première page. Dans bon nombre d’applications, c’est suffisant pour avoir une première impression globale.

Pourquoi, dans ce cas, utiliser Elasticsearch alors qu’il existe d’autres outils ?

Parce que vos données sont déjà là et que la solution va pré-calculer les statistiques sous-jacentes de toute façon. Un peu comme si vous aviez un TALN pratiquement gratuit !


Saskia Vola

Saskia Vola a étudié la linguistique informatique à l’Université d’Heidelberg et a commencé à travailler dans le domaine du text mining en 2009. Après quelques années passées dans des startups sur la scène berlinoise, Saskia s’est lancée en tant que freelance à temps plein et profite de son statut de nomade digitale. Recevant un nombre croissant d’offres de projet pertinentes, elle a décidé de mettre en place une plate-forme pour les freelances travaillant en TALN/IA, appelée textminers.io