File size: 2,822 Bytes
a08962e
 
 
 
 
 
 
 
 
 
 
 
 
44bec05
a08962e
 
44bec05
a08962e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44bec05
a08962e
 
44bec05
 
a08962e
 
44bec05
a08962e
 
 
 
 
44bec05
230209e
a08962e
 
 
 
 
44bec05
230209e
a08962e
 
 
 
 
 
 
 
a7b12c0
a08962e
 
 
 
 
 
 
 
 
44bec05
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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