BERT 및 Word2Vec에서 문장의 유사성 확인
12180 단어 MachineLearning
BERT 및 Word2Vec에서 문장의 유사성 확인
TL;DR
문장의 유사성을 확인하는 방법으로 BERT
와 Word2Vec
를 비교합니다.
문장 전체의 유사성이 아닌 토큰 단위로의 비교입니다.
BERT와 Word2Vec에 의한 벡터화에는 text-vectorian을 사용합니다.
소스 코드
from text_vectorian import SpBertVectorian
tokenizer_filename = '../bert-japanese/model/wiki-ja.model'
vectorizer_filename = '../bert-japanese/model/model.ckpt-1400000'
bert_vectorian = SpBertVectorian(
tokenizer_filename=tokenizer_filename,
vectorizer_filename=vectorizer_filename
)
from text_vectorian import SentencePieceVectorian
word2vec_vectorian = SentencePieceVectorian()
import numpy as np
import pandas as pd
def cossim(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
def get_vectors(vectorian, text):
vectors = vectorian.fit(text).vectors
tokens = vectorian._tokenizer._tokenize(text)
return tokens, vectors
def get_df(original_text, my_text):
data = []
original_bert = get_vectors(bert_vectorian, original_text)
original_word2vec = get_vectors(word2vec_vectorian, original_text)
my_bert = get_vectors(bert_vectorian, my_text)
my_word2vec = get_vectors(word2vec_vectorian, my_text)
for i, token in enumerate(original_word2vec[0]):
original_token = original_bert[0][i]
original_bert_vector = original_bert[1][i]
original_word2vec_vector = original_word2vec[1][i]
my_token = my_bert[0][i]
my_bert_vector = my_bert[1][i]
my_word2vec_vector = my_word2vec[1][i]
bert_sim = cossim(original_bert_vector, my_bert_vector)
word2vec_sim = cossim(original_word2vec_vector, my_word2vec_vector)
data.append((i, original_token, my_token, bert_sim, word2vec_sim))
df = pd.DataFrame(data, columns=('index', 'original token', 'my token', 'cos diff(bert)', 'cos diff(word2vec)')).set_index('index')
df['cos diff(bert)'] = 1- df['cos diff(bert)']
df['cos diff(bert)'] = df['cos diff(bert)'].clip(0.01, 1).replace(0.01, 0)
df['cos diff(word2vec)'] = 1- df['cos diff(word2vec)']
df['cos diff(word2vec)'] = df['cos diff(word2vec)'].clip(0.01, 1).replace(0.01, 0)
return df
original_text = '今日は室内が大変暑いです。'
same_text = '今日は室内が大変暑いです。'
my_text = '今日は部屋がとても寒いです。'
same_df = get_df(original_text, same_text)
diff_df = get_df(original_text, my_text)
display(same_df.style.bar())
display(diff_df.style.bar())
요약
같은 문장의 경우에는 차이가 없습니다.
일부가 다른 문장의 경우는 다음과 같이 차이를 확인할 수 있습니다.
BERT
의 경우는 토큰의 전후의 관계를 고려하기 위해 토큰 마다의 비교에서는 단순한 차이를 확인할 수 없습니다.Word2Vec
그렇다면 간단한 토큰 단위의 차이를 확인할 수 있습니다.
참고문헌
from text_vectorian import SpBertVectorian
tokenizer_filename = '../bert-japanese/model/wiki-ja.model'
vectorizer_filename = '../bert-japanese/model/model.ckpt-1400000'
bert_vectorian = SpBertVectorian(
tokenizer_filename=tokenizer_filename,
vectorizer_filename=vectorizer_filename
)
from text_vectorian import SentencePieceVectorian
word2vec_vectorian = SentencePieceVectorian()
import numpy as np
import pandas as pd
def cossim(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
def get_vectors(vectorian, text):
vectors = vectorian.fit(text).vectors
tokens = vectorian._tokenizer._tokenize(text)
return tokens, vectors
def get_df(original_text, my_text):
data = []
original_bert = get_vectors(bert_vectorian, original_text)
original_word2vec = get_vectors(word2vec_vectorian, original_text)
my_bert = get_vectors(bert_vectorian, my_text)
my_word2vec = get_vectors(word2vec_vectorian, my_text)
for i, token in enumerate(original_word2vec[0]):
original_token = original_bert[0][i]
original_bert_vector = original_bert[1][i]
original_word2vec_vector = original_word2vec[1][i]
my_token = my_bert[0][i]
my_bert_vector = my_bert[1][i]
my_word2vec_vector = my_word2vec[1][i]
bert_sim = cossim(original_bert_vector, my_bert_vector)
word2vec_sim = cossim(original_word2vec_vector, my_word2vec_vector)
data.append((i, original_token, my_token, bert_sim, word2vec_sim))
df = pd.DataFrame(data, columns=('index', 'original token', 'my token', 'cos diff(bert)', 'cos diff(word2vec)')).set_index('index')
df['cos diff(bert)'] = 1- df['cos diff(bert)']
df['cos diff(bert)'] = df['cos diff(bert)'].clip(0.01, 1).replace(0.01, 0)
df['cos diff(word2vec)'] = 1- df['cos diff(word2vec)']
df['cos diff(word2vec)'] = df['cos diff(word2vec)'].clip(0.01, 1).replace(0.01, 0)
return df
original_text = '今日は室内が大変暑いです。'
same_text = '今日は室内が大変暑いです。'
my_text = '今日は部屋がとても寒いです。'
same_df = get_df(original_text, same_text)
diff_df = get_df(original_text, my_text)
display(same_df.style.bar())
display(diff_df.style.bar())
Reference
이 문제에 관하여(BERT 및 Word2Vec에서 문장의 유사성 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hideki/items/06d84233b40158c8c80d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)