Effectuer une analyse d'entité à l'aide de spaCy / GiNZA en Python

Quoi?

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.

Essayez d'abord d'utiliser GiNZA

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

Exemple de code

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.

Créer un dictionnaire personnalisé

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.

Recommended Posts

Effectuer une analyse d'entité à l'aide de spaCy / GiNZA en Python
[Construction de l'environnement] Analyse des dépendances à l'aide de CaboCha avec Python 2.7
Analyse d'association en Python
Analyse de régression avec Python
Analyse des contraintes symétriques axiales avec Python
Analyse de régression simple avec Python
Analyse de données à l'aide de pandas python
Traduit à l'aide de googletrans en Python
Utilisation du mode Python dans le traitement
Analyse morphologique avec Igo + mecab-ipadic-neologd en Python (avec bonus Ruby)
Analyse des ondes cérébrales avec Python: tutoriel Python MNE
Précautions lors de l'utilisation de Pit avec Python
Opération de collecte de type Scala en Python
Essayez d'utiliser LevelDB avec Python (plyvel)
Utilisation de variables globales dans les fonctions python
Voyons voir l'utilisation de l'entrée en python
Puissance totale en Python (en utilisant functools)
Analyse du squelette planaire dans Python (2) Hotfix
Reconnaissance de caractères manuscrits à l'aide de KNN en Python
Essayez d'utiliser LeapMotion avec Python
Recherche de priorité de profondeur à l'aide de la pile en Python
Lors de l'utilisation d'expressions régulières en Python
Création d'interface graphique en python avec tkinter 2
Fonctionnement de la souris à l'aide de l'API Windows en Python
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Essayez d'utiliser l'API Wunderlist en Python
Création d'interface graphique en python à l'aide de tkinter partie 1
Obtenir l'équilibre Suica en Python (en utilisant libpafe)
Pratique d'utilisation de ceci en Python (mauvais)
Hachez lentement les mots de passe en utilisant bcrypt en Python
Essayez d'utiliser l'API Kraken avec Python
Utilisation de venv dans un environnement Windows + Docker [Python]
[FX] Hit oanda-API avec Python en utilisant Docker
Tweet à l'aide de l'API Twitter en Python
[Python] [Windows] Communication série en Python à l'aide de DLL
J'ai essayé d'utiliser l'optimisation bayésienne de Python
Tutoriel de recommandation utilisant l'analyse d'association (implémentation python)
Connectez-vous à Slack à l'aide de requêtes en Python
Obtenez des données Youtube en Python à l'aide de l'API Youtube Data
Utilisation des constantes physiques dans Python scipy.constants ~ constant e ~
Scraping de sites Web à l'aide de JavaScript en Python
Développement de slack bot avec python en utilisant chat.postMessage
Python: analyse négative / positive: analyse négative / positive de Twitter à l'aide de RNN-Partie 1
Ecrire un module python dans fortran en utilisant f2py
Dessinez une structure arborescente en Python 3 à l'aide de graphviz
Remarques sur l'utilisation de python (pydev) avec eclipse
Classification des maladies par Random Forest en utilisant Python
Téléchargez des fichiers dans n'importe quel format en utilisant Python
Exécution de tâches parallèles à l'aide de concurrent.futures en Python
Analyse résiduelle en Python (Supplément: règles Cochrane)
Effectuer la "diagonalisation de la matrice symétrique A à l'aide de la matrice orthogonale U" en Python (décomposition en valeurs propres)
Remplacez la représentation unique du fichier texte lu par une étiquette (en utilisant GiNZA)
Analyse de la variation temporelle des trous noirs en utilisant Python
Pièces jointes par e-mail à l'aide de votre compte gmail avec python.
Création d'un processus de numérotation à l'aide de python dans le processus de numérotation locale DynamoDB
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Obtenir l'URL de l'image à l'aide de l'API Flickr en Python
Remarques sur l'utilisation de dict avec python [Competition Pro]