NLP : Extraire des caractéristiques pour utiliser des algorithmes ML

Englishement nommé : Features extraction

Articles liés : Nettoyage complet d’un corpus, Détection de spams et Quelles métriques choisir ?

Prêt à compter ? Photo by Crissy Jarvis on Unsplash

La manipulation de texte est l’une des tâches les plus communes dans le monde du machine learning. Traduction, extraction d’informations, analyse de sentiments…

Mais depuis un texte brut ou même un texte bien nettoyé (cf. cet article), les algorithmes de machine learning ne peuvent rien faire. Les mots n’ont aucune signification tant qu’ils ne sont pas encodés en 0 et 1.

De plus, les mots contiennent énormément de paramètres ; chaque lettre codée en ASCII multipliée par le nombre de lettres dans un mot peut être remplacée par un vecteur de quelques bits (le feature vector). C’est pourquoi l’étape d’extraction de caractéristiques va permettre d’extraire l’information utile, à savoir l’occurrence de mots dans une phrase, et réduire le poids des données d’entrée.

Les différentes méthodes

  • Word2vec
  • Gloves et FastText
  • TF-IDF
  • Count vectorizer

Je vais les présenter succinctement.

I. Word embedding

1. One-hot encoding

Si notre texte était “Madame, Monsieur, comment allez-vous ?”, nous aurions madame = [1,0,0,0,0], monsieur = [0,1,0,0,0], comment = [0,0,1,0,0], allez = [0,0,0,1,0], vous = [0,0,0,0,1].

Cette méthode est rapide, facilement compréhensible et très adaptée pour un petit corpus. Mais elle est trop simpliste et ne prend pas en compte les relations entre les mots.

Par exemple, si l’on imagine un espace en 5 dimensions représentant notre vocabulaire précédent, “madame” et “monsieur” sont aussi distants que “comment” et “vous”, la relation existante entre “madame” et “monsieur” dans le monde réel n’est pas représentée avec cette simple méthode. De plus, si l’on a un vocabulaire de 1 000 mots, le simple mot “je” occupe 1 000 bits… Alors one-hot encoding, on le garde pour encoder les variables catégorielles…, mais c’est tout !

De là est venue l’idée d’instaurer une dépendance entre les mots. C’est pourquoi Tomas Mikolov et son équipe de Google ont lancé Word2Vec : https://arxiv.org/pdf/1310.4546.pdf

2. Word2vec

Ainsi, “king” et “queen” seront plus proches (vectoriellement parlant) que “irénisme” et “mirliflore” ne le sont.

La méthode utilisée par Word2vec est la combinaison de deux architectures : Skip-Gram et Continuous Bag Of Words (CBOW).

CBOW : Cette architecture prend un contexte (une suite de mots) en entrée et prédit un mot qui correspond à ce contexte. Dans cette architecture, l’ordre des mots n’a pas d’importance, si bien que CBOW peut prédire un mot en ayant reçu le contexte précédent et suivant.

Skip-gram : Cette seconde architecture est similaire à CBOW, mais au lieu de prédire un mot à partir d’un contexte, Skip-gram utilise un mot en données d’entrée pour prédire le contexte (les mots qui habituellement entourent le mot reçu en données d’entrée).

Comparaison des deux architectures (Source: Efficient Estimation of Word Representations in Vector Space, Tomas Mikolov)

Dans les deux cas, l’input est un vecteur one-hot encodé (c’est à dire un vecteur composé de zéros et d’un 1 permettant d’identifier un mot).

Concrètement ?

Concrètement, Word2vec est un réseau de neurones peu profond, contenant un unique hidden layer. En recevant un corpus comme données d’entraînement, le réseau de neurones va ajuster ses poids (backpropagation) avec chaque mot et la fenêtre entourant ce mot. Mais contrairement à ce qui se fait habituellement, le modèle entraîné ne sera pas réutilisé pour prédire quoi que ce soit. Une fois l’entraînement fini, le hidden layer est extrait et devient la représentation vectorielle du mot d’entrée.

En creusant un peu sur ce sujet, j’ai réalisé que 99 % des articles mentionnant Word2vec utilisent la library Gensim sans réfléchir ni expliquer au préalable le fonctionnement de Word2vec. J’écrirai donc un article dédié à cela.

D’ici là, cet article, celui-là, ou encore lui, ou lui et cette vidéo pour comprendre et apprendre le fonctionnement de Word2vec (accompagné de cette animation).

3. Gloves et Fasttext

Gloves développe lui aussi une représentation vectorielle des mots, mais ce modèle s’intéresse aux co-occurrences, c’est-à-dire aux mots qui apparaissent ensemble dans une phrase. Par exemple, “hémistiche” apparaît plus fréquemment avec “poésie” qu’avec “nucléaire”.

La distance euclidienne entre deux mots traduit la proximité entre ceux-ci. Le tout en apprentissage non supervisé !

Qu’est-ce qui manque après Word2vec de Google et Gloves de Stanford ? Facebook ? Certes, mais pas que. Que fait-on des mots inconnus ? Les mots qui n’étaient pas présents dans le corpus d’apprentissage ? C’est la question à laquelle Facebook a répondu en lançant FastText. Ce modèle s’intéresse en plus aux parties d’un mot, le mot devient son propre contexte. Faisant cela, le modèle a besoin de moins de données d’apprentissage et peut traiter les mots inconnus.

II. Bag-of-words

Cette méthode est appelée bag-of-words car les mots sont conservés sans aucune structure, sans aucune dépendance les uns avec les autres. Le modèle permet juste de savoir si un mot est présent ou non et à quelle fréquence. Cette méthode est utilisée pour l’extraction de sujets, l’analyse de sentiments, mais est inefficace pour la traduction ou le résumé de textes où la place des mots dans la phrase a son importance.

1. Count vectorizer

Dans l’exemple précédent, le mot “document” apparaît deux fois dans le deuxième document, c’est pourquoi X[1,1] = 2.

La méthode CountVectorizer permet de compter les n-grams (ngram_range=(n,n)), c’est-à-dire les groupes de mots ; dans certains problèmes, il est plus pertinent de ne considérer que les groupes de 2 mots.

Il est aussi possible d’ignorer les mots d’occurrences trop faibles (min_df = m) pour limiter le nombre de paramètres, ou bien de ne considérer que les Y mots les plus fréquents (max_features = l).

2. TF-IDF

Un peu (très peu) de maths :

TF(t,i) = Nombre d’apparitions du terme t dans le document i / Nombre total de termes dans le document

IDF(t) = log(Nombre de documents dans le corpus / Nombre de documents où t apparaît)

D’où TF(t,i) * IDF(t) donne la pertinence de chaque document vis-à-vis d’un mot.

On le voit, calculer cela à la main n’est pas très compliqué mais très répétitif et pas forcément intéressant. C’est pourquoi nous pouvons utiliser la formidable méthode de Sklearn.

Le TF-IDF le plus élevé est atteint par X.argmax() = 10, ce qui correspond au mot “document” dans le deuxième document qui apparaît deux fois comme nous l’avons vu précédemment. Cependant, l’observateur aguerri verra que “first” qui apparaît une seule fois dans le premier document a aussi un TF-IDF élevé ; cela est dû au fait que “first” apparaît rarement dans les autres documents.

Mais à quoi sert ce truc ?

Imaginez un corpus composé de commentaires de clients sur un produit. Le TF-IDF permet d’identifier les commentaires les plus pertinents pour un aspect du produit et de pouvoir catégoriser les commentaires (commentaires mentionnant le prix, la taille, le poids…). Cette méthode est donc à préférer pour les problèmes d’extraction d’information (topic classification).

Conclusion

Une fois cette étape réalisée, il est temps de classifier !

Data scientist jr & Javascript + Python full-stack developer… ok I like tech and do all kind of stuff

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store