[PYTHON] BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?

Contexte

Word2Vec a déjà été utilisé, mais il semble que ce soit une expression qui ne tient pas compte du contexte.

"Les prévisions météorologiques de demain sont des bonbons." "J'ai acheté un bonbon dans un magasin de bonbons."

Quand il y a deux phrases comme ci-dessus Bien que les significations de «pluie» et «bonbon» soient différentes, ce sont le même mot, donc elles reconnaissent la même chose.

En attendant, en disant que le BERT peut exprimer en tenant compte du contexte, Je voulais voir si le "Ame" ci-dessus avait un sens différent.

plan

Données cibles

Vérifiez à l'aide du corpus suivant, en vous référant à l'implémentation ELMo dans l'article ici.

Modèle BERT

BERT utilise huggingface / transformers pour acquérir des représentations distribuées.

Mise en œuvre et résultats

Le montage a été réalisé dans les étapes suivantes.

  1. Partage de mots
  2. Numérotez les mots
  3. Convertir au format d'entrée du modèle (tensorisation)
  4. Préparation et saisie du modèle
  5. Calculez la similitude entre les sorties (pluie et pluie, pluie et bonbons, bonbons et bonbons)
import torch
import numpy as np
from transformers import BertJapaneseTokenizer, BertForMaskedLM

tokenizer = BertJapaneseTokenizer.from_pretrained('bert-base-japanese-whole-word-masking')

def tokenize(text):
    return tokenizer.tokenize(text)

def word_to_index(text):
    return tokenizer.convert_tokens_to_ids(text)

def to_tensor(tokens):
    return torch.tensor([tokens])


def cos_sim(vec1, vec2):
    x = vec1.detach().numpy()
    y = vec2.detach().numpy()

    x_l2_norm = np.linalg.norm(x, ord=2)
    y_l2_norm = np.linalg.norm(y, ord=2)
    xy = np.dot(x,y)

    return xy / (x_l2_norm * y_l2_norm)


