【SCDV】実装

module

import numpy as np
from gensim.models import word2vec
from sklearn.mixture import GaussianMixture
from sklearn.feature_extraction.text import TfidfVectorizer

0. corpusの作成

corpus = [[w1, w2, w3], [w1, w4, w5, w2], [w3, w6, w7], ..., ]
id_to_word = list({word for text in corpus for word in text})
word_to_id = {word: i for i, word in enumerate(id_to_word)}

このような形式のコーパスを用意

1. word2vec(埋め込みベクトル)の作成

w2v = word2vec.Word2Vec(sentences, size=50, min_count=1, window=7)
embedding = np.array([w2v.wv[word] for word in id_to_word])

既存モデルを用いるのがベター

2. GMMでクラスタリング

cluster_size = 10
gm = GaussianMixture(n_components=cluster_size, max_iter=100)
gm = gm.fit(w2v.wv.vectors)

3. 各単語ベクトルが各クラスタに属する確率を求める

probability = gm.predict_proba(embedding)

4. 単語クラスタベクトルを求める

vocab_size, embedd_size = embedding.shape
e = embedding.reshape(vocab_size, 1, embedd_size)
p = probability.reshape(vocab_size, cluster_size, 1)
wcv = e * p

reshapeで全掛けできるようにする。

5. IDF値を求める

tfv = TfidfVectorizer(dtype=np.float32, max_df=0.9, min_df=0.1)
_ = tfv.fit_transform([' '.join(text) for text in corpus])

idf = np.zeros(vocab_size)
for word, feature in zip(tfv.get_feature_names(), tfv._tfidf.idf_):
   idf[word_to_id[word]] = feature

6. 単語トピックベクトルを求める

wtv = wcv * idf.reshape(vocab_size, 1, 1)

7. 文書中の各単語の単語トピックベクトルを足し合わせ、文書ベクトルを得る

get_vector = lambda text: [wtv[word_to_id[word]] for word in text if word_to_id.get(word)]
document_vectors = [get_vector(text) for text in corpus]
document_vectors = np.array([np.sum(vector, axis=0)/len(vector) for vector in document_vectors if vector])

8. スパース化

sparsity_percentage = 0.7
abs_ave_max = lambda array : np.abs(np.average(np.max(array, axis=1)))
threshold = sparsity_percentage * (abs_ave_max(document_vectors) + abs_ave_max(-document_vectors))/2
document_vectors[document_vectors < threshold] = 0

この記事が気に入ったらサポートをしてみませんか?