Classification de phrases avec word2vec

Le texte est toujours délicat à traiter. La langue est importante et plus le vocabulaire est étendu, plus il faut de données. Le problème qui suit est classique, on cherche à catégoriser des phrases en sentiment positif ou négatif. Ce pourrait être aussi classer des spams. Le problème le plus simple : une phrase, un label.

Les données

Elles proviennent de Sentiment Labelled Sentences Data Set.

On découpe en train and test.

L'approche classique

TF-IDF est une approche très répandue lorsqu'il s'agit de convertir des phrases en features.

Autres modèles que la RandomForest

La forêt aléatoire n'est pas nécessairement le meilleur modèle, comme l'affirme #25 - Choix des classificateurs dans Classification de phrases avec word2vect. La transformation du texte en feature génère beaucoup de variables et un arbre de décision n'exploite quasiment que le fait qu'elles soient non nulles. Un arbre de décision consiste à prendre des décisions sur des seuils puis retourne une constante tirer d'une feuille de l'arbre. Un modèle linéaire ferait tout aussi bien l'affaire avec en plus la possibilité de tenir compte de la valeur de la variable.

L'autre aspect à prendre en compte est la profondeur de l'arbre. Par défaut, elle est de 10, soit $2^{10}=1024$ décisions de seuils, soit au mieux $2^{10}$ variables ce qui est loin du nombre de variables total.

Essayons d'abord avec un modèle linéaire.

On vérifie ensuite qu'en augmentant la profondeur de l'arbre, la forêt aléatoire est plus performante.

Ainsi qu'en augmentant le nombre d'arbre puisque l'algorithme balaiera plus de variables.

Un seul arbre de décision produira des résultats plutôt pauvres.

Enfin, un modèle de gradient boosting devrait sans doute dépasser les forêts aléatoires puisque les arbres ne sont plus appris indépendemment les uns des autres.

On garde la régression logistique pour la suite.

Les n-grammes

L'approche présentée ci-dessus ne tient pas compte de l'ordre des mots. Chaque phrase est convertie en un sac de mots (ou bag of words). Il est néanmoins possible de tenir compte de séquence plus ou moins longue.

scikit-learn permet d'essayer cette idée simplement.

Il y a plus de colonnes, on vérifie malgré tout que les features ressemblent à des couples de mots.

C'est le cas.

Cela n'améliore pas de façon significative. Il faudrait faire une cross-validation pour s'en assurer.

Réduire les dimensions avec une ACP

C'est un moyen fréquemment utilisé pour réduire les dimensions. On choisit le modèle TruncatedSVD plutôt que l'ACP dont l'implémentation ne supporte pas les features sparses.

Et si on repart de TF-IDF :

C'est mieux mais cela reste moins bien que le tf-idf sans réduction de dimensions. Cela veut dire qu'il faut garder plus de dimensions.

word2vec

word2vec est une sorte d'ACP non linéaire en ce sens qu'il réduit les dimensions. Il faut lire Analyse en composantes principales (ACP) et Auto Encoders pour comprendre le lien entre ACP, ACP non linéaire, réseaux de neurones diabolo et compression. word2vec est plus d'une ACP non linéaire car il prend en compte le contexte mais ne s'en éloigne pas tant que ce ça.

Les paramètres d'apprentissage du modèle Word2Vec ne sont pas toujours décrit de façon explicite.

Les dix premières coordonnées du vecteur associé au mot after.

Lorsque le mot est inconnu :

Pour chaque phrase, on fait la somme des vecteurs associés aux mots qui la composent ou pas si le mot n'est pas dans le vocabulaire. Il y a probablement des fonctions déjà prêtes à l'emploi mais la documentation de gensim n'était pas assez explicite et lire l'article Efficient Estimation of Word Representations in Vector Space puis celui-ci Distributed Representations of Words and Phrases and their Compositionality.

La performance est nettement moindre et notamment moindre que la performance obtenue avec l'ACP. Il faudrait sans doute jouer avec les hyperparamètres de l'apprentissage ou réutiliser un model appris sur un corpus similaire aux données initiales mais nettement plus grand. On peut constater que la fonction de similarités ne retourne pas des résultat très intéressants.

word2vec pré-entraînés

Ce modèle est plus performant avec plus de données. On peut télécharger des modèles pré-entraîner sur des données plus volumineuses : Pre-Trained Word2Vec Models ou encore Pre-trained word vectors of 30+ languages. Ceux-ci sont plutôt gros (> 600 Mo). Le module spacy propose une version plus légère et mieux documentée Word Vectors and Semantic Similarity avec les données en_core_web_md.

C'est un peu mieux mais un peu plus coûteux en temps de calcul mais même sans entraînement, le modèle obtenu est plus performant avec 300 dimensions que celui obtenu avec l'ACP. Le corpus extérieur au problème apporte de la valeur.