Comment créer un modèle NER personnalisé avec des incorporations de mots basées sur le contexte dans des langues vernaculaires

Aujourd'hui, nous disposons d'un volume énorme de données non structurées provenant de différentes sources telles que les médias sociaux, les articles de presse, les données de conversation, etc. Ces données regorgent d'informations riches, même s'il est difficile de les récupérer. de la PNL (traitement du langage naturel).

C'est ici qu'intervient la reconnaissance d'entité nommée. Dans cet article, nous allons nous familiariser avec NER (Reconnaissance des entités nommées). Nous allons implémenter le NER personnalisé à l'aide du cadre Allennlp, sur un jeu de données hindi dans lequel les énoncés «Météo» sont marqués avec des entités.

Se familiariser avec la reconnaissance d'entité nommée (NER)

NER est une tâche de balisage de séquence, dans laquelle nous essayons d'extraire le sens contextuel des mots en utilisant des mots intégrés. Nous utilisons le modèle NER pour extraire les informations, afin de classer les entités nommées du texte non structuré dans des catégories prédéfinies. Les entités nommées sont des objets du monde réel tels que le nom d’une personne, son emplacement, son point de repère, etc.

Les NER jouent un rôle clé dans l’extraction d’informations à partir de documents (courriels, par exemple), de données de conversation, etc. En fait, les deux composants principaux de la NLU d’un robot conversationnel sont la classification par intention et l’extraction d’entités. Le NER dans les agents conversationnels est utilisé pour la reconnaissance d'entités et l'extraction d'informations afin de récupérer des informations telles que la date, l'emplacement, le courrier électronique, le numéro de téléphone, etc.

Garder le contexte à l'esprit fait partie intégrante de diverses tâches de la PNL. Dans le NER, il est très important d’avoir une connaissance du contexte, ce qui n’est pas possible avec les mots traditionnels (GLOVE, Fasttext, Word2Vec, etc.). Ici, ces incorporations n'attribuent qu'une seule représentation par mot, alors qu'en réalité, des mots différents ont une signification différente selon l'endroit où ils sont utilisés et le contexte dans lequel ils sont utilisés. Maintenant, nous allons voir comment l'intégration de mots contextualisés avec un modèle ELMO donne des informations contextuelles efficaces.

ELMo (Embeddings from Language Models)

Architecture ELMO

ELMO comprend à la fois le sens des mots et le contexte dans lequel ils se trouvent, par opposition aux encombrements GLOVE, qui ne font que capturer le sens des mots et ignorent le contexte.

ELMO attribue des mots clés aux mots incorporés en fonction du contexte dans lequel ils sont utilisés - à la fois pour saisir le sens du mot dans ce contexte et pour extraire d'autres informations contextuelles.

Au lieu d'utiliser une incorporation fixe pour chaque mot, comme dans GLOVE, ELMo examine l'intégralité de la phrase avant d'attribuer une incorporation à chaque mot. Il utilise un LSTM bidirectionnel formé à des tâches spécifiques pour créer ces mots incorporés.

ELMO a constitué un pas important vers la formation préalable dans le contexte du traitement automatique du langage naturel. Elmo LSTM peut être formé sur un ensemble de données volumineux dans n’importe quel langage pour créer des modèles de langage personnalisés, puis être réutilisé en tant que composant dans d’autres modèles ayant pour tâche NLU (Natural Language Understanding).

ELMO a appris à prédire le mot suivant dans une séquence de mots, une tâche appelée Modélisation du langage, essentielle pour la compréhension du langage naturel (NLU). Ceci est pratique pour créer des modèles de langage car nous disposons d'une grande quantité de données textuelles sur lesquelles un tel modèle peut tirer des enseignements, sans avoir besoin d'étiquettes.

Des mots imbriqués contextualisés peuvent donner aux mots différents imbrications basés sur le sens qu'ils ont dans le contexte de la phrase. (source: The Illustrated BERT, ELMo, and Co. (Comment NLP Cracked Transfer Learning) de Jay Alammar)

