Spaces:
Sleeping
Sleeping
import gensim | |
from sklearn.metrics.pairwise import cosine_similarity | |
class CosineSimilarityCalculator: | |
model_path = 'ja/ja.bin' | |
def __init__(self): | |
""" | |
CosineSimilarityCalculatorクラスを初期化し、 | |
事前トレーニング済みのWord2Vecモデルをロード | |
Parameters: | |
- なし | |
Returns: | |
- なし | |
""" | |
self.model = gensim.models.Word2Vec.load(CosineSimilarityCalculator.model_path) | |
def _convert_to_2d_array(self, vector): | |
""" | |
埋め込みベクトルを2次元配列に変換 | |
Parameters: | |
- vector (numpy.ndarray): 変換する1次元配列のベクトル | |
Returns: | |
- vector_2d (numpy.ndarray): 変換後の2次元配列のベクトル | |
""" | |
return vector.reshape(1, -1) | |
def _calculate_cosine_similarity(self, embedding1, embedding2): | |
""" | |
cos類似度を計算 | |
Parameters: | |
- embedding1 (numpy.ndarray): 1つ目の単語ベクトル(2次元配列) | |
- embedding2 (numpy.ndarray): 2つ目の単語ベクトル(2次元配列) | |
Returns: | |
- similarity (numpy.ndarray): cos類似度 | |
""" | |
return cosine_similarity(embedding1, embedding2) | |
def calculate_similarity(self, search_word, article_keyword_list): | |
""" | |
指定された検索ワードと記事のキーワードリストの間のcos類似度を計算 | |
モデルにない単語の場合はエラーメッセージを出力しブレイクする | |
Parameters: | |
- search_word (str): 検索ワード | |
- article_keyword_list (list): 記事のキーワードリスト | |
Returns: | |
- similarities (dict): 記事キーワードとそれぞれの検索ワードのcos類似度を含むdictを作成 | |
モデルにない単語の場合はNoneを返す | |
""" | |
# 検索ワードの埋め込みベクトルを取得 | |
if search_word in self.model.wv: | |
search_embedding = self.model.wv[search_word] | |
else: | |
return None | |
similarities = {} | |
# 記事キーワードの埋め込みベクトルを取得し、cos類似度を計算 | |
for keyword in article_keyword_list: | |
if keyword in self.model.wv: | |
keyword_embedding = self.model.wv[keyword] | |
search_embedding_2d = self._convert_to_2d_array(search_embedding) | |
keyword_embedding_2d = self._convert_to_2d_array(keyword_embedding) | |
similarity = self._calculate_cosine_similarity(search_embedding_2d, keyword_embedding_2d) | |
similarities[keyword] = similarity[0][0] | |
else: | |
similarities[keyword] = None | |
return similarities |