https://huggingface.co/ajinkyaT/albert-japanese-v2-finetuned-ner
ajinkyaT/albert-japanese-v2-finetuned-ner
2023/6/22 23:37:00
「本当にsentence embeddingにござるか~~~~?単なるWord Embeddingじゃないの~~~?」と思ったので、異なる文脈における同一単語のEmbeddingの差異を取った。
結論としては差異は無いため、単なるWord Embeddingと思われる。
東京は日本の首都です
と東京は関東に位置しており、埼玉や千葉が近隣にあります
の東京
のEmbedding結果を取った結果は以下の通りとなる。
tf.Tensor(
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.], shape=(128,), dtype=float32)
さらにさらにajinkyaT/albert-japanese-v2-finetuned-nerの良い所は、EnergeticAI Embeddingsで動かせる可能性がある。tensorflowjs_converterが出力したファイル形式に見覚えがあるので。
そう思って読み込ませてみたが動かなかった。model.jsonの中身を見ると、modelTopologyがnullになっており、そのためにエラーが発生する。
さらにajinkyaT/albert-japanese-v2-finetuned-nerの良い所は、TensorFlow.jsで読み込める可能性がある。
tensorflowjs_converterでTensorFlow.jsレイヤー形式に変換できたので。何やってるかはなんもわからん。TensorFlow.js
何も分かってないけどajinkyaT/albert-japanese-v2-finetuned-nerでsentence embeddingっぽいものが取れて、大体良い感じの類似度が出る。
from transformers import (
TFAutoModelForMaskedLM, AutoTokenizer, TFAutoModel
)
import tensorflow as tf
import tensorflowjs as tfjs
from tensorflow import keras
import numpy as np
tokenizer = AutoTokenizer.from_pretrained("ajinkyaT/albert-japanese-v2-finetuned-ner")
model = TFAutoModel.from_pretrained("ajinkyaT/albert-japanese-v2-finetuned-ner")
print(model.summary())
def embedding_calc(text):
tokens = tokenizer(text, return_tensors="tf")
return model.layers[0].get_input_embeddings().call(tokens["input_ids"])[0]
def cos_sim(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
embedding1 = tf.reduce_sum(embedding_calc("東京は日本の首都です"), 0)
embedding2 = tf.reduce_sum(embedding_calc("日本の首都は東京です"), 0)
embedding3 = tf.reduce_sum(embedding_calc("this is test sentence to test"), 0)
embedding4 = tf.reduce_sum(embedding_calc("japanese capital is Tokyo"), 0)
print(cos_sim(embedding1.numpy(), embedding2.numpy())) # 0.9314501
print(cos_sim(embedding2.numpy(), embedding4.numpy())) # 0.66796505
print(cos_sim(embedding2.numpy(), embedding3.numpy())) # 0.44220626