[PYTHON] [Pour les débutants] Analyse du langage à l'aide de l'outil de traitement du langage naturel "GiNZA" (de l'analyse morphologique à la vectorisation)

introduction

Récemment, j'ai commencé à utiliser l'outil de traitement de langage de Python "GiNZA". J'avais l'habitude d'utiliser MeCab, mais j'ai récemment appris (de manière embarrassante) que Python avait une bibliothèque qui intègre une technologie d'apprentissage automatique de pointe, donc je migre actuellement vers GiNZA. Puisqu'il s'agit du premier GiNZA, j'ai essayé de résumer le flux de traitement sous forme de mémorandum en faisant référence à différents sites. L'auteur est un débutant dans l'analyse du langage naturel et il y a de nombreuses parties qui ne sont pas atteintes, donc si vous voulez en savoir plus en profondeur, veuillez vous référer aux documents officiels. Cet article est écrit dans l'espoir que les mêmes débutants que l'auteur penseront, "GiNZA peut le faire! Utilisons-le moi-même!"

À propos de GiNZA

Comme de nombreuses personnes l'ont déjà publié, GiNZA est une bibliothèque de traitement du langage naturel qui utilise un modèle d'apprentissage des résultats de la recherche conjointe entre Megagon Labs, un institut de recherche en IA pour le recrutement, et l'Institut national de la langue japonaise.

Présentation de "GiNZA" "GiNZA" est une bibliothèque open source de traitement du langage naturel japonais avec des fonctionnalités telles que l'introduction en une étape, le traitement d'analyse à haute vitesse et haute précision, et la prise en charge de l'internationalisation pour le niveau d'analyse des structures dépendant des mots. "GiNZA" utilise la bibliothèque de traitement du langage naturel "spaCy" (* 5) qui intègre la dernière technologie d'apprentissage automatique en tant que cadre, et possède également un analyseur morphologique open source "SudachiPy" (* 6) à l'intérieur. Il est incorporé et utilisé pour le traitement de la tokenisation. Le «modèle UD japonais GiNZA» incorpore les résultats d'une recherche conjointe entre Megagon Labs et l'Institut national de la langue japonaise.

Cité de https://www.recruit.co.jp/newsroom/2019/0402_18331.html

Il semble que la bibliothèque de traitement de langage "spaCy" soit utilisée dans GiNZA. Comme décrit dans ici, GiNZA prend désormais en charge spaCy en japonais. Je l'interprète à peu près comme une bibliothèque. De plus, "Sudachi Py" est utilisé pour l'analyse morphologique. De nombreuses personnes lisant cet article voudront analyser le japonais, c'est donc une bibliothèque attrayante pour les utilisateurs de Python!

Environnement de développement

(Depuis le 01/04/2020, la dernière version de GiNZA est la 2.2.1.)

GiNZA peut être installé avec une seule commande pip.

$ pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"
$ pip install ginza

Vous pouvez l'installer avec! (Depuis le 21 janvier 2020, la dernière version de GiNZA est la 3.1.1.) Veuillez consulter le Site officiel pour plus de détails.

Analyse morphologique

Tout d'abord, effectuez une analyse morphologique de base.

Analyse des dépendances


import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('Le zodiaque de cette année est Yoko. J'ai hâte aux Jeux olympiques de Tokyo.')

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

Résultat de sortie

0 cette année cette année nomenclature NOM-Nomenclature commune-Avocat possible nmod 2
1 auxiliaire ADP-Case assistant case 0
2 Zodiac Zodiac Noun Nom-Nomenclature commune-Général nsubj 4
3 est l'auxiliaire ADP-Cas participant 2
4 庚子 庚子 NOUN substantif-Nomenclature commune-Général ROOT 4
5 est le verbe auxiliaire AUX aux 4
6. .. Symbole auxiliaire PUNCT-Ponctuation ponctuelle 4
7 Tokyo Tokyo PROPN Nominal-Nom propre-Nom du lieu-Composé général 9
8 Nomenclature des noms olympiques-Nomenclature commune-Composé général 9
9 Fun Fun NOUN Noun-Nomenclature commune-Général ROOT 9
10 AUX Verbe auxiliaire flic 9
11 Nana PART Auxiliaire-Aide finale aux 9
12. .. Symbole auxiliaire PUNCT-Ponctuation ponctuelle 9

Il est bien divisé en éléments morphologiques. De la gauche se trouvent "mots d'entrée", "mots-clés (forme de base)", "parties" et "détails des parties" (voir API spaCy pour des détails sur les jetons). .. GiNZA prend également en charge l'analyse de la structure de dépendance, et la relation entre le numéro de mot dépendant et ce mot est estimée (voir ici pour plus de détails sur token.dep_. Voir / annotation # dependency-parsing)).

GiNZA vous permet également de visualiser les dépendances dans un graphique. Utilisez déplacy pour la visualisation.

Visualisation des dépendances


from spacy import displacy

displacy.serve(doc, style='dep', options={'compact':True})

Après l'exécution, Serving on http://0.0.0.0:5000 ... sera affiché, donc quand vous y accédez, le chiffre sera affiché.

displacy_tri.png

Je n'ai utilisé que MeCab, donc c'est super de voir la structure sur une seule ligne. Voir spaCy Visualizers pour plus d'informations sur les techniques de visualisation.

Vectorisation de texte

Il existe plusieurs méthodes suggérées pour estimer les vecteurs de mots, mais GiNZA a déjà appris des vecteurs de mots qui peuvent être référencés avec l'attribut de vecteur de jeton.

Vecteur de mot


doc = nlp('Si tu abandonnes, le match se termine là')
token = doc[4]

print(token)
print(token.vector)
print(token.vector.shape)

Résultat d'exécution

rencontre
[-1.7299166   1.3438352   0.51212436  0.8338855   0.42193085 -1.4436126
  4.331309   -0.59857213  2.091658    3.1512427  -2.0446565  -0.41324708
 ...
  1.1213776   1.1430703  -1.231743   -2.3723211 ]
(100,)

Le nombre de dimensions du mot vecteur est de 100. Vous pouvez également mesurer la similitude cosinus entre les vecteurs de mots en utilisant la méthode similarity ().

similarity


word1 = nlp('Omusubi')
word2 = nlp('balle de riz')
word3 = nlp('curry')

print(word1.similarity(word2))
#0.8016603151410209
print(word1.similarity(word3))
#0.5304326270109458

La similitude cosinus varie de 0 à 1 et plus elle est proche de 1, plus les mots sont similaires. En fait, les boulettes de riz sont plus proches des boulettes de riz que du curry. De plus, la vectorisation et la similarité cosinus peuvent être calculées en utilisant la même procédure pour les documents au lieu des mots. Le vecteur de document semble renvoyer la moyenne des vecteurs de mots qui composent la phrase.

Enfin, puisque nous avons pu exprimer des mots et des documents sous forme de vecteurs, illustrons-les dans l'espace vectoriel. Étant donné que la dimension du vecteur est de 100 dimensions, cette fois, nous la tracerons après l'avoir passée à 2 dimensions en utilisant l'analyse en composantes principales.

plot


import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

#text2vector
vec1 = nlp('bonne année').vector
vec2 = nlp('J'ai acheté du chou hier').vector
vec3 = nlp('Allons voir le film').vector
vec4 = nlp('Je veux manger du curry').vector
vec5 = nlp('Je suis allé en ville faire du shopping').vector
vec6 = nlp('Chocolat que j'ai mangé hier').vector

#pca
vectors = np.vstack((vec1, vec2, vec3, vec4, vec5, vec6))
pca = PCA(n_components=2).fit(vectors)
trans = pca.fit_transform(vectors)
pc_ratio = pca.explained_variance_ratio_

#plot
plt.figure()
plt.scatter(trans[:,0], trans[:,1])

i = 0
for txt in ['text1','text2','text3','text4','text5','text6']:
    plt.text(trans[i,0]-0.2, trans[i,1]+0.1, txt)
    i += 1

plt.hlines(0, min(trans[:,0]), max(trans[:,0]), linestyle='dashed', linewidth=1)
plt.vlines(0, min(trans[:,1]), max(trans[:,1]), linestyle='dashed', linewidth=1)
plt.xlabel('PC1 ('+str(round(pc_ratio[0]*100,2))+'%)')
plt.ylabel('PC2 ('+str(round(pc_ratio[1]*100,2))+'%)')
plt.tight_layout()
plt.show()

Résultat d'exécution

PCA.png

La quantité d'informations a diminué, mais je pense que cela est plus facile à reconnaître lorsqu'il s'agit d'une grande quantité de données. En regardant cette figure, il semble que text3 et 5 sont proches l'un de l'autre, et text4 et 6 sont proches l'un de l'autre. Je ressens cela avec ma peau.

finalement

Bien que je sois un débutant dans le traitement du langage naturel, j'ai pu facilement tout analyser, de l'analyse morphologique à la vectorisation en utilisant GiNZA. Recommandé pour ceux qui souhaitent commencer le traitement de la langue à partir de maintenant. Je vous serais reconnaissant si vous pouviez signaler des erreurs ou des expressions étranges.

Site de référence

Recommended Posts

[Pour les débutants] Analyse du langage à l'aide de l'outil de traitement du langage naturel "GiNZA" (de l'analyse morphologique à la vectorisation)
Traitement du langage naturel 1 Analyse morphologique
La première intelligence artificielle. Je voulais essayer le traitement du langage naturel, donc je vais essayer l'analyse morphologique en utilisant MeCab avec python3.
Analyse des émotions avec traitement du langage naturel! J'ai essayé de prédire l'évaluation à partir du texte de l'avis
De la préparation à l'analyse morphologique avec python en utilisant polyglotte au marquage des mots partiels
Laissez l'API COTOHA faire les choses difficiles - Introduction à "apprendre en utilisant" le traitement du langage naturel -
J'ai essayé d'extraire des expressions uniques avec la bibliothèque de traitement du langage naturel GiNZA
100 traitements du langage naturel frappent Chapitre 4 Analyse morphologique (première moitié)
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
■ [Google Colaboratory] Prétraitement du traitement du langage naturel et janome
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 2 Étape 03 Mémo "Analyse morphologique et écriture écrite"
Traitement du langage naturel japonais utilisant Python3 (4) Analyse des émotions par régression logistique
100 coups de traitement du langage 2020: Chapitre 4 (analyse morphologique)
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Articles en vrac pour ceux qui veulent commencer le traitement du langage naturel
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Se préparer à démarrer le traitement du langage naturel
[Traitement du langage 100 coups 2020] Chapitre 4: Analyse morphologique
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
De l'introduction de l'API GoogleCloudPlatform Natural Language à son utilisation
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 9 Utilisation à partir du langage C
Traitement du langage 100 coups Chapitre 4: Analyse morphologique 31. Verbes
Pour ceux qui souhaitent effectuer un traitement du langage naturel en utilisant les connaissances de WikiPedia qui vont au-delà de la simple correspondance de mots-clés
3. Traitement du langage naturel par Python 3-1. Important outil d'extraction de mots Analyse TF-IDF [définition originale]
Le moyen le plus rapide pour les débutants de maîtriser Python
Comment utiliser les outils d'analyse de données pour les débutants
100 traitements du langage frappent l'analyse morphologique apprise au chapitre 4
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
Installation d'outils d'analyse morphologique (MeCab, Human ++, Janome, GiNZA)
[Pour les débutants] Comment afficher des cartes et des champs de recherche à l'aide de l'API Javascript GoogleMap
J'ai essayé de vérifier si l'API Natural Language (analyse des émotions) prend en charge l'argot net.
Mettre en place un environnement de développement pour le traitement du langage naturel
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Modèle utilisant un réseau neuronal convolutif dans le traitement du langage naturel
Créer un environnement pour le traitement du langage naturel avec Python
Deep Learning 2 from scratch 1.3 Traitement du langage naturel 1.3 Résumé
Comparez comment écrire le traitement des listes par langue
Le traitement du langage naturel à 100 coups
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
100 points de traitement du langage naturel Chapitre 5 Analyse des dépendances (premier semestre)
[Traitement du langage naturel] J'ai essayé de visualiser les sujets d'actualité cette semaine dans la communauté Slack
Envoyer un message du serveur à l'extension Chrome à l'aide de Google Cloud Messaging pour Chrome
[Traitement du langage naturel] J'ai essayé de visualiser les remarques de chaque membre de la communauté Slack
Extraction d'articles d'ACL2020, une conférence internationale sur le traitement du langage naturel, en utilisant l'API arXiv de Python
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 8 Mesure du temps de traitement et profileur