[PYTHON] [Avec modèle japonais] Modèle vectoriel de phrases recommandé pour les personnes qui traitent le langage naturel en 2020

Le point

image UMAP.png

introduction

C'est une histoire de création d'un vecteur de haute qualité (en japonais), c'est-à-dire que plus le sens d'une phrase est basé sur le contexte plutôt que sur la lettre, plus le vecteur se rapproche.

Je pense qu'il y a un certain nombre de personnes qui créent des vecteurs de phrases dans le but de rechercher des phrases qui ont des significations similaires dans leurs passe-temps et leurs pratiques.

Cependant, bien que la moyenne des vecteurs de mots ne soit pas mauvaise, je me demande s'il y a des scènes insatisfaisantes dans lesquelles je me retrouve à errer dans un labyrinthe appelé Huristics (en essayant d'utiliser un mot ou une partie spécifique comme mot stop, etc. Essayez d'ajouter un poids mystérieux. Quelle est la base?). De plus, le vecteur de mots moyen est difficile à gérer les mots polynomiaux, et du fait que le contexte n'est pas pris en considération, des recherches de phrases similaires qui se concentrent sur le mot "pas là" sont effectuées. D'un autre côté, l'apprentissage d'un modèle de vecteur de phrase à l'aide d'un réseau neuronal profond existant tel que Universal Sentence Encoder est trop coûteux à calculer et il peut être difficile de l'entraîner par vous-même.

Pour ceux qui ont de tels problèmes, vecteur de phrases japonais de haute qualité utilisant la méthode proposée dans Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks Créez un modèle et publiez-le.

Connaissances préalables

Exemple d'utilisation du modèle vectoriel de phrases japonais

Avant l'explication technique de Sentence-BERT, je vais vous expliquer comment l'utiliser. c'est simple. L'exemple fait deux choses: Vous pouvez essayer ces exemples dans Google Colaboratory.

  1. Recherchez les instructions qui ont une signification similaire à l'instruction de requête donnée.
  2. Visualisez l'espace sémantique latent de la phrase de titre avec UMAP.

installer

Installez la bibliothèque appropriée et téléchargez le modèle japonais. Aucune explication détaillée n'est nécessaire. Pour la commodité de l'essayer facilement dans Colaboratory, cette fois au lieu d'installer des transformateurs de phrases japonais, je me suis déplacé vers le répertoire avec le code source, mais en utilisation de production, comme In [2] commenté. Il est préférable d'installer avec setup.py.

In[1]


!git clone https://github.com/sonoisa/sentence-transformers
!cd sentence-transformers; pip install -r requirements.txt

In[2]


#!cd sentence-transformers; python setup.py install

In[3]


!wget -O sonobe-datasets-sentence-transformers-model.tar "https://www.floydhub.com/api/v1/resources/JLTtbaaK5dprnxoJtUbBbi?content=true&download=true&rename=sonobe-datasets-sentence-transformers-model-2"
!tar -xvf sonobe-datasets-sentence-transformers-model.tar

En décompressant le tar, un répertoire training_bert_japanese qui stocke le modèle est créé.

In[4]


%cd sentence-transformers

Chargement du modèle japonais

Si vous créez une instance SentenceTransformer avec le chemin / content / training_bert_japanese vers le répertoire dans lequel le modèle japonais est placé, le chargement du modèle est terminé.

In[5]


%tensorflow_version 2.x
from sentence_transformers import SentenceTransformer
import numpy as np

model_path = "/content/training_bert_japanese"
model = SentenceTransformer(model_path, show_progress_bar=False)

Calcul du vecteur de relevé

Calculez le vecteur d'instruction. Appelez simplement model.encode (une liste d'instructions). Dans cet exemple, j'utiliserai le titre (une version légèrement modifiée) de "Irasutoya" publié dans Another article. .. (En fait, il est préférable d'avoir une phrase plusieurs fois plus longue pour montrer l'effet, mais je n'ai pas pu la préparer tout de suite, alors je vais simplement utiliser le titre. J'ajouterai une explication lorsque je pourrai préparer une phrase plus appropriée.)

In[6]