Le document ELMo présente des intégrations de mots contextualisées profondes qui modélisent à la fois les caractéristiques complexes de l'utilisation des mots, telles que la syntaxe et la sémantique, et leur variation dans les contextes linguistiques. Le document montre comment leurs intégrations en langage contextuel pré-formées peuvent être ajoutées aux modèles existants pour améliorer de manière significative l'état de la technique face aux problèmes difficiles de la PNL. Pour une compréhension plus approfondie de la même chose, lisez le document

Formation d'un modèle de NER dans AllenNLP

Les gens d’AllenNLP ont présenté le concept d’emboîtement de mots contextualisé ELMO dans leur document Représentations profondes de mots contextualisés. Nous allons maintenant utiliser le framework AllenNLP pour notre tâche NER.

Installation

  1. Créer un environnement conda avec python
conda create -n allennlp python = 3.6

2. Activer l'environnement.

source activer allennlp

3. Nous allons installer depuis la source.

clone de git https://github.com/allenai/allennlp.git
cd allennlp
pip install -r Requirements.txt

Pour former un modèle dans Allenlp Framework, nous devons implémenter un DatasetReader pour la lecture de données et un modèle de notre choix, qui dans ce cas est un modèle CRFTagger.

  1. Lecture des données avec DatasetReader

Les données dont nous disposons sont marquées BILOU et sont au format CoNLL. Une donnée formatée CoNLL a un mot par ligne avec ses entités séparées par un espace et la phrase suivante est séparée par une ligne. Dans le schéma de marquage BILOU B (début), I (intérieur), L (dernier), O (extérieur), U (unité).

O
कल date B
दोपहर L-date
में O
धूप U-weather_type
O
जयपुर U-location
में O
मौसम O
O
स्थिति O
O
O

DatasetReader lit un fichier et le convertit en une collection d'instances. Ici, nous allons utiliser le lecteur de jeu de données conll2003 en le peaufinant un peu selon nos exigences, car nous ne disposons que de données marquées NER et ce lecteur accepte un jeu de données conll2003 qui contient aussi des balises chun, NER et chunk.

“Un DatasetReader lit des données à partir d'un emplacement et construit un jeu de données. Tous les paramètres nécessaires pour lire les données en dehors du chemin de fichier doivent être transmis au constructeur de DatasetReader. ”- Documentation AllenNLP.

Nous avons un jeu de données météo, avec trois entités: location, weather_type et date. Nous devons implémenter deux méthodes, les deux méthodes suivantes pour lire et créer des instances avec jetons.

lis()

La méthode read () obtient des données. Avec AllenNLP, vous pouvez définir le chemin des fichiers de données (le chemin d’un fichier JSON, par exemple). Nous lirons chaque texte et chaque étiquette de l'ensemble de données et nous l'envelopperons avec text_to_instance (), comme indiqué ci-dessous.

text_to_instance ()

Cette méthode “effectue tout le traitement de token ou le traitement nécessaire pour passer d’une saisie de texte à une instance”.

2. Passons maintenant à la partie modèle

Nous allons utiliser le modèle CRFTagger fourni dans Allennlp Framework. Nous pouvons utiliser le modèle tel quel. Le CRFTagger code une séquence de texte avec un Seq2SeqEncoder, puis utilise un modèle de champ conditionnel aléatoire pour prédire une étiquette pour chaque jeton de la séquence.

Nous avons ici un modèle Bi-LSTM + CRF.

Bien que bi-lstm puisse capturer le sens conceptuel au sein des mots, nous devons encore trouver une connexion entre les balises. Comme cela peut être un problème pour NER, vous ne voudrez plus jamais (par exemple) d’avoir une balise «début de date» suivie d’une balise «à l’intérieur d’un lieu». Ici, un champ aléatoire conditionnel vient aider et trouve des dépendances entre les balises.

