Introduction au NLP (Partie II)

Actualité ekino -

Ou comment avoir une conversion avec une machine

Article paru le :
Intoduction to NLP (Part I)
Article paru le :

 

This article is available in english.

 

Introduction

Après une première partie permettant de poser les principes fondamentaux et généraux du NLP, nous allons nous intéresser aux frameworks disponibles pour faire du NLP ainsi qu’à la particularité des données utilisées en NLP.

 

Les frameworks

En Python

Le langage Python (en) est couramment utilisé pour faire du NLP. Il existe plusieurs librairies permettant de travailler avec le langage naturel. Les plus connues et utilisées sont Gensim (en), NLTK (en) et plus récemment SpaCy (en).

 

Figure 1. Librairies Python spécialisées dans le NLP.

 

Pendant longtemps, NLTK (Natural Language ToolKit) a été la librairie Python standard pour le NLP. Elle regroupe des algorithmes de classifications, de Part-of-Speech Tagging, de stemming, de tokenisation (en) de mots et de phrases. Elle contient également des corpora de données et permet de faire de la reconnaissance d’entités nommées (NER) et de l’analyse de sentiments. Même s’il y a des mises à jours régulières, la librairie NLTK commence un peu à dater (2001) et montre quelques limites notamment en terme de performance.

Une librairie plus récente (2015) semble avoir pris le relais de NLTK, il s’agit de SpaCy. Cette librairie écrite en Python et Cython regroupe les mêmes types d’outils que NLTK : tokenisation, POS-tagging, NER, analyse de sentiments (toujours en développement), lemmatisation. Elle possède également des vecteurs de mots pré-entraînés et des modèles statistiques dans plusieurs langues (anglais, allemand, français et espagnol jusqu’ici).

Enfin la troisième librairie mentionnée est un peu différente des deux autres. En effet, Gensim est une librairie spécialisée dans le Topic Modeling. Elle implémente plusieurs algorithmes statistiques de Topic Modeling (en) (Latent Dirichlet Allocation ou LDA, Latent Semantic Indexing ou LSI, Hierarchical Dirichlet Process (en) ou HDP) et permet également de faire du Word Embedding.

En plus de ces trois librairies, d’autres peuvent être utiles lorsque l’on veut faire du NLP. On peut citer la librairie de visualisation PyLDAvis (en) permettant de visualiser plus facilement les résultats de Topic Modeling (voir la figure 3. du premier post pour un exemple). Une autre librairie importante est la librairie de Machine Learning très connue, Scikit-Learn. Elle permet de faire de la tokenisation, de l’extraction de features (en) et implémente de nombreux algorithmes de classification. Enfin, on peut parler de Keras (en). C’est une API écrite en Python qui permet de construire et d’entraîner des modèles de réseaux de neurones. Ces modèles peuvent notamment être utilisés pour faire de la classification de textes. Keras permet aussi faire du Word-Embedding.

Autres langages

En dehors de Python, d’autres langages permettent de faire du NLP. Plusieurs outils open source sont écrits en Java :

  • Stanford CoreNLP (en) permet en autre de faire du POS-Tagging, du NER, de l’analyse de sentiment, de la tokenisation pour les langues anglaise, arabe, chinoise, française, allemande et espagnole.
  • Apache OpenNLP (en) gère le même type de tâches, tokenisation, segmentation de phrase, POS-Tagging, NER, détection de langue. Plusieurs langues sont supportées (danois, anglais, allemand, espagnol, néerlandais, portugais) mais pas pour toutes les tâches.

On peut également citer le langage R (en), très utilisé en Data Science. Plusieurs packages R sont dédiés au NLP :

  • cleanNLP (en) présente un ensemble de fonctions permettant de normaliser du texte,
  • coreNLP (en) fournit une interface pour plusieurs outils de la librairie Java Stanford CoreNLP,
  • openNLP (en) fournit une interface pour la librairie Java Apache OpenNLP,
  • NLP (en) présente des fonctions de base de NLP,
  • topicmodels (en) permet de faire du Topic Modeling avec la méthode LDA,
  • text2vec (en) fournit des fonctions pour faire de la tokenisation, de la vectorisation, du Topic Modeling (LDA, LSI) et du Word Embedding (algorithme GloVe).

Pour finir, on peut mentionner les outils closed source développés par les géants du Web : IBM Watson (en), Microsoft Azure, Google Cloud Platform, AWS qui possèdent tous des outils et API permettant de faire du NLP.

 

Les données en NLP

Spécificité du NLP

Comme nous l’avons vu dans le post précédent, les tâches de NLP font très souvent appel au Machine Learning. Un des points clé dans l’efficacité d’un modèle de Machine Learning est la qualité des données utilisées. Or les données textuelles sont très complexes à traiter. La partie de prétraitement des données dans une problématique de NLP est donc longue et fastidieuse.

Figure2. Exemple de prétraitement d'un tweet.Elle commence en général par une phase de nettoyage qui varie selon la source des données. Par exemple, dans le cas de données issues de réseaux sociaux ou forums, il peut être nécessaire de supprimer les smileys, emojis, urls et autres spécificités (hashtags, mentions…) mais aussi de gérer les onomatopées et les contractions de mots.

Une fois nettoyées, les données doivent être normalisées : tokenisation, lemmatisation, stemming, suppression des chiffres, ponctuation, symboles et stopwords, passage en minuscule. Toutes ces transformations ne sont pas forcément nécessaires, cela dépend de l’application et il faut parfois tester différentes approches pour déterminer quelles transformations augmenteront l’efficacité du modèle.

