NER avec BERT

NER (Reconnaissance d’Entité Nommées) avec CamemBERT

Dans cet article, nous faisons une implémentation de NER avec CamemBERT (une version française de BERT). Le NER (Named Entity Recognition) ou REN (Reconnaissance d’Entité Nommées) en français est une tâche de NLP qui a pour but d’étiqueter un mot (ou groupe de mots) d’un texte, à partir un ensemble d’étiquettes prédéfinies.

Exemple :

But : Dans le texte ci-dessous, nous voulons identifier les individus et les lieux.

Texte : « Henri ira bientôt à Paris pour le travail. »

Résultat du NER : « Henri [PERS] ira [O] bientôt [O] à [O] Paris [LIEU] pour [O] le [O] travail [O]. »

Étiquettes :

  • [O] : Il s’agit de l’étiquette par défaut associée à tous les mots qui n’appartiennent à aucune des autres catégories. Tous les « mots » (en réalité tous les tokens) du texte doivent être étiquetés par le modèle de NER.
  • [PERS] : Pour « personne ». Il s’agit de l’étiquette de la catégorie individu.
  • [LIEU] : Étiquette de la catégorie lieu.

Méthodes de NER

En général, on fait du NER en utilisant l’une des deux approches suivantes : Classification Multiclasse ou CRF (Conditional Random Fields).

Méthode basée sur la classification multiclasse

Cette méthode est la plus intuitive. Elle consiste tout simplement à considérer toutes les étiquettes de notre tâche de NER comme des classes dans une tâche de classification de texte. Chaque token du texte est considéré comme une entrée (sample à classifier) du modèle de classification.

Méthode basée sur le CRF

CRF (ou Champ Aléatoire Conditionnel) est une méthode statistique qui a pour particularité de prendre en compte l’interdépendance des tokens (en se basant sur la proximité entre les tokens) pour inclure du contexte.

Dans la suite de cet article, nous utiliserons la méthode basée sur la classification.

Application : NER avec BERT (CamemBERT)

BERT est un modèle pré-entraîné de représentation de texte. Pour plus de détail allez voir cet article. Nous utiliserons la bibliothèque Transformers de HuggingFace pour leur implémentation de CamemBERT qui est « une version en français de BERT ».

Objectif

Pour notre application de NER, nous essayerons d’identifier, dans un jeu de descriptions d’offres d’emplois (écrits en langage naturel, évidemment), quels sont les mots qui correspondent à des compétences. Le jeu de données est un ensemble de descriptions scrapées sur Indeed et annotées avec Doccano. Si vous voulez le jeu de données (complet ou juste la partie annotée) envoyez un mail à hello@ledatascientist.com.

Notre objectif est donc de classifier chaque mot comme étant une compétence ou une « non-compétence » . Ce qui revient à une classification binaire basique.

Important : Il s’agit là d’un modèle de NER simplifié au maximum. Dans la vraie vie, les tokens en entrée ne sont pas forcément des mots (peuvent être des groupes de mots). Aussi, l’on peut prendre en compte les Part of Speech des mots dans le modèle.

Implémentation

L’implémentation de notre modèle de NER est pratiquement la même que celle de cet article. La seule différence est qu’ici, on utilise le modèle de classification de tokens et non de séquences. Le chargement du modèle ressemble donc à ça :

# --- Bloc de pré paration des données d'entraînement ---
# ...
# Chargement du modèle de classification de Token pré-entrainé
model = CamembertForTokenClassification.from_pretrained(
        'camembert-base',
        num_labels = 2)
# ...
# --- Bloc d'entrainement ---

Le code complet de notre modèle de NER avec CamemBERT se trouve ici.

Conclusion

Cet article donne un apperçu de ce qu’est la tâche de NER. Vous connaissez maintenant les méthodes basiques de résolutions de problèmes de type NER. Je vous ai donné un exemple de code d’entraînement d’un modèle de NER simplifié qui se trouve sur Google Colab. N’hésitez pas à laisser des commentaires, à bientôt.

3 réflexions sur “NER (Reconnaissance d’Entité Nommées) avec CamemBERT”

  1. Bonjour Olivier,
    Déjà un grand merci pour ce tutoriel, très compréhensible.

    J’ai bien suivie le tutoriel, mais je fais face à un problème lors de l’entraiment. J’ai des données persos que j’ai moi annoté.
    En fait j’ai l’erreur ci-dessous :
    RuntimeError: The size of tensor a (1408) must match the size of tensor b (32) at non-singleton dimension 0
    Cette erreur survient sur la ligne de calcul de la loss :
    loss, logits = model(input_id,
    token_type_ids=None,
    attention_mask=attention_mask,
    labels=label)

    Je comprends pas trop cette erreur, pourrais-tu me donner un coup de main là dessus. Merci d’avance pour ton retour

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.