Word2Vec wurde bereits verwendet, scheint jedoch ein Ausdruck zu sein, der den Kontext nicht berücksichtigt.
"Die Wettervorhersage von morgen ist süß." "Ich habe Süßigkeiten in einem Süßwarenladen gekauft."
Wenn es zwei Sätze wie oben gibt Obwohl die Bedeutungen von "Regen" und "Süßigkeiten" unterschiedlich sind, sind sie dasselbe Wort, sodass sie dasselbe erkennen.
In der Zwischenzeit kann BERT unter Berücksichtigung des Kontextes Folgendes ausdrücken: Ich wollte sehen, ob das obige "Ame" eine andere Bedeutung hat.
Überprüfen Sie anhand des folgenden Korpus die ELMo-Implementierung im Artikel hier.
BERT verwendet huggingface / transformers, um verteilte Darstellungen zu erfassen.
Die Montage erfolgte in folgenden Schritten.
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]Die Wettervorhersage von morgen ist süß.[SEP]"
d_rainy_02 = "[CLS]Ich bin nicht mit dem Hund spazieren gegangen, weil es heute Morgen Süßigkeiten waren.[SEP]"
d_rainy_03 = "[CLS]Es regnet, also regnet es jeden Tag.[SEP]"
d_candy_01 = "[CLS]Ich habe eine Süßigkeit in einem Süßwarenladen gekauft.[SEP]"
d_candy_02 = "[CLS]Arbeiten Sie beim Lecken von Süßigkeiten.[SEP]"
d_candy_03 = "[CLS]Ich bin nicht gut in sauren Süßigkeiten.[SEP]"
# 1.Wort geteilt
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.Zahlenwörter
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.In Modelleingabeformat konvertieren(Tensolisierung)
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.Modellvorbereitung und Eingabe
bert = BertForMaskedLM.from_pretrained('bert-base-japanese-whole-word-masking')
bert.eval()
index_rainy_01 = tokenize_rainy_01.index('Regen')
index_rainy_02 = tokenize_rainy_02.index('Regen')
index_rainy_03 = tokenize_rainy_03.index('Regen')
index_candy_01 = tokenize_candy_01.index('Regen')
index_candy_02 = tokenize_candy_02.index('Regen')
index_candy_03 = tokenize_candy_03.index('Regen')
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.Zwischen den Ausgängen(Regen und Regen, Regen und Süßigkeiten, Süßigkeiten und Süßigkeiten)Berechnen Sie die Ähnlichkeit von
print("Regen_01 and Regen_02 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_rainy_02)))
print("Regen_01 and Regen_03 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_rainy_03)))
print("Regen_02 and Regen_03 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_rainy_03)))
print("-"*30)
print("Regen_01 und Süßigkeiten_01 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_candy_01)))
print("Regen_01 und Süßigkeiten_02 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_candy_02)))
print("Regen_01 und Süßigkeiten_03 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_01, vec_candy_03)))
print("-"*30)
print("Regen_02 und Süßigkeiten_01 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_candy_01)))
print("Regen_02 und Süßigkeiten_02 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_candy_02)))
print("Regen_02 und Süßigkeiten_03 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_02, vec_candy_03)))
print("-"*30)
print("Regen_03 und Süßigkeiten_01 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_03, vec_candy_01)))
print("Regen_03 und Süßigkeiten_02 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_03, vec_candy_02)))
print("Regen_03 und Süßigkeiten_03 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_rainy_03, vec_candy_03)))
print("-"*30)
print("Süßigkeiten_01 and Süßigkeiten_02 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_candy_01, vec_candy_02)))
print("Süßigkeiten_01 and Süßigkeiten_03 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_candy_01, vec_candy_03)))
print("Süßigkeiten_02 and Süßigkeiten_03 :Cos Ähnlichkeit von "Ame": {:.2f}".format(cos_sim(vec_candy_02, vec_candy_03)))
Um die Ergebnisse zusammenzufassen,
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 | * | * | * | * | * | * |
Zur Zeit sehe ich die Bedeutung von Regen und Süßigkeiten als unterschiedlich (?) Aber warum weicht der Wert nicht von den Erwartungen ab?
NICT hat im März 2020 ein vorab trainiertes Modell veröffentlicht, daher habe ich es mit der Bert-Base-Japanisch-Ganzwort-Maskierung verglichen. Das Ergebnis der Verwendung des NICT-Modells, um Ähnlichkeit im selben Prozess zu erhalten, ist wie folgt.
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 | |
---|---|---|
Selbe Bedeutung | 0.865 | 0.835 |
Unterschiedliche Bedeutungen | 0.820 | 0.837 |
Das Ergebnis war nicht das, was ich erwartet hatte ... Ich weiß nicht, ob dies der richtige Weg ist, also lass es mich wissen!
Recommended Posts