Enfin les méthodes de Machine Learning nécessitant des données quantitatives et non textuelles, il faut passer par une phase de transformation du texte en chiffres. Il existe différentes approches. La méthode Term-Frequency (TF) consiste simplement à compter, pour chaque texte, le nombre d’occurrences des tokens présent dans le corpus. Chaque texte est alors caractérisé par un vecteur d’occurrences et on obtient une représentation appelée Bag-Of-Word (en) (ou sac de mots en français).

# Input
sentence_1 = "John likes to watch movies and Mary likes movies too"
sentence_2 = "John also likes to watch football games"

# Vocabulaire
['to', 'Mary', 'John', 'movies', 'likes', 'watch', 'and', 'too', 'games', 'also', 'football']

# Vecteurs TF
sentence_1 : [1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 0]
sentence_2 : [1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1]

La méthode TF-IDF (Term Frequency-Inverse Document Frequency) donne aussi une représentation vectorielle d’un texte mais avec des vecteurs de poids et non plus d’occurrences. Elle permet de donner un poids plus important aux termes les moins fréquents, considérés comme plus discriminants.

Cependant, ces méthodes présentent deux inconvénients majeurs : la taille des vecteurs obtenus qui croît avec le vocabulaire et un manque de sens des vecteurs. En effet, la position des mots dans le vocabulaire étant arbitraire, elle ne permet pas de décrire une éventuelle relation entre eux.

Une méthode récente permet de lisser ces inconvénients. Il s’agit du Word Embedding. Dans cette technique, la dimension du vecteur est un paramètre qui est choisi. De plus, les vecteurs sont construits de manière à prendre en compte le contexte des mots. Ainsi les mots apparaissant dans des contextes similaires auront des vecteurs plus proches (en terme de distance vectorielle) que d’autres apparaissant dans des contextes différents, permettant ainsi de capturer les éventuelles similarités sémantiques, syntaxiques ou thématiques des mots.

# Calcul de la similarité entre les vecteurs des mots man et woman
man = nlp_en('man')
woman = nlp_en('woman')
man.similarity(woman)

# Output
0.74017445384912972

# Calcul de la similarité entre les vecteurs des mots tree and dog
tree = nlp_en('tree')
dog = nlp_en('dog')
tree.similarity(dog)

# Output
0.32623763568487174

Cette méthode transforme chaque mot d’un texte en vecteur numérique. Pour avoir une représentation numérique d’un texte avec cette méthode, plusieurs stratégies sont possibles. On peut représenter un texte par un tableau de vecteurs, un vecteur pour chaque mot du texte, ou alors on peut représenter un texte par un unique vecteur correspondant à une combinaison (une moyenne par exemple) des vecteurs des mots composants le texte.

En plus de la difficulté amenée par l’utilisation de données textuelles, vient celle de la diversité des langues. On pourrait penser que les features et les méthodes sont indépendantes de la langue utilisée, or les langues ont des spécificités dont il faut tenir compte lorsque l’on fait du NLP. Par exemple, un modèle basé sur des n-grammes sera moins robuste pour des langues possédant un ordre des mots très libre. Pour certaines langues asiatiques telles que le mandarin, le japonais et le thaï, la segmentation des mots n’est pas aussi claire que pour les autres langues, la tâche de segmentation aura donc une plus grande importance.

Source des données

Le jeu de données nécessaire au développement d’une application de NLP va varier selon le type de l’application. Par exemple, une tâche de classification va demander un jeu de données labellisées suivant les classes souhaitées alors que pour un modèle de Topic Modeling ou de clustering les labels ne sont pas nécessaires.

Figure 3. Extrait d’un corpus de tweets labellisés.

Pour faire du Word Embedding, il existe des frameworks permettant de créer un modèle à partir de son propre corpus de textes ou bien il est possible d’utiliser des ensembles de vecteurs pré-entraînés.

L’anglais est sans surprise la langue qui dispose du plus grand nombre de ressources. On trouve relativement facilement des jeux de données labellisées ou non ainsi que des vecteurs de Word Embedding pré-entraînés sur le net pour la langue anglaise. Les sources de données pour les autres langues sont moins fournies mais tendent à se développer. Par exemple, la librairie SpaCy possède plusieurs ensembles de Word Embedding pré-entraînés en anglais mais aussi un ensemble en français, un en allemand et un en espagnol. On peut également citer le géant du web Facebook qui a développé l’algorithme de Word Embedding FastText (en). On peut ainsi trouver des vecteurs pré-entraînés (en) avec FastText à partir de Wikipédia dans 294 langues. D’autres sources de vecteurs pré-entraînés sont données dans la bibliographie.

Il est aussi possible de se créer ses propres jeux de données en faisant par exemple du Web Crawling (Wikipédia est une source de textes multilingues très riche) ou en utilisant des APIs de récupération de tweets ou de news. Le plus long étant de labelliser les jeux de données ainsi obtenus lorsque l’on veut faire des tâches supervisées.

 

Conclusion

Dans cette introduction en deux partie, nous avons donc fait une présentation générale du NLP et de ses applications courantes. Nous avons également passé en revue quelques frameworks souvent utilisés et mis en évidence la complexité de la tâche de pré-traitement pour passer d’un texte brut à des données exploitables dans une application de traitement du langage.

Pour rentrer un peu plus en détails sur le NLP et ses différentes applications, une série de posts déroulant des exemples de code en Python fera suite à cette brève introduction. Nous y aborderons des sujets comme le Topic Modeling, le Word Embedding ainsi que les méthodes de classifications de textes.

 

Bibliographie

 

Crédit images

L’ensemble des illustrations sont sous licence CC0 (en).