Le champ aléatoire conditionnel «chaîne linéaire» que nous allons implémenter a une matrice de coûts de transition num_tags x num_tags, où les transitions [i, j] représentent la probabilité de passer de la jième balise à la i-ème balise.

En plus des balises que nous essayons de prédire, nous aurons des balises spéciales "début" et "fin" que nous ajouterons avant et après chaque phrase, afin de capturer la "transition" entre les phrases.

En outre, CRF acceptera un ensemble facultatif de contraintes interdisant les transitions "non valides" (où "non valide" dépend de ce que vous essayez de modéliser.) Par exemple, nos données NER ont des balises distinctes représentant le début, le milieu et la fin. fin de chaque type d'entité. Nous ne souhaitons pas permettre à une balise «début d'une entité de date» d'être suivie d'une «balise d'entité de fin d'emplacement», comme expliqué ci-dessous.

Si nous examinons nos données, dans la première phrase combinant (B-date)
दोपहर (L-date), nous pouvons obtenir la date comme. Cependant, pour des raisons de pertinence contextuelle, कल (date-B) ne peut pas être combiné avec (type-U-weather), car il est nécessaire que कल (date-B) soit suivi de (date-L). Ceci est réalisé avec l'aide de CRF.

O
कल date B
दोपहर L-date
में O
धूप U-weather_type
O
जयपुर U-location
में O
मौसम O
O
स्थिति O
O
O

Pour une meilleure compréhension du modèle, vous pouvez vérifier:

Création d'un fichier de configuration

Nous avons besoin d'un fichier de configuration pour spécifier tout ce qui est nécessaire à la formation du modèle. Nous devons spécifier le chemin du train, Val, l'intégration FastText, les poids ELMo et les fichiers d'options. Reste que tous les champs sont auto-justifiés.

Enfin, nous pouvons commencer à nous entraîner

Nous sommes maintenant prêts à former le modèle NER. Pour cela, nous avons besoin de quelques fichiers.

  1. Données de formation et de validation.
  2. Fichier de poids et options Hindi ELMo. Nous pouvons utiliser un modèle ELMo formé sur les données du wiki hindi. Nous vous fournissons des cartes ELMo en hindi, formées sur Wikidump.
  3. FastText Embeddings en hindi.

Vous pouvez trouver tous les fichiers ici.

Pendant l'entraînement, nous suivons la précision après chaque époque et les meilleurs poids sont sauvegardés. Nous pouvons commencer l'entraînement en appelant la méthode «train», en la passant au fichier de configuration du modèle et au chemin de sortie du modèle.

$ allennlp train chemin / vers / config / fichier -s chemin / vers / sortie / dossier
Métriques après la fin de la formation

Ici, vous pouvez voir que nous obtenons différents indicateurs après l’entraînement. Vous pouvez donc également jouer avec le jeu de données pour obtenir de bons résultats sur les données de validation fournies ici. Bonne formation !!!!!

Prédiction

Une fois la formation terminée, vous pouvez faire des prédictions en appelant la méthode «predire», en la transmettant au chemin de modèle enregistré et à un fichier de test, comme indiqué ci-dessous.

allennlp prédire \
    chemin / vers / model.tar.gz \
    chemin / vers / test.txt \

Lorsque vous exécutez ceci, vous obtenez différents logits, balises. Tous les mots avec leurs étiquettes prédites sont affichés.

Ressources pour une compréhension plus profonde

  1. Bi-LSTM + CRF avec incorporations de caractères pour NER et POS
  2. Les illustrés BERT, ELMo et co. (Comment NLP Cracked Transfer Learning)
  3. Bi-LSTM + CRF avec pytorch
  4. Documentation Allennlp

Conclusion

J'espère que vous avez pu comprendre de manière détaillée comment mettre en œuvre un NER avec des incorporations contextualisées (ELMo) à l'aide d'AllenNLP, et vous familiariser avec les mêmes.

Si cet article vous a plu, aidez-nous à passer le mot auprès des futurs développeurs de PNL. Suivez-nous, partagez et applaudissez-nous.