Inspirée d’une solution développée pour un client dans l’industrie Pharmaceutique, nous avons présenté à la conférence EGG PARIS 2019 une application basée sur le NLP (Natural Language Processing) et développée sur un environnement Dataiku DSS.
Plus précisément, nous avons entrainé un modèle deep learning à reconnaitre les mots clés d’un article blog, Medium en l’occurrence.
Cette solution appliquée aux articles de blogs peut servir à générer automatiquement des tags et/ou des mots-clés afin que les contenus proposés par les plateformes soient personnalisés et répondent aux attentes des lecteurs, tenant ainsi compte de leurs centres d’intérêts.
Au sens large, la détection des entités permet une analyse automatisée et intelligente d’un texte, utile surtout pour les documents longs et complexes comme les documents scientifiques ou juridiques.
Pour en démontrer l’usage, nous avons intégré une commande vocale, basée sur les API cognitive services d’Azure. Le module de speech to text permet de renvoyer le texte de la requête en input de l’algorithme. L’output est représenté sous forme de recommandation d’articles, classés par pertinence en fonction du domaine de recherche. Cet article explique notre démarche pour créer le modèle NLP sous-jacent.
[pour visualiser les commentaires, veuillez activer les sous-titres] Une vidéo qui illustre le fonctionnement de notre application web réalisé pour la conférence EGG Dataiku 2019
#1 Pourquoi extraire les mots clés des articles de blog Medium ?
Medium comporte deux systèmes de catégorisation : tags et topics.
Les topics sont imposés par la plateforme. L’auteur ne peut pas sélectionner son sujet (topic). Ils correspondent à des catégories assez génériques comme data science ou machine learning.
Les tags, au nombre maximum de 5 par article, sont essentiellement des sujets que l’auteur décide d’énumérer sous son post afin de le rendre visible. Ainsi un article peut porter des tags qui peuvent n’avoir aucun rapport avec le contenu de l’article/histoire.
Si vous l’étiquetez avec des termes communs, comme « TECHNOLOGIE » ou « MINDFULNESS » ou « LOVE » ou « LIFE LESSONS », votre article sera plus facile à rechercher. Mais cela rend la vie plus difficile à un lecteur qui cherche un sujet spécifique.
Nous allons donc essayer d’auto-tagguer des articles pour en accroitre la pertinence.
Grace à ces « nouveaux tags », ou « mots clés », nous pourrions rapidement rechercher les articles qui les mentionnent et ainsi accroitre l’efficacité de notre recherche.
Nous pourrions aller encore plus loin et construire un système de recommandation, en conseillant des articles proches de celui que nous sommes en train de lire, ou en nous conseillant de nouveaux articles en lien avec nos habitudes de lecture.
#2 L’approche NER (Named Entity Recognition)
En utilisant l’approche de NER (Named Entity Recognition), il est possible d’extraire les entités de différentes catégories. Il existe plusieurs modèles de base, pré-entraînés, comme en_core_web_md, qui est capable de reconnaître les personnes, les lieux, les dates…
Prenons l’exemple de la phrase I think Barack Obama met founder of Facebook at occasion of a release of a new NLP algorithm. Le modèle en_core_web_md détecte Facebook et Barack Obama comme entités.
Dans notre cas d’usage sur l’extraction de topics d’articles Medium, nous voudrions qu’il reconnaisse une entité supplémentaire dans la catégorie “TOPIC” : “NLP algorithm”.
Avec un peu de données annotées nous pouvons “apprendre” à l’algorithme à détecter un nouveau type d’entités.
L’idée est simple : un article tagué Data Science, IA, Machine Learning, Python peut concerner des technologies très différentes. Notre algorithme serait ainsi capable de détecter une technologie précise citée dans l’article, par exemple GAN, reinforcement learning, ou encore les noms de librairies python utilisés. Il garde également la capacité d’un modèle de base de reconnaitre les lieux, les noms d’organisations et les noms de personnes.
Lors de l’entraînement, le modèle apprend à reconnaitre les mots clés, sans les connaître a priori. Le modèle pourra reconnaitre par exemple le topic : random forest sans même qu’il ne soit présent dans les données d’apprentissage. En se basant sur des articles qui parlent d’autres algorithmes (par exemple linear regression), le modèle NER pourra reconnaitre la tournure de phrase qui indique que l’on parle d’un algorithme.
#3 Développement du modèle
Framework SpaCy
SpaCy est une librairie open-source pour le traitement avancé du langage naturel en Python. Il est conçu spécifiquement pour une utilisation en production et aide à construire des applications qui traitent de gros volumes de texte. Elle peut être utilisée pour construire des systèmes d’extraction d’information, de compréhension du langage naturel ou de prétraitement de texte en vue d’un apprentissage approfondi. Parmi les fonctions offertes par SpaCy on peut nommer : Tokenization, Parts-of-Speech (PoS) Tagging, Text Classification et Named Entity Recognition.
SpaCy fournit un système statistique exceptionnellement efficace pour NER en python. Outre des entités inclues par défaut, SpaCy nous donne également la liberté d’ajouter des classes arbitraires au modèle NER, en entraînant le modèle à le mettre à jour avec de nouveaux exemples formés.
Le modèle NER de SpaCy est basé sur les CNN (Convolutional Neural Networks).
Pour les curieux les détails de fonctionnement du modèle NER de SpaCy sont expliqués dans le vidéo :
Données d’entraînement
Pour commencer à entrainer le modèle à reconnaitre des mots clés tech, nous avons récupéré quelques articles Medium grâce à du web scrapping.
https://gist.github.com/UrszulaCzerwinska/db0aa37b1cb10ec94205d847f63ddc4f#file-scrappingmedium-py
Le texte de chaque article a été découpé en phrases pour faciliter l’annotation.
Il existe des outils d’annotation pour NER comme Prodigy ou autre, mentionné ici. Nous avons utilisé un simple tableur et dans les colonnes dédiées nous avons marqué les entités.
Pour donner une idée du volume nécessaire, avec une vingtaine d’articles (~600 phrases) notre modèle a commencé à montrer une performance intéressante (>0.78 de précision sur test).
Les données en train et test ont été séparées pour pouvoir évaluer le modèle.
Ensuite, nous avons fine-tuné notre algorithme en jouant sur plusieurs paramètres : nombre d’itérations, drop rate, learning rate et batch size.
Évaluation
En plus de la métrique loss du modèle, nous avons implémenté les indicateurs : precision, recall et F1 score, pour mesurer plus finement la performance de notre modèle.
https://gist.github.com/UrszulaCzerwinska/c23ce9e0edffe6f9790a2bbf8f018a4b#file-test_eval
Une fois entrainé sur l’ensemble des données annotées, la performance du meilleur modèle sur notre jeu de test était assez impressionnante. Notamment si l’on prend en compte la modeste taille des données train : ~3000 phrases.
Dans l’outil Flow de DSS Dataiku le process de déploiement du modèle se résume par ce graphe :
Pour revenir à l’exemple sur Barack Obama, notre algorithme détecte l’entité NLP algorithm comme TOPIC en plus des entités ORG (organisation) et PERSON.
Nous avons réussi ! 🚀
Le modèle finalisé peut être compilé comme une librairie python indépendante (instructions ici) et installé avec “pip”. Ceci est très pratique pour porter le modèle dans un autre environnement et pour la mise en production.
#4 Exploitation du modèle
Analyse d’un article Medium
Dans notre mini webapp, présentée au EGG, il est possible d’afficher les entités les plus fréquentes d’un article Medium.
Ainsi, pour l’article : https://towardsdatascience.com/cat-dog-or-elon-musk-145658489730, les entités les plus fréquentes étaient : model, MobileNet, Transfer learning, network, Python. On a aussi détecté des personnes : Elon Musk, Marshal McLuhan et les organisations : Google, Google Brain.
Inspirés par le post de Xu LIANG, nous avons également utilisé sa façon de représenter la relation entre les mots sous la forme d’un graph de dépendances linguistiques. Contrairement à sa méthode, nous n’avons pas utilisé de TextRank ni de TFIDF pour détecter les mots clés mais uniquement notre model NER pré-entrainé.
Ensuite, comme Xu LIANG, nous avons utilisé la capacité de Parts-of-Speech (PoS) Tagging, hérité par notre modèle du modèle d’origine (en_core_web_md), pour lier les entités entre elles avec les arêtes, ce qui forme le graphe ci-dessous.
Ainsi, nous obtenons un graphe où les mots clés sont placés autour de leur catégorie : Tech topic, Person et Organisation.
Ceci donne un aperçu rapide du contenu d’un article Medium.
Voici comment obtenir le graphique à partir d’un lien url d’article Medium:
https://gist.github.com/UrszulaCzerwinska/cd03ccee2b7d056c65bed7acfbcec1c0#file-dependencygraph-py
Pour aller plus loin
Notre Showroom Saegus vous montrant notre webapp fonctionnelle arrive d’ici peu. N’hésitez pas à suivre notre page https://medium.com/data-by-saegus pour être tenu informé.
Le projet que nous avons exposé ici est facilement transposable dans les différents domaines d’industrie : documents techniques, juridiques, médicaux. Il pourrait être ainsi très intéressant d’analyser le code civil, pénal, le droit du travail… avec cette approche pour une meilleure efficacité dans la recherche que font tous les professionnels du droit.
Si vous voulez en savoir plus, n’hésitez pas à nous contacter !
Rédigé par Urszula Czerwinska, Consultante Data Driven Business
Thanks to Nicolas Risi, Simon Coulet, Eliot Moll, Lucas Leroux, Max Mauray, and Julien AYRAL.
Notes
(1) La plateforme DSS de Dataiku