[PYTHON] Avec moi, NER et Flair

Cet article est le 23e jour du Calendrier de l'Avent MYJLab.

introduction

Bonjour. C'est marutaku de MYJLab m1. Cette fois, j'ai eu l'occasion d'utiliser une technique appelée extraction d'expressions propres, je voudrais donc vous présenter la bibliothèque que j'utilisais à l'époque.

À propos de l'extraction d'expressions propres (NER)

La reconnaissance d'entités nommées est une technologie qui acquiert une nomenclature appropriée, comme les noms de société et les noms de lieux avec des étiquettes telles que les noms de société et de lieu. Par exemple,

Boeing, une grande compagnie aérienne américaine, a annoncé le 23 qu'elle démissionnerait immédiatement de son poste de PDG de Muillenberg.
Il semble qu'il ait assumé la responsabilité du problème de l'avion dernier cri "737MAX", qui a été suspendu en raison de deux accidents.
Calhoon assumera le poste de PDG le 13 janvier de l'année prochaine.

https://news.yahoo.co.jp/pickup/6346205 À ce stade, vous pouvez voir que le nom de la personne est «Mui Lenberg, Calhoon» et que le nom de l'organisation est «Boeing». De cette manière, la tâche d'extraction d'expressions appropriées est d'acquérir la nomenclature appropriée qui existe dans la phrase.

base de données

Il est organisé dans This Repository. Je pense que CoNLL 2003 et Ontonotes v5 sont les plus couramment utilisés. D'autres incluent des données médicales et des données annotées par wikipedhia. L'ensemble de données japonais n'est pas très public, mais il semble être en vente.

Difficulté à extraire des expressions uniques

Les papiers d'extraction d'expressions propres récents sont très difficiles à mettre en œuvre. Comme vous pouvez le voir sur Paper With Code, vous pouvez empiler un grand nombre de modèles et les utiliser, ou vous pouvez utiliser plusieurs modèles pré-entraînés. C'est très ennuyeux car je veux utiliser l'expression verbale du modèle. «LSTM-CRF + ELMo + BERT + Flair» ou Mounani Itternokawa Karanai. À ce moment-là, je suis tombé sur une bibliothèque appelée Flair qui facilite la mise en œuvre d'un modèle qui atteint l'état de l'art du NER.

Qu'est-ce que Flair

Flair est une bibliothèque de traitement du langage naturel conçue pour faciliter la mise en œuvre du modèle de pointe. Avec une multitude de modèles formés, vous pouvez rapidement incorporer les anciens modèles SoTA dans votre système. Comme mentionné dans le didacticiel, lorsque vous essayez le modèle d'extraction d'expressions propres formé dans Flair, vous pouvez le faire avec le code suivant.

from flair.data import Sentence
from flair.models import SequenceTagger

# make a sentence
sentence = Sentence('I love Berlin .')

# load the NER tagger
tagger = SequenceTagger.load('ner')

# run NER over sentence
tagger.predict(sentence)

En plus du modèle «ner» utilisé ici, il existe différents modèles tels que le modèle «ner-fast» qui fonctionne à haute vitesse même sur un processeur.

Modèle personnalisé avec Flair

