Führen Sie eine Entitätsanalyse mit spaCy / GiNZA in Python durch

Was?

Versuchen wir es mit spaCy / GiNZA, das für die Verarbeitung natürlicher Sprache sehr praktisch ist, oder mit der "Entitätsanalyse", die das wahre Vergnügen der Textanalyse darstellt. Dies ist die GiNZA-Seite. https://megagonlabs.github.io/ginza/

Die Entitätsanalyse ist eine Technologie zum Auffinden eines Katalogs (einer Entität) wie "Preste = Spielmaschine" und "FINAL FANTASY VII REMAKE = Spielname", wenn Sie "** FINAL FANTASY VII REMAKE with Preste" sagen.

Es ist sehr schwierig, ein Wörterbuch mit Spielnamen zu erstellen. Die Anzahl der Spiele wird unendlich zunehmen. Wir werden die Entität finden, während wir sie aus dem Kontext vorher und nachher erraten.

Versuchen Sie zuerst, GiNZA zu verwenden

Verwenden wir zunächst GiNZA. GiNZA ist einfach eine Bibliothek für japanische Analysen, die gelernt wurde und alle notwendigen Elemente enthält.

Wie auch immer, es ist einfach genug zu bedienen.

Installieren Sie es zuerst mit pip.

pip install -U ginza

Eigentlich habe ich lange gebraucht, um über verschiedene Orte zu stolpern, bis die Pip-Installation erfolgreich war, aber ... wenn es fertig ist, kann es tatsächlich in einem Schuss passieren. Wenn Sie nicht bestehen, auch in den Kommentaren ...

Beispielcode

Erstens ist der erste einfache Code.

import spacy

nlp = spacy.load('ja_ginza')  

doc = nlp(""Final Fantasy VII Remake" ist eine von Square Enix veröffentlichte Spielesoftware. Es wurde auf PlayStation 4 vorab verkauft und ist bis April 2021 ein exklusiver Titel. Die Veröffentlichung sollte ursprünglich am 3. März 2020 weltweit erfolgen und wurde am 10. April 2020 verschoben.")

print("*** token ***")
for token in doc:
    print(token.i, token.orth_, token.lemma_, token.pos_, token.tag_, token.dep_, token.head.i)

print("*** entity ***")
for ent in doc.ents:
    print(ent.text, ent.label_) 

Das Ergebnis sieht so aus. Die detaillierte Bedeutung wird hier weggelassen, aber Sie können sehen, dass jedes Wort während der "morphologischen Analyse" analysiert wird.

*** token ***
0 "" PUNCT-Hilfssymbol-Klammerpunkt 4 öffnen
1 Final Final NOUN Nomen-Gemeinsame Nomenklatur-Allgemeine Verbindung 4
2 Fantasy Fantasy NOUN Nomen-Gemeinsame Nomenklatur-Allgemeine Verbindung 4
3 VII vii NOUN-Nomenklatur-Gemeinsame Nomenklatur-Allgemeine Verbindung 4
4 Remake Remake NOUN Nomen-Gemeinsame Nomenklatur-Veränderbare WURZEL 4
5 』” PUNCT-Hilfssymbol-Klammern geschlossen Punkt 4
6 ist das ADP-Hilfsmittel-Teilnehmerfall 4
7, ,, PUNCT-Hilfssymbol-Lesepunkt Punkt 4
8 Square Enix Square Enix PROPN Nomen-Proprietäre Nomenklatur-Allgemeine Verbindung 10
:(Kürzung)

*** entity ***
Final Fantasy VII Remake-Buch
Square Enix Person
PlayStation 4 Product_Other
Datum April 2021
3. März 2020 Datum
10. April desselben Jahres Datum

Es fühlt sich ziemlich gut an.

Die sogenannte morphologische Analyse wird ordentlich als Token durchgeführt, und Square Enix wird auch als eine richtige Nomenklatur anerkannt.

Die Entität, die ich dieses Mal machen wollte, wird auch als "Final Fantasy VII Remake" anerkannt. Das Wort Buch ist ein wenig seltsam, aber es handelt sich um allgemeine Wörterbuchdaten, daher kann nicht geholfen werden, und selbst eine etwas knifflige Art, ein Datum wie "10. April desselben Jahres" zu schreiben, erkennt es als Datum. Wenn Sie gebräuchliche Wörter abrufen möchten, sollte dies ausreichen.

Erstellen Sie ein benutzerdefiniertes Wörterbuch

Es gibt jedoch Zeiten, in denen ich "** Final Fantasy VII Remake " in " Game_Title **" ändern möchte.

Bei der Verarbeitung natürlicher Sprache in der eigentlichen Arbeit gibt es meiner Meinung nach für jede unserer Geschäftsbereiche Fachbegriffe. Zum Beispiel möchte ich den Titel als Titel behandeln. Ich würde gerne etwas dagegen tun.

Jetzt, wo ich für mich selbst lernen möchte, werde ich mit dem einfachen ja von spaCy anstelle von GiNZA ja_ginza lernen. Der Code ist fast der gleiche wie der Spacy-Beispielcode, sieht aber so aus.

from __future__ import unicode_literals, print_function

import plac
import random
from pathlib import Path
import spacy
from spacy.util import minibatch, compounding

# new entity label
LABEL = "Game_Title"

TRAIN_DATA = [
    (
        ""Final Fantasy VII Remake" ist eine von Square Enix veröffentlichte Spielesoftware.",
        {"entities": [(1, 20, LABEL)]}
    ),
    (
        "Dies ist die offizielle Website der Remake-Arbeit von "Final Fantasy VII Remake".",
        {"entities": [(1, 20, LABEL)]}
    ),
    (
        "Final Fantasy VII Remake-PS4 ist im Game Store immer ein Schnäppchen.",
        {"entities": [(0, 19, LABEL)]}
    )
]