if __name__ == "__main__":
    d_rainy_01 = "[CLS]Les prévisions météorologiques de demain sont des bonbons.[SEP]"
    d_rainy_02 = "[CLS]Je n'ai pas fait de promenade de chien parce que c'était des bonbons ce matin.[SEP]"
    d_rainy_03 = "[CLS]Il pleut, donc il pleut tous les jours.[SEP]"
    d_candy_01 = "[CLS]J'ai acheté un bonbon dans un magasin de bonbons.[SEP]"
    d_candy_02 = "[CLS]Travaillez en léchant des bonbons.[SEP]"
    d_candy_03 = "[CLS]Je ne suis pas doué pour les bonbons acidulés.[SEP]"

    # 1.Partage de mots
    tokenize_rainy_01 = tokenize(d_rainy_01)
    tokenize_rainy_02 = tokenize(d_rainy_02)
    tokenize_rainy_03 = tokenize(d_rainy_03)
    tokenize_candy_01 = tokenize(d_candy_01)
    tokenize_candy_02 = tokenize(d_candy_02)
    tokenize_candy_03 = tokenize(d_candy_03)

    # 2.Mots de nombre
    indexes_rainy_01 = to_vocabulary(tokenize_rainy_01)
    indexes_rainy_02 = to_vocabulary(tokenize_rainy_02)
    indexes_rainy_03 = to_vocabulary(tokenize_rainy_03)
    indexes_candy_01 = to_vocabulary(tokenize_candy_01)
    indexes_candy_02 = to_vocabulary(tokenize_candy_02)
    indexes_candy_03 = to_vocabulary(tokenize_candy_03)

    # 3.Convertir au format d'entrée du modèle(Tensolisation)
    tensor_rainy_01 = to_tensor(indexes_rainy_01)
    tensor_rainy_02 = to_tensor(indexes_rainy_02)
    tensor_rainy_03 = to_tensor(indexes_rainy_03)
    tensor_candy_01 = to_tensor(indexes_candy_01)
    tensor_candy_02 = to_tensor(indexes_candy_02)
    tensor_candy_03 = to_tensor(indexes_candy_03)

    # 4.Préparation et saisie du modèle
    bert = BertForMaskedLM.from_pretrained('bert-base-japanese-whole-word-masking')
    bert.eval()

    index_rainy_01 = tokenize_rainy_01.index('Pluie')
    index_rainy_02 = tokenize_rainy_02.index('Pluie')
    index_rainy_03 = tokenize_rainy_03.index('Pluie')
    index_candy_01 = tokenize_candy_01.index('Pluie')
    index_candy_02 = tokenize_candy_02.index('Pluie')
    index_candy_03 = tokenize_candy_03.index('Pluie')
    vec_rainy_01 = bert(tensor_rainy_01)[0][0][index_rainy_01]
    vec_rainy_02 = bert(tensor_rainy_02)[0][0][index_rainy_02]
    vec_rainy_03 = bert(tensor_rainy_03)[0][0][index_rainy_03]
    vec_candy_01 = bert(tensor_candy_01)[0][0][index_candy_01]
    vec_candy_02 = bert(tensor_candy_02)[0][0][index_candy_02]
    vec_candy_03 = bert(tensor_candy_03)[0][0][index_candy_03]

    # 5.Entre les sorties(Pluie et pluie, pluie et bonbons, bonbons et bonbons)Calculez la similitude de
    print("pluie_01 and pluie_02 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_rainy_02)))
    print("pluie_01 and pluie_03 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_rainy_03)))
    print("pluie_02 and pluie_03 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_rainy_03)))
    print("-"*30)


    print("pluie_01 et bonbons_01 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_candy_01)))
    print("pluie_01 et bonbons_02 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_candy_02)))
    print("pluie_01 et bonbons_03 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_candy_03)))
    print("-"*30)

    print("pluie_02 et bonbons_01 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_candy_01)))
    print("pluie_02 et bonbons_02 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_candy_02)))
    print("pluie_02 et bonbons_03 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_candy_03)))
    print("-"*30)

    print("pluie_03 et bonbons_01 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_03, vec_candy_01)))
    print("pluie_03 et bonbons_02 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_03, vec_candy_02)))
    print("pluie_03 et bonbons_03 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_rainy_03, vec_candy_03)))
    print("-"*30)

    print("bonbons_01 and bonbons_02 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_candy_01, vec_candy_02)))
    print("bonbons_01 and bonbons_03 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_candy_01, vec_candy_03)))
    print("bonbons_02 and bonbons_03 :Cos similitude de "Ame": {:.2f}".format(cos_sim(vec_candy_02, vec_candy_03)))

Pour résumer les résultats,

rainy_01 rainy_02 rainy_03 candy_01 candy_02 candy_03
rainy_01 * 0.79 0.88 0.83 0.83 0.83
rainy_02 * * 0.79 0.77 0.75 0.77
rainy_03 * * * 0.87 0.89 0.84
candy_01 * * * * 0.93 0.90
candy_02 * * * * * 0.90
candy_03 * * * * * *

Pour le moment, je vois les significations de la pluie et des bonbons comme différentes (?) Mais pourquoi la valeur ne s'est-elle pas écartée des attentes?

prime

NICT a publié un modèle pré-formé en mars 2020, alors je l'ai comparé avec bert-base-japanese-whole-word-masking. Le résultat de l'utilisation du modèle NTIC pour obtenir la similitude dans le même processus est le suivant.

rainy_01 rainy_02 rainy_03 candy_01 candy_02 candy_03
rainy_01 * 0.83 0.82 0.86 0.82 0.85
rainy_02 * * 0.88 0.87 0.79 0.84
rainy_03 * * * 0.84 0.80 0.86
candy_01 * * * * 0.82 0.85
candy_02 * * * * * 0.81
candy_03 * * * * * *
bert-base-japanese-whole-word-masking NICT
Même signification 0.865 0.835
Significations différentes 0.820 0.837

en conclusion

Le résultat n'était pas ce à quoi je m'attendais ... Je ne sais pas si c'est la voie à suivre, alors faites-le moi savoir!

référence

Recommended Posts

BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?
À propos de la différence entre "==" et "is" en python
À propos de la différence entre PostgreSQL su et sudo
Quelle est la différence entre Unix et Linux?
Prise en compte de la différence entre la courbe ROC et la courbe PR
Différence approximative entre Unicode et UTF-8 (et ses compagnons)
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
Comment utiliser argparse et la différence entre optparse
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
Différence entre régression et classification
Différence entre np.array et np.arange
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
Quelle est la différence entre les liens symboliques et les liens durs?
Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets
Différence entre le processus de premier plan et le processus d'arrière-plan compris par principe
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Différence entre SQLAlchemy filter () et filter_by ()
Différence entre == et est en python
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Différence entre le randint de Numpy et le randint de Random
Différence entre tri et tri (mémorial)
Différence entre la série python2 et la série python3 dict.keys ()
J'ai étudié le comportement de la différence entre lien dur et lien symbolique
[Python] Différence entre fonction et méthode
Différence entre SQLAlchemy flush () et commit ()
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
[Xg boost] Différence entre softmax et softprob
différence entre les instructions (instructions) et les expressions (expressions) en Python
Différences dans la relation entre PHP et Python enfin et quitter
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
[Python] Différence entre la méthode de classe et la méthode statique
Différence entre le fichier env_file docker-compose et le fichier .env
La relation subtile entre Gentoo et pip
À propos de la relation entre Git et GitHub
[Python Iroha] Différence entre List et Tuple
[python] Différence entre la sortie rand et randn
Différence de vitesse entre wsgi, bouteille et flacon
Différence entre numpy.ndarray et list (dimension, taille)
Différence entre ls -l et la commande cat
Vérification de la différence et de la compatibilité entre keras et tf.keras # 1
Résumé des différences entre PHP et Python
La réponse de "1/2" est différente entre python2 et 3
Différence entre l'utilisation et l'importation sur le langage de bouclier
[python] Différence entre variable et self. Variable dans la classe
Modélisation-estimation de Bayes de la différence entre les deux groupes-
[Python] Explique la différence entre strftime et strptime dans le module datetime avec un exemple
[Introduction au modèle des maladies infectieuses] Quelle est la différence entre l'épidémie d'avril et cette épidémie? .. .. ‼