[PYTHON] Mit mir, NER und Flair

Dieser Artikel ist der 23. Tag von MYJLab Adventskalender.

Einführung

Hallo. Dies ist Marutaku von MYJLab m1. Dieses Mal hatte ich die Möglichkeit, eine Technik namens Eigenexpressionsextraktion zu verwenden, daher möchte ich die Bibliothek vorstellen, die ich damals verwendet habe.

Über die Eigenexpressionsextraktion (NER)

Named Entity Recognition ist eine Technologie, die die richtige Nomenklatur wie Firmennamen und Ortsnamen mit Bezeichnungen wie Firmen- und Ortsnamen erhält. Als Beispiel,

Boeing, ein großes US-amerikanisches Flugzeugunternehmen, gab am 23. seinen sofortigen Rücktritt als CEO von Muillenberg bekannt.
Es scheint, dass er die Verantwortung für das Problem des hochmodernen Flugzeugs "737MAX" übernommen hat, das aufgrund von zwei Abstürzen ausgesetzt wurde.
Calhoon wird am 13. Januar nächsten Jahres das Amt des CEO übernehmen.

https://news.yahoo.co.jp/pickup/6346205 Zu diesem Zeitpunkt können Sie sehen, dass der Name der Person "Mui Lenberg, Calhoon" und der Name der Organisation "Boeing" ist. Auf diese Weise besteht die Aufgabe des Extrahierens geeigneter Ausdrücke darin, die richtige Nomenklatur zu erhalten, die im Satz vorhanden ist.

Datensatz

Es ist in This Repository organisiert. Ich denke, dass CoNLL 2003 und Ontonotes v5 am häufigsten verwendet werden. Andere enthalten medizinische Daten und mit Wikipedhia kommentierte Daten. Der japanische Datensatz ist nicht sehr öffentlich, scheint aber zum Verkauf zu stehen.

Schwierigkeiten beim Extrahieren eindeutiger Ausdrücke

Neuere Eigenexpressionsextraktionspapiere sind sehr schwer zu implementieren. Wie Sie unter Papier mit Code sehen können, können Sie eine große Anzahl von Modellen stapeln und verwenden oder mehrere vorab trainierte Modelle verwenden. Es ist sehr ärgerlich, weil ich den Wortausdruck des Modells verwenden möchte. LSTM-CRF + ELMo + BERT + Flair oder Mounani Itternokawa Karanai. Zu dieser Zeit stieß ich auf eine Bibliothek namens Flair, die es einfach macht, ein Modell zu implementieren, das den Stand der Technik von NER erreicht.

Was ist Flair?

Flair ist eine Bibliothek für die Verarbeitung natürlicher Sprache, die die Implementierung des State-of-the-Art-Modells vereinfacht. Mit einer Vielzahl trainierter Modelle können Sie frühere SoTA-Modelle schnell in Ihr System integrieren. Wie im Tutorial erwähnt, können Sie das in Flair trainierte Eigenexpressions-Extraktionsmodell nur mit dem folgenden Code ausführen.

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)

Neben dem hier verwendeten "ner" -Modell gibt es verschiedene Modelle, wie beispielsweise das "ner-fast" -Modell, das auch auf einer CPU mit hoher Geschwindigkeit arbeitet.

Selbstgemachtes Modell mit Flair

Flair kann nicht nur trainierte Modelle ausführen, sondern auch eigene Modelle erstellen. Flair erleichtert die Handhabung eingebetteter Darstellungen bekannter und trainierter Modelle. (https://github.com/flairNLP/flair/blob/master/resources/docs/STRUCT_4_ELMO_BERT_FLAIR_EMBEDDING.md) Ein Beispiel für mein eigenes Modell ist unten dargestellt.

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')

Das obige Modell verwendet den eingebetteten Ausdruck des Modells "Handschuh" im Modell. Wenn Sie diesen Wert erhöhen, können Sie jedoch mehrere eingebettete Wortausdrücke verwenden. Ich habe es noch nicht ausprobiert, aber es scheint, dass eine Feinabstimmung eingebetteter Ausdrücke möglich ist.

Am Ende

Diesmal haben wir über NER und Flair gesprochen. Flair kann zusätzlich zu NER auf Aufgaben wie negatives / positives Urteilsvermögen und Textklassifizierung angewendet werden. Wenn Sie die Verarbeitung natürlicher Sprache verwenden möchten, es aber schwierig finden, versuchen Sie es bitte.

Verweise

Recommended Posts

Mit mir, NER und Flair
Bei mir cp und Subprocess
Mit und ohne WSGI
Ver- und Entschlüsselung mit Python
Arbeiten Sie mit tkinter und Maus
Python und Hardware-Verwenden von RS232C mit Python-
Super Auflösung mit SRGAN und ESRGAN
Group_by mit sqlalchemy und sum
Python mit Pyenv und Venv
py, shebang, venv und ich
Funktioniert mit Python und R.
Interaktive Visualisierung mit ipywidgets und Bokeh
Leuchtendes Leben mit Python und OpenCV
Python-Maus- und Tastaturbedienung mit Pyautogui
Sortieren mit einer Mischung aus Zahlen und Buchstaben
Roboter läuft mit Arduino und Python
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Scraping mit Node, Ruby und Python
Einfacher Slackbot mit Docker und Errbot
Bildsegmentierung mit Scikit-Image und Scikit-Learn
Authentifizierungsprozess mit gRPC- und Firebase-Authentifizierung
Scraping mit Python, Selen und Chromedriver
Spielen Sie mit Poancare-Serien und SymPy
Fotosegmentierung und Clustering mit DBSCAN
Kratzen mit Python und schöner Suppe
NAS-Backup mit PHP und Rsync
Für mich: Infrastruktur- und Netzwerknotizen
JSON-Codierung und -Decodierung mit Python
Pfadverarbeitung mit takewhile und dropwhile
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Vergleichen Sie DCGAN und pix2pix mit Keras
Verwenden von Sitzungen und Reflexionen mit SQL Alchemy
Lesen und Schreiben von NetCDF mit Python
Führe errBot ein und arbeite mit Slack
Speichern und Abrufen von Dateien mit Pepper
Async / warte mit Kivy und tkinter
Ich habe mit PyQt5 und Python3 gespielt
Melden Sie sich mit PycURL an und erhalten Sie eine Antwort
Experimentiert mit Unicode, Decodierung und Codierung
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Zeichnen Sie Figuren mit OpenCV und PIL
Sugoroku-Spiel und Zusatzspiel mit Python
Laden Sie Bilder mit Falcon hoch und laden Sie sie herunter
FM-Modulation und Demodulation mit Python
Erstellen einer Umgebung mit pyenv und pyenv-virtualenv