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!"
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!
(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.
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é.
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.
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
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.
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.
Recommended Posts