#La source: https://qiita.com/sonoisa/items/Extrait du titre de l'image "Irasutoya" publié le 775ac4c7871ced6ed4c3 (suppression des mots "illustration", "marque" et "caractère")
sentences = ["Employé de bureau masculin s'inclinant", "Sac de rire", "Évangéliste technique (femme)", "Combattre l'IA", "Homme qui rit (5 niveaux)", 
...
"Un homme regardant l'argent et souriant", "Les gens qui disent "Merci"", "Retraite (femme)", "Évangéliste technique (homme)", "Ovation debout"]

In[7]


sentence_vectors = model.encode(sentences)

C'est le seul calcul du vecteur de déclaration.

Rechercher des phrases qui ont des significations similaires

En utilisant le vecteur de phrases calculé, essayez de rechercher des phrases avec des significations similaires (titre d'Irasuto). Recherchez un vecteur d'instruction avec une petite distance cosinus.

In[9]


import scipy.spatial

queries = ['IA fugitive', 'Intelligence artificielle en fuite', 'Merci à M. Irasutoya', 'à suivre']
query_embeddings = model.encode(queries)

closest_n = 5
for query, query_embedding in zip(queries, query_embeddings):
    distances = scipy.spatial.distance.cdist([query_embedding], sentence_vectors, metric="cosine")[0]

    results = zip(range(len(distances)), distances)
    results = sorted(results, key=lambda x: x[1])

    print("\n\n======================\n\n")
    print("Query:", query)
    print("\nTop 5 most similar sentences in corpus:")

    for idx, distance in results[0:closest_n]:
        print(sentences[idx].strip(), "(Score: %.4f)" % (distance / 2))

Voici le résultat de sortie. Runaway ≒ Combattez, cela peut être considéré comme une arme, donc je pense que c'est un résultat naturel. Si vous avez un cœur, vous pouvez certainement penser que vous pouvez perdre le contrôle.

Out[9]


======================
Query:IA fugitive

Top 5 most similar sentences in corpus:
Combattre l'IA(Score: 0.1521)
AI avec un cœur(Score: 0.1666)
IA avec armes(Score: 0.1994)
Intelligence artificielle / IA(Score: 0.2130)
AI pour la reconnaissance d'image(Score: 0.2306)

A paraphrasé l'IA en intelligence artificielle. Le résultat a changé. Il semble que ceux qui ont des notations similaires ont tendance à arriver au sommet.

Out[9]


======================
Query:Intelligence artificielle en fuite

Top 5 most similar sentences in corpus:
L'intelligence artificielle qui vole le travail(Score: 0.1210)
Une personne qui se dispute avec l'intelligence artificielle(Score: 0.1389)
Intelligence artificielle(Score: 0.1411)
Croissance de l'intelligence artificielle(Score: 0.1482)
Intelligence artificielle / IA(Score: 0.1629)

Merci = Vous savez que "Merci".

Out[9]


======================
Query:Merci à M. Irasutoya

Top 5 most similar sentences in corpus:
Les gens qui disent "Merci"(Score: 0.1381)
Bon rire oreillons(Score: 0.1693)
Bon rire (Hyottoko)(Score: 0.1715)
Bon rire (Okame)(Score: 0.1743)
Les gens qui retiennent le rire (homme)(Score: 0.1789)

Vous pouvez rechercher des phrases similaires avec un seul mot au lieu d'une phrase.

Out[9]


======================
Query:à suivre

Top 5 most similar sentences in corpus:
"Suite" de divers films(Score: 0.1878)
Cingularité(Score: 0.2703)
Faux sourire(Score: 0.2811)
Je vous remercie(Score: 0.2881)
Harisen(Score: 0.2931)

Visualisez l'espace sémantique latent avec TensorBoard

Exécutez le code suivant et utilisez l'extension TensorBoard de Colaboratory pour mapper et visualiser l'espace du vecteur d'instruction sur l'espace de faible dimension.

In[10]


%load_ext tensorboard
import os
logs_base_dir = "runs"
os.makedirs(logs_base_dir, exist_ok=True)

In[11]


import torch
from torch.utils.tensorboard import SummaryWriter

import tensorflow as tf
import tensorboard as tb
tf.io.gfile = tb.compat.tensorflow_stub.io.gfile

summary_writer = SummaryWriter()
summary_writer.add_embedding(mat=np.array(sentence_vectors), metadata=sentences)

In[12]


%tensorboard --logdir {logs_base_dir}

--Lorsque TensorBoard démarre, sélectionnez PROJECTOR dans le menu en haut à droite.

Espérons que l'espace du vecteur d'instruction sera visualisé comme suit: Il y a un système «d'intelligence artificielle» en haut à gauche, et une masse de systèmes «IA» peut être vue immédiatement à droite. En bas à gauche, vous pouvez voir le type "s'inclinant", au centre vous pouvez voir quelques autres choses diverses, à droite vous pouvez voir le type "femelle", et dans la partie inférieure, vous pouvez voir la masse de type "mâle".

TensorBoard.png

Présentation de Sentence-BERT

(C'est un article très facile à lire, donc je ne pense pas qu'il soit nécessaire de l'expliquer.)

--Papers: Sentence-BERT: Phrases Embeddings using Siamese BERT-Networks

En un mot, le vecteur de phrase créé en incorporant des jetons dans BERT et la mise en commun des moyennes est affiné à l'aide du réseau siamois. C'est simple. Vous pouvez le voir grossièrement en regardant les figures 1 et 2 des articles cités ci-dessous.

SBERT_architecture.png

Paper a expérimenté d'autres méthodes, mais la construction du modèle japonais utilise cette structure de réseau, qui a les performances les plus élevées.

Similitude cosinus et étiquette correcte en utilisant la version anglaise de la cote de précision (STSbenchmark), comme indiqué dans le tableau 2 ci-dessous. Dans le coefficient de corrélation de rang de Spearman (plus il est proche de 1, mieux c'est), il est de 0,58 pour la méthode utilisant la moyenne des vecteurs de mots simples (GloVe), et d'environ 0,85 pour le modèle équivalent à l'échelle créée cette fois.

Performance.png

De plus, selon le tableau 1 de Paper, la précision est de 0,17 lors de l'utilisation du vecteur CLS du BERT ordinaire et de 0,46 lors de l'utilisation de la moyenne de l'incorporation de BERT. Le résultat est pire que le résultat moyen du vecteur (0,58). Comme indiqué dans l'article original de BERT, il s'avère qu'il n'est pas approprié de les utiliser comme vecteurs de phrases (c'est pire que ce que j'imaginais).

Lors de la création de la version japonaise du modèle, huggingface / transformers (Le modèle est Tohoku University Inui Suzuki Laboratory cl-tohoku / bert-japanese)) Version japonaise Le modèle BERT est utilisé.

Et la méthode d'apprentissage du modèle japonais cette fois (ensemble de données utilisé pour l'apprentissage, méthode d'évaluation de la précision), je suis désolé, mais c'est un secret en raison de diverses circonstances. En conséquence, il semble qu'un vecteur de phrase avec contexte soit créé, ce qui est comparable à la version anglaise.

Télécharger le code source et le modèle de la version japonaise

La version japonaise du code source et du modèle utilisés dans l'exemple ci-dessus peut être téléchargée à partir de ce qui suit.

Avertissement

L'auteur porte une attention particulière au contenu, aux fonctions, etc. de cet article, mais ne garantit pas que le contenu est exact ou sûr. Nous ne sommes pas responsables. Même si des inconvénients ou des dommages surviennent à l'utilisateur en utilisant le contenu de cet article, l'auteur et l'organisation à laquelle appartient l'auteur (Nittetsu Solutions Co., Ltd. (NSSOL, ancien Nittetsu Sumikin Solutions Co., Ltd.)) Nous ne prennons aucune responsabilité.

Résumé

J'ai créé un code de version japonaise et un modèle de Sentence-BERT. Désormais, n'importe qui peut facilement créer des vecteurs de phrases de haute qualité. Veuillez l'utiliser.

Recommended Posts

[Avec modèle japonais] Modèle vectoriel de phrases recommandé pour les personnes qui traitent le langage naturel en 2020
Traitement du langage naturel pour les personnes occupées
[Traitement du langage naturel] Prétraitement avec le japonais
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Traiter plusieurs listes avec for en Python
Modèle utilisant un réseau neuronal convolutif dans le traitement du langage naturel
Créez un vecteur de phrase japonais avec BertModel of huggingface / transformers
Créer un environnement pour le traitement du langage naturel avec Python
Comportement dans chaque langue lorsque les collouts sont réutilisés avec for
Pour ceux qui analysent dans l'atmosphère (modèle de régression linéaire 1)