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.
Vérifiez à l'aide du corpus suivant, en vous référant à l'implémentation ELMo dans l'article ici.
BERT utilise huggingface / transformers pour acquérir des représentations distribuées.
Le montage a été réalisé dans les étapes suivantes.
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?
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 |
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!
Recommended Posts