Flair peut non seulement exécuter des modèles entraînés, mais également créer vos propres modèles. Flair facilite la gestion des représentations intégrées de modèles connus ainsi que des modèles entraînés. (https://github.com/flairNLP/flair/blob/master/resources/docs/STRUCT_4_ELMO_BERT_FLAIR_EMBEDDING.md) Un exemple de mon propre modèle est présenté ci-dessous.

from flair.data import Corpus
from flair.datasets import WNUT_17
from flair.embeddings import TokenEmbeddings, WordEmbeddings, StackedEmbeddings
from typing import List

# 1. get the corpus
corpus: Corpus = WNUT_17().downsample(0.1)
print(corpus)

# 2. what tag do we want to predict?
tag_type = 'ner'

# 3. make the tag dictionary from the corpus
tag_dictionary = corpus.make_tag_dictionary(tag_type=tag_type)
print(tag_dictionary.idx2item)

# 4. initialize embeddings
embedding_types: List[TokenEmbeddings] = [

    WordEmbeddings('glove'),

    # comment in this line to use character embeddings
    # CharacterEmbeddings(),

    # comment in these lines to use flair embeddings
    # FlairEmbeddings('news-forward'),
    # FlairEmbeddings('news-backward'),
]

embeddings: StackedEmbeddings = StackedEmbeddings(embeddings=embedding_types)

# 5. initialize sequence tagger
from flair.models import SequenceTagger

tagger: SequenceTagger = SequenceTagger(hidden_size=256,
                                        embeddings=embeddings,
                                        tag_dictionary=tag_dictionary,
                                        tag_type=tag_type,
                                        use_crf=True)

# 6. initialize trainer
from flair.trainers import ModelTrainer

trainer: ModelTrainer = ModelTrainer(tagger, corpus)

# 7. start training
trainer.train('resources/taggers/example-ner',
              learning_rate=0.1,
              mini_batch_size=32,
              max_epochs=150)

# 8. plot weight traces (optional)
from flair.visual.training_curves import Plotter
plotter = Plotter()
plotter.plot_weights('resources/taggers/example-ner/weights.txt')

Le modèle ci-dessus utilise l'expression incorporée du modèle appelée «gant» à l'intérieur du modèle, mais en augmentant cette valeur, vous pouvez utiliser plusieurs expressions incorporées de mots. Je ne l'ai pas encore essayé, mais il semble qu'un réglage fin des expressions intégrées soit possible.

À la fin

Cette fois, nous avons parlé de NER et de Flair. Le flair peut être appliqué à des tâches telles que le jugement négatif / positif et la classification de texte en plus du NER. Si vous souhaitez utiliser le traitement du langage naturel mais que vous le trouvez difficile, essayez-le.

Les références

Recommended Posts

Avec moi, NER et Flair
Avec moi, cp et sous-processus
Avec et sans WSGI
Chiffrement et déchiffrement avec Python
Travailler avec le tkinter et la souris
Python et matériel - Utilisation de RS232C avec Python -
Super résolution avec SRGAN et ESRGAN
Group_by avec sqlalchemy et sum
python avec pyenv et venv
py, shebang, venv et moi
Fonctionne avec Python et R
Visualisation interactive avec ipywidgets et Bokeh
Briller la vie avec Python et OpenCV
Fonctionnement de la souris et du clavier Python avec pyautogui
Tri avec un mélange de chiffres et de lettres
Robot fonctionnant avec Arduino et python
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Easy Slackbot avec Docker et Errbot
Segmentation d'image avec scikit-image et scikit-learn
Processus d'authentification avec gRPC et authentification Firebase
Grattage avec Python, Selenium et Chromedriver
Jouez avec la série Poancare et SymPy
Segmentation et regroupement de photos avec DBSCAN
Grattage avec Python et belle soupe
Sauvegarde NAS avec php et rsync
Pour moi: notes sur l'infrastructure et le réseau
Encodage et décodage JSON avec python
Traitement de chemin avec take while et drop while
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
Comparez DCGAN et pix2pix avec Keras
Utilisation de sessions et de réflexions avec SQL Alchemy
Lire et écrire NetCDF avec Python
Introduisez errBot et travaillez avec Slack
Enregistrer et récupérer des fichiers avec Pepper
Async / await avec Kivy et tkinter
J'ai joué avec PyQt5 et Python3
Connectez-vous avec PycURL et recevez une réponse
Expérimenté avec unicode, décoder et encoder
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Dessinez des figures avec OpenCV et PIL
Jeu Sugoroku et jeu d'addition avec Python
Télécharger et télécharger des images avec Falcon
Modulation et démodulation FM avec Python
Créer un environnement avec pyenv et pyenv-virtualenv