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.
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 ...
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.
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.