J'essaierai d'utiliser spaCy / GiNZA, ce qui est très pratique pour "l'analyse d'entité", qui est le vrai plaisir de l'analyse de texte, plutôt que le traitement du langage naturel. C'est la page GiNZA. https://megagonlabs.github.io/ginza/
L'analyse d'entité est une technologie permettant de trouver un catalogue (entité) tel que "Preste = machine de jeu" et "FINAL FANTASY VII REMAKE = nom du jeu" lorsque vous dites "** Faites FINAL FANTASY VII REMAKE avec Preste".
Il est très difficile de faire un dictionnaire des noms de jeux. Le nombre de jeux augmentera à l'infini. Nous trouverons l'entité en la devinant à partir du contexte avant et après.
Tout d'abord, utilisons GiNZA. GiNZA est simplement une bibliothèque d'analyse japonaise qui a été apprise et qui contient tous les éléments nécessaires.
Quoi qu'il en soit, c'est assez facile à utiliser.
Tout d'abord, installez-le avec pip.
pip install -U ginza
En fait, il m'a fallu beaucoup de temps pour trébucher à divers endroits jusqu'à ce que l'installation de pip réussisse, mais ... une fois que c'est fait, cela peut passer d'un seul coup. Si vous ne passez pas, même dans les commentaires ...
Le premier est le premier code simple.
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp(""Final Fantasy VII Remake" est un logiciel de jeu édité par Square Enix. Il a été pré-vendu sur PlayStation 4 et est un titre exclusif jusqu'en avril 2021. Initialement prévue pour être publiée dans le monde entier le 3 mars 2020, la sortie a été reportée le 10 avril 2020.")
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_)
Le résultat ressemble à ceci. La signification détaillée est omise ici, mais vous pouvez voir que chaque mot est analysé en faisant une «analyse morphologique».
*** token ***
0 "" Symbole auxiliaire PUNCT-Ouvrir les parenthèses punct 4
1 Final Final NOUN Nom-Nomenclature commune-Composé général 4
2 Fantasy Fantasy NOM-Nomenclature commune-Composé général 4
3 VII vii Nomenclature NOM-Nomenclature commune-Composé général 4
4 Remake Remake NOUN Noun-Nomenclature commune-ROOT 4 modifiable
Symbole auxiliaire PUNCT 5 』”-Parenthèses fermées punct 4
6 est l'auxiliaire ADP-Cas du participant 4
7, `` symbole auxiliaire PUNCT-Point de lecture punct 4
8 Square Enix Square Enix PROPN Nom-Nom propre-Composé général 10
:(réduction)
*** entity ***
Livre de remake de Final Fantasy VII
Personne Square Enix
PlayStation 4 Product_Other
Date d'avril 2021
3 mars 2020 Date
10 avril de la même année Date
Ça fait du bien.
La soi-disant analyse morphologique est effectuée proprement comme un jeton, et Square Enix est également reconnu comme une nomenclature appropriée.
L'entité que je voulais faire cette fois-ci est également reconnue comme "Final Fantasy VII Remake". Le mot Livre est un peu étrange, mais il s'agit de données générales de dictionnaire, donc cela ne peut pas être aidé, et même une façon un peu délicate d'écrire une date telle que "10 avril de la même année" le reconnaît comme Date. Si vous souhaitez récupérer des mots courants, cela devrait suffire.
Cependant, il y a des moments où vous voulez changer "** Final Fantasy VII Remake " en " Game_Title **".
Lorsque je fais du traitement du langage naturel dans un travail réel, je pense qu'il existe des termes techniques pour chacun de nos domaines d'activité. Par exemple, je souhaite traiter le titre comme un titre. Je voudrais faire quelque chose à ce sujet.
Maintenant que je veux apprendre par moi-même, je vais étudier avec le simple ja
de spaCy au lieu de GiNZA ja_ginza
.
Le code est presque le même que l'exemple de code Spacy, mais il ressemble à ceci.
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" est un logiciel de jeu édité par Square Enix.",
{"entities": [(1, 20, LABEL)]}
),
(
"Ceci est le site officiel du travail de remake de "Final Fantasy VII Remake".",
{"entities": [(1, 20, LABEL)]}
),
(
"Remake de Final Fantasy VII-La PS4 est toujours une bonne affaire au magasin de jeux.",
{"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 = "Après "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"Nom de dossier approprié")
nlp.meta["name"] = "GameTitleModel"
nlp.to_disk(output_dir)
print("Saved model to", output_dir)
Le résultat ressemble à ceci. Pour le moment, il a été reconnu comme "Final Fantasy VII Remake Game_Title".
Losses {'ner': 36.54436391592026}
Losses {'ner': 28.74292328953743}
Losses {'ner': 16.96098183095455}
:
Entities in 'Après "Final Fantasy VII Remake", "Final Fantasy II"!'
Jeu de remake de Final Fantasy VII_Title
Jeu Final Fantasy II_Title
J'ai pu le faire pour le moment. "Final Fantasy II" que je n'ai pas appris est aussi un Game_Title.
Donc, je suis désolé, c'est un peu difficile, donc je vais le mettre à jour de temps en temps après sa sortie.