[PYTHON] Kann BERT den Unterschied zwischen "Ame (Süßigkeiten)" und "Ame (Regen)" verstehen?

Hintergrund

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.

planen

Zieldaten

Überprüfen Sie anhand des folgenden Korpus die ELMo-Implementierung im Artikel hier.

* Süßigkeiten * "Ich habe Süßigkeiten in einem Süßwarenladen gekauft." * "Ich arbeite, während ich Süßigkeiten lecke." * "Ich bin nicht gut in sauren Süßigkeiten." * "Die Wettervorhersage von morgen ist Süßigkeiten." BERT-Modell

BERT verwendet huggingface / transformers, um verteilte Darstellungen zu erfassen.

Implementierung und Ergebnisse

Die Montage erfolgte in folgenden Schritten.

  1. Wortteilung
  2. Nummerieren Sie die Wörter
  3. In Modelleingabeformat konvertieren (Tensorisierung)
  4. Modellvorbereitung und Eingabe
  5. Berechnen Sie die Ähnlichkeit zwischen den Ausgaben (Regen und Regen, Regen und Süßigkeiten, Süßigkeiten und Süßigkeiten).
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?

Bonus

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

abschließend

Das Ergebnis war nicht das, was ich erwartet hatte ... Ich weiß nicht, ob dies der richtige Weg ist, also lass es mich wissen!

Referenz

Recommended Posts

Kann BERT den Unterschied zwischen "Ame (Süßigkeiten)" und "Ame (Regen)" verstehen?
Über den Unterschied zwischen "==" und "is" in Python
Über den Unterschied zwischen PostgreSQL su und sudo
Was ist der Unterschied zwischen Unix und Linux?
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
Grober Unterschied zwischen Unicode und UTF-8 (und seinen Begleitern)
Was ist der Unterschied zwischen usleep, nanosleep und clock_nanosleep?
Wie man Argparse benutzt und den Unterschied zwischen Optparse
Unterschied zwischen "categoryical_crossentropy" und "sparse_categorical_crossentropy"
Unterschied zwischen Regression und Klassifikation
Unterschied zwischen np.array und np.arange
Unterschied zwischen MicroPython und CPython
Unterschied zwischen ps a und ps -a
Unterschied zwischen Return und Print-Python
Was ist der Unterschied zwischen symbolischen und harten Links?
Verstehen Sie den Unterschied zwischen der kumulativen Zuordnung zu Variablen und der kumulativen Zuordnung zu Objekten
Unterschied zwischen Vordergrundprozess und Hintergrundprozess, prinzipiell verstanden
Unterschied zwischen Java und Python (Memo)
Unterschied zwischen list () und [] in Python
Unterschied zwischen SQLAlchemy filter () und filter_by ()
Unterschied zwischen == und ist in Python
Memorandum (Unterschied zwischen csv.reader und csv.dictreader)
(Hinweis) Unterschied zwischen Gateway und Standard-Gateway
Unterschied zwischen Numpys Randint und Randoms Randint
Unterschied zwischen sortiert und sortiert (Denkmal)
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
Ich untersuchte das Verhalten bezüglich des Unterschieds zwischen Hard Link und Symbolic Link
[Python] Unterschied zwischen Funktion und Methode
Unterschied zwischen SQLAlchemy flush () und commit ()
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
[Xg Boost] Unterschied zwischen Softmax und Softprob
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
Unterschied zwischen linearer Regression, Ridge-Regression und Lasso-Regression
[Python] Unterschied zwischen Klassenmethode und statischer Methode
Unterschied zwischen Docker-Compose-Datei env_file und .env-Datei
Die subtile Beziehung zwischen Gentoo und Pip
Über die Beziehung zwischen Git und GitHub
[Python Iroha] Unterschied zwischen Liste und Tupel
[Python] Unterschied zwischen Rand- und Randn-Ausgabe
Geschwindigkeitsunterschied zwischen wsgi, Flasche und Flasche
Unterschied zwischen numpy.ndarray und list (Dimension, Größe)
Unterschied zwischen ls -l und cat Befehl
Differenz- und Kompatibilitätsprüfung zwischen Keras und tf.keras # 1
Zusammenfassung der Unterschiede zwischen PHP und Python
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Unterschied zwischen Verwendung und Import in der Schildsprache
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
Bayes Modellierung-Schätzung des Unterschieds zwischen den beiden Gruppen-
[Python] Erläutert anhand eines Beispiels den Unterschied zwischen strftime und strptime im datetime-Modul
[Einführung in das Modell für Infektionskrankheiten] Was ist der Unterschied zwischen der April-Epidemie und dieser Epidemie? .. .. ‼