random.seed(0)
nlp = spacy.blank("ja")
ner = nlp.create_pipe("ner")
nlp.add_pipe(ner)
ner.add_label(LABEL)
optimizer = nlp.begin_training()
pipe_exceptions = ["ner", "trf_wordpiecer", "trf_tok2vec"]
other_pipes = [pipe for pipe in nlp.pipe_names if pipe not in pipe_exceptions]
with nlp.disable_pipes(*other_pipes):
    for itn in range(30):
        random.shuffle(TRAIN_DATA)
        losses = {}
        batches = minibatch(TRAIN_DATA, size=compounding(1.0, 4.0, 1.001))
        for batch in batches:
            texts, annotations = zip(*batch)
            nlp.update(texts, annotations, sgd=optimizer, drop=0.35, losses=losses)
        print("Losses", losses)

print()

test_text = "Nach "Final Fantasy VII Remake", "Final Fantasy II"!"
doc = nlp(test_text)
print("Entities in '%s'" % test_text)
for ent in doc.ents:
    print(ent.text, ent.label_) 

output_dir = Path(r"Geeigneter Ordnername")
nlp.meta["name"] = "GameTitleModel"
nlp.to_disk(output_dir)
print("Saved model to", output_dir)

Das Ergebnis sieht so aus. Vorerst wurde es als "Final Fantasy VII Remake Game_Title" anerkannt.

Losses {'ner': 36.54436391592026}
Losses {'ner': 28.74292328953743}
Losses {'ner': 16.96098183095455}
   :
Entities in 'Nach "Final Fantasy VII Remake", "Final Fantasy II"!'
Final Fantasy VII Remake-Spiel_Title
Final Fantasy II Spiel_Title

Ich konnte es vorerst tun. "Final Fantasy II", das ich nicht gelernt habe, ist auch ein Game_Title.

Es tut mir leid, es ist etwas rau, daher werde ich es von Zeit zu Zeit aktualisieren, nachdem es veröffentlicht wurde.

Recommended Posts

Führen Sie eine Entitätsanalyse mit spaCy / GiNZA in Python durch
[Umgebungskonstruktion] Abhängigkeitsanalyse mit CaboCha mit Python 2.7
Assoziationsanalyse in Python
Regressionsanalyse mit Python
Axialsymmetrische Spannungsanalyse mit Python
Einfache Regressionsanalyse mit Python
Datenanalyse mit Python-Pandas
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Morphologische Analyse mit Igo + mecab-ipadic-neologd in Python (mit Ruby-Bonus)
Gehirnwellenanalyse mit Python: Python MNE-Tutorial
Vorsichtsmaßnahmen bei der Verwendung von Pit mit Python
Scala-ähnliche Erfassungsoperation in Python
Versuchen Sie es mit LevelDB mit Python (plyvel)
Verwendung globaler Variablen in Python-Funktionen
Mal sehen, wie man Eingaben in Python verwendet
Gesamtleistung in Python (mit Funktools)
Planare Skelettanalyse in Python (2) Hotfix
Handschriftliche Zeichenerkennung mit KNN in Python
Versuchen Sie es mit LeapMotion mit Python
Suche nach Tiefenpriorität mit Stack in Python
Bei Verwendung regulärer Ausdrücke in Python
GUI-Erstellung in Python mit tkinter 2
Mausbedienung mit Windows-API in Python
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Versuchen Sie es mit der Wunderlist-API in Python
GUI-Erstellung in Python mit tkinter Teil 1
Holen Sie sich Suica Balance in Python (mit libpafe)
Übung, dies in Python zu verwenden (schlecht)
Hash-Passwörter langsam mit bcrypt in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Verwenden von venv in der Windows + Docker-Umgebung [Python]
[FX] Hit oanda-API mit Python mit Docker
Tweet mit der Twitter-API in Python
[Python] [Windows] Serielle Kommunikation in Python über DLL
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Empfehlungs-Tutorial mit Assoziationsanalyse (Python-Implementierung)
Melden Sie sich mit Anforderungen in Python bei Slack an
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API
Verwenden physikalischer Konstanten in Python scipy.constants ~ Konstante e ~
Scraping von Websites mit JavaScript in Python
Entwicklung eines Slack Bot mit Python mit chat.postMessage
Python: Negative / Positive Analyse: Twitter Negative / Positive Analyse mit RNN-Teil 1
Schreiben Sie mit f2py ein Python-Modul in fortran
Zeichnen Sie mit graphviz eine Baumstruktur in Python 3
Hinweise zur Verwendung von Python (Pydev) mit Eclipse
Krankheitsklassifizierung durch Random Forest mit Python
Laden Sie Dateien in jedem Format mit Python herunter
Parallele Taskausführung mit concurrent.futures in Python
Restanalyse in Python (Ergänzung: Cochrane-Regeln)
Führen Sie in Python eine "Diagonalisierung der symmetrischen Matrix A mit der orthogonalen Matrix U" durch (Eigenwertzerlegung).
Ersetzen Sie die eindeutige Darstellung der gelesenen Textdatei durch eine Beschriftung (mit GiNZA).
Zeitvariationsanalyse von Schwarzen Löchern mit Python
E-Mail-Anhänge über Ihr Google Mail-Konto mit Python.
Erstellen eines Nummerierungsprozesses mit Python im lokalen DynamoDB-Nummerierungsprozess
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Holen Sie sich die Bild-URL mithilfe der Flickr-API in Python
Hinweise zur Verwendung von dict mit Python [Competition Pro]