Comprendre les bases du Traitement du Langage Naturel (NLP)

C

Introduction au Traitement du Langage Naturel (NLP)

Dans cet article, je vais aborder de façon théorique les différentes phases du processus de traitement du langage naturel (NLP).

Dans la continuité de ce premier article, j’appliquerai ce processus de traitement du langage naturel à un large corpus. Il est en effet trop fréquent de voir des exemples limités à deux ou trois phrases. Il est donc essentiel de tester si le modèle est robuste face à un large corpus.
Dans un troisième temps, je montrerai comment appliquer des tests de similarité cosinus sur le corpus.
Enfin, un dernier article sera consacré à l’entraînement du modèle grâce au fine-tuning, afin de le rendre encore plus adapté aux besoins spécifiques de chacun.

Il existe de nombreuses bibliothèques permettant de faire du NLP. Si l’on cherche une bibliothèque pour appliquer des tests sur un corpus dans le cadre de la recherche en Sciences Humaines, il est important de comprendre les étapes possibles du traitement. Il est également crucial de choisir une bibliothèque offrant la meilleure précision possible.
À ce niveau, BERT est souvent cité comme une référence en termes de précision, comparable à des modèles plus avancés comme GPT-3. Développé et intégré par Google, BERT a été conçu pour mieux comprendre aux requêtes des utilisateurs. En particulier, BERT aide Google à saisir le contexte des mots dans les recherches.

En conclusion, comprendre les différentes étapes du NLP et choisir les bonnes bibliothèques est essentiel pour effectuer des analyses précises et pertinentes. BERT, grâce à ses capacités avancées de compréhension contextuelle, se positionne comme un outil de référence dans ce domaine. Mais il est (très gourmand) en ressource et nécessitant de passer avec Google Colab.
Voici les principales bibliothèques de traitement du langage.
Dans ce tutoriel, je me concentrerai donc sur la description des étapes du processus de traitement du langage avec la bibliothèque la plus « efficiente » (rapport vitesse/simplicité/efficacité) : SpaCy.

  • NLTK – est généralement moins performante que SpaCy
  • SpaCy – Rapide et précise – trois niveaux de précision :  fr_core_news_sm, (small) –  fr_core_news_md (médium) – fr_core_news_lg (large, le plus précis)
  • Stanza – performante mais plus lente dans le traitement que SpaCy
  • BERT (CamemBERT, FlauBERT pour la version Française) – Très précis pour des tâches spécifiques après fine-tuning, mais nécessitent des ressources de calcul importantes nécessitant souvent de passer avec Google Colab

L’une des forces des processus de traitement du langage naturel (NLP) réside dans leur capacité à interpréter correctement le contexte et la signification des mots dans différentes phrases.
Prenons l’exemple de la phrase : « C’est un fait !« .
Dans ce contexte, les processus NLP, tels que l’étiquetage grammatical (POS tagging), identifient correctement « fait » comme un nom.
Cependant, si la lemmatisation était appliquée dès le début du traitement, « fait » pourrait être réduit à la forme du verbe « faire ».
Cela créerait une confusion sémantique. Car la phrase « C’est un fait ! » ne peut être appréhendée comme la phrase : « Il fait de son mieux« , où « fait » est la forme conjuguée du verbe « faire ».

Introduction aux fonctionnalités de SpaCy

SpaCy offre une suite complète de fonctionnalités qui permettent d’analyser et de comprendre les textes en profondeur.

Voici une liste des principales fonctionnalités offertes par SpaCy :

  1. Tokenisation : Division du texte en plus petites unités appelées tokens.
  2. Part-of-Speech Tagging (POS Tagging) : Attribution de catégories grammaticales (noms, verbes, adjectifs, …) aux tokens.
  3. Lemmatisation : Réduction des mots à leur forme de base (lemmes).
  4. Parsing (Analyse Syntaxique) : Analyse de la structure grammaticale des phrases et établissement des relations entre les tokens.
  5. Reconnaissance d’entités nommées (NER) : Identification et classification des entités nommées (personnes, organisations, lieux, dates,…).
  6. Segmentation de phrases : Division du texte en phrases.
  7. Matching : Identification de motifs spécifiques dans le texte à l’aide d’expressions régulières ou de règles linguistiques => non développé dans ce tuto
  8. Détection des entités temporelles : Identification des dates et des périodes dans le texte. => non développé dans ce tuto

Dans ce tutoriel, nous n’aborderons pas la vectorisation des mots et les tests de similarité, qui utilisent des embeddings de mots pour calculer la similarité entre les tokens ou les phrases.

Désactivation des Composants SpaCy

Pour optimiser les performances et la vitesse d’analyse, SpaCy permet de désactiver certaines composantes de son pipeline lorsqu’elles ne sont pas nécessaires. Cela réduit l’utilisation des ressources et accélère le traitement du texte. Personnellement, je n’ai jamais désactivé les fonctionnalités.

import spacy

# Charger le modèle de langue française en désactivant certaines composantes
nlp = spacy.load("fr_core_news_sm", disable=["ner", "parser", "tagger", "lemmatizer"])

 

1. Le processus de Tokenisation

La tokenisation est le processus de division d’un texte en plus petites unités appelées « tokens« . En séparant le texte en unités plus petites, la tokenisation permet d’analyser chaque composant individuellement.
Par exemple, la phrase « L’intelligence artificielle transforme le monde. » serait découpée en tokens [« L' », « intelligence », « artificielle », « transforme », « le », « monde », « . »].
Cette étape est cruciale car elle constitue la base sur laquelle toutes les autres analyses sont effectuées, facilitant ainsi l’extraction d’informations, la classification, et d’autres tâches de traitement du langage naturel.

import spacy

# Charger le modèle de langue française
nlp = spacy.load("fr_core_news_sm")

# Phrase d'exemple
phrase = "L'intelligence artificielle transforme le monde."
doc = nlp(phrase)

# Tokenisation
tokens = [token.text for token in doc]
print("Tokenisation:", tokens)

Voici le résultat dans le terminal de PyCharm :

2. Le POS Tagging (Part-of-Speech Tagging)

Le POS tagging, ou étiquetage grammatical, est l’attribution de catégories grammaticales à chaque token d’un texte.
Ces catégories incluent les noms, verbes, adjectifs, adverbes,…
Le POS tagging permet de comprendre la fonction grammaticale des mots dans une phrase, ce qui est essentiel pour l’analyse syntaxique et sémantique du texte.
Il aide à déduire les relations entre les mots et à améliorer la précision des modèles de traitement du langage.

import spacy

# Charger le modèle de langue française (large)
nlp = spacy.load("fr_core_news_lg")

# Nouvelle phrase d'exemple
phrase = "Le chien court dans le parc."
doc = nlp(phrase)

# Dictionnaire des définitions des tags
pos_definitions = {
    'DET': 'Déterminant',
    'NOUN': 'Nom',
    'ADJ': 'Adjectif',
    'VERB': 'Verbe',
    'ADV': 'Adverbe',
    'PRON': 'Pronom',
    'PROPN': 'Nom propre',
    'CONJ': 'Conjonction',
    'ADP': 'Adposition',
    'AUX': 'Auxiliaire',
    'CCONJ': 'Conjonction de coordination',
    'SCONJ': 'Conjonction de subordination',
    'NUM': 'Numéral',
    'PART': 'Particule',
    'PUNCT': 'Ponctuation',
    'SYM': 'Symbole',
    'INTJ': 'Interjection'
}

# POS Tagging (Part-of-Speech Tagging) avec affichage formaté
print("Résultats avec SpaCy :")
for token in doc:
    pos = token.pos_
    print(f"{token.text} -> {pos} ({pos_definitions.get(pos, 'Tag inconnu')})")

Le résultat affiché dans le terminal est décevant : le verbe « transformer » est incorrectement détecté comme un « nom ».

En gardant la bibliothèque SpaCy, nous changeons la phrase et là… miracle !

Test du POS Tagging avec BERT

Et du côté de BERT ?…
BERT n’est pas spécifiquement conçu pour le POS tagging, mais il peut être utilisé pour cette tâche s’il est entraîné (fine-tuné). En d’autres termes, je n’ai pas réussi à faire du POS tagging avec BERT, et je suis un peu déçu du résultat du modèle SpaCy.

Test du POS Tagging avec Stanza

Stanza est une bibliothèque de traitement du langage naturel (NLP) développée par l’Université de Stanford. Elle offre une large gamme de fonctionnalités NLP, y compris la tokenisation, le POS tagging, la reconnaissance d’entités nommées (NER), l’analyse syntaxique (parsing), …

# pip install stanza

import stanza

# Télécharger le modèle pour le français
stanza.download('fr')

# Charger le modèle français
nlp = stanza.Pipeline('fr')

# Phrase d'exemple
phrase = "L'intelligence artificielle transforme le monde."

# Analyser la phrase
doc = nlp(phrase)

# Afficher les résultats
print("Résultats avec Stanza :")
for sentence in doc.sentences:
    for word in sentence.words:
        print(f"{word.text} -> {word.upos}")

Le résultat avec Stanza est concluant, contrairement au modèle SpaCy qui échoue avec la phrase utilisée (« L’intelligence artificielle transforme le monde »).

En conclusion Spacy ne semble pas avoir une précision incroyable avec un modèle de langage Français et cela même si on change et sollicite les différents modèles (_sm, _md, _lg)… Il faudra entraîner le modèle avec vos data si vous voulez améliorer les performances de spaCy.

 

3. Le Parsing

Le parsing, ou analyse syntaxique, est le processus d’analyse de la structure grammaticale des phrases. Il consiste à décomposer une phrase en ses constituants grammaticaux et à établir les relations entre eux. Par exemple, dans la phrase « L’intelligence artificielle transforme le monde. », l’analyse syntaxique permet de déterminer que « L’intelligence artificielle » est le sujet, « transforme » est le verbe, et « le monde » le complément. Le parsing est essentiel pour comprendre la structure et la signification des phrases, et il est souvent utilisé dans les applications de traduction automatique, d’analyse de sentiments.

import spacy

# Charger le modèle de langue française
nlp = spacy.load("fr_core_news_sm")

# Phrase d'exemple
phrase = "L'intelligence artificielle transforme le monde."
doc = nlp(phrase)

# Parsing (Analyse Syntaxique)
print("Analyse Syntaxique :")
for token in doc:
    print(f"{token.text} -> {token.dep_} (tête: {token.head.text})")

Le résultat :

4. La Lemmatisation

La lemmatisation consiste à ramener les mots à leur forme de base, appelée lemme. Par exemple, les mots « mangé », « mangerait » et « mangeant » sont tous réduits à leur lemme « manger« . Ce processus aide à normaliser les mots pour l’analyse, en réduisant leurs variations et en permettant aux mots ayant des significations similaires de se regrouper.

import spacy

# Charger le modèle de langue française
nlp = spacy.load("fr_core_news_sm")

# Texte d'exemple
texte = """
L'intelligence artificielle (IA) est un domaine de recherche en pleine expansion.
Les technologies d'IA, comme le machine learning et le deep learning, permettent de développer des systèmes capables d'apprendre et de s'adapter.
Google, par exemple, utilise l'IA pour améliorer ses résultats de recherche et proposer des solutions innovantes.
De nombreux experts estiment que l'IA transformera de nombreux secteurs, y compris la santé, l'éducation et les transports.
"""

# Analyse du texte avec SpaCy
doc = nlp(texte)

# Lemmatisation
lemmes = [token.lemma_ for token in doc]
print("Lemmatisation:", lemmes)

 

5. Reconnaissance d’entités nommées (NER)

La reconnaissance d’entités nommées (NER) est une tâche qui consiste à identifier et classifier les entités nommées dans un texte. On peut constater que le modèle (_sm => small) ne brille pas ! à travers cet exemple on retrouve quelques confusions et oublis…

import spacy

# Charger le modèle de langue française avec toutes les composantes activées
nlp = spacy.load("fr_core_news_sm")

# Phrase d'exemple
phrase = "L'intelligence artificielle développée par OpenAi, Google et Jacques Chirac et Emmanuel Macron transforme le monde."
doc = nlp(phrase)

# Tokenisation
tokens = [token.text for token in doc]
print("Tokenisation:", tokens)


# Reconnaissance d'entités nommées (NER)
print("\nReconnaissance d'entités nommées (NER) :")
for ent in doc.ents:
    print(f"{ent.text} -> {ent.label_} ({spacy.explain(ent.label_)})")

phrase = « L’intelligence artificielle développée par OpenAi, Google et Jacques Chirac et Emmanuel Macron transforme le monde. »

« Emmanuel Macron » n’est pas détecté, et « OpenAI » est classé comme « Divers ».

En revanche, avec le modèle large (fr_core_news_lg (large, le plus précis), ça fonctionne mieux 😉

6. Segmentation des phrases

La segmentation de phrases dans SpaCy repose sur plusieurs mécanismes pour déterminer les limites des phrases.
Voici un aperçu de ces mécanismes :

  1. Ponctuation : SpaCy utilise des règles de ponctuation pour identifier les fins de phrases. Par exemple, les points, points d’interrogation, et points d’exclamation sont des indicateurs forts de la fin d’une phrase.
  2. Règles Linguistiques : SpaCy intègre des règles linguistiques spécifiques à chaque langue pour améliorer la segmentation de phrases. Ces règles tiennent compte des contextes où la ponctuation ne suffit pas à déterminer la fin d’une phrase
import spacy

# Charger le modèle de langue française (large pour une meilleure précision)
nlp = spacy.load("fr_core_news_lg")

# Texte d'exemple
texte = "L'intelligence artificielle développée par Google transforme le monde. Elle est utilisée dans divers domaines comme la santé et l'éducation."

# Analyse du texte avec SpaCy
doc = nlp(texte)

# Segmentation de phrases
phrases = [sent.text for sent in doc.sents]
print("\nSegmentation de phrases:", phrases)

Conclusion

À travers les différentes étapes du traitement du langage naturel avec SpaCy, plusieurs points clés se dégagent :

  1. Choix du modèle : Il est recommandé de charger le modèle large (fr_core_news_lg) pour utiliser SpaCy. Ce modèle offre la plus grande précision.
  2. Désactivation des fonctionnalités : Dans le cadre de l’analyse d’un corpus en Sciences Humaines, il n’est généralement pas judicieux de désactiver des opérations du processus. SpaCy fonctionne efficacement sur des grands corpus texte, même sur mon Mac M2.
  3. Ordre des étapes de traitement : Le processus de lemmatisation doit être effectué en premier ou après les autres étapes de traitement. En appliquant la lemmatisation trop tôt, on risque de perdre des informations contextuelles essentielles. Cependant, en testant les deux scénarios, j’ai constaté que le POS tagging était parfois amélioré, mais aussi parfois instable.
  4. Entraînement du modèle: Un autre tutoriel montrera les possibilités d’entraînement de votre propre modèle (fine-tuning) pour rendre SpaCy permettant d’améliorer les performances de traitement. Cela me semble O.B.L.I.G.A.T.O.I.R.E pour avoir un outil précis.

En conclusion, SpaCy est un outil qui se distingue par sa facilité d’utilisation. Cependant, sans fine-tuning, il ne fara pas des miracles, notamment sur des corpus et des discours politiques ou scientifiques utilisant un langage précis.

A propos de l'auteur

Stéphane Meurisse

3 Comments

Stéphane Meurisse