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

Beranger Natanelic
7 min readOct 6, 2020

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

  • One-hot encoding
  • Word2vec
  • Gloves et FastText
  • TF-IDF
  • Count vectorizer

Je vais les présenter succinctement.

I. Word embedding

1. One-hot encoding

Tout simplement un vecteur qui représente un mot. Ou un mot représenté par un vecteur, au choix.

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

Word2vec crée une représentation vectorielle des mots qui prend en compte le contexte dans lequel ces mots sont plongés, il prend en compte les dépendances. Dit autrement, pour un mot donné, Word2vec considère aussi les mots qui le précèdent et le suivent (les X mots précédents et X mots suivants (X étant la fenêtre)).

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

Deux modèles avec lesquels je n’ai jamais travaillé mais qui ont des objectifs proches de Word2vec.

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

Un sac de mots ou bag-of-words est une représentation d’un texte qui décrit les occurrences des mots dans un document. Le bag-of-words est tout simplement un tableau. Le nombre de colonnes correspond au nombre de mots présents dans l’ensemble des textes du corpus, chaque ligne correspond à un document. A l’intersection d’une colonne et d’une ligne, nous savons si un mot est présent ou non dans un document. Ce paramètre peut être le nombre d’occurrences du mot dans le document, ou bien une pondération.

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

Cette méthode permet de compter les occurrences de chacun des mots dans le document. Nous utilisons la library Sklearn qui permet beaucoup de paramétrages comme nous allons le voir.

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

Pour Term Frequency-Inverse Document Frequency. Ce calcul évalue l’importance d’un terme contenu dans un document, relativement à une collection. Si un mot rare est particulièrement présent dans un document, son TF-IDF sera très élevé.

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

Nous avons vu six méthodes d’encodage qui nous seront utiles pour réduire le nombre de dimensions de notre input et pour maximiser l’information pour faciliter le travail de nos algorithmes.

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

--

--

Beranger Natanelic

Daily Google Cloud Platform user. I am sharing learnings of my tries, struggle and success.