今回もGensimを用いて言語の分析をする.
今回はgensim のモジュールでWord2Vec による単語埋め込みから得られる単語間類似度を利用して、SCM により文章間の意味的類似度を算出する.
import re
from gensim import corpora, models
from gensim.models import Word2Vec
from gensim.similarities.docsim import SoftCosineSimilarity
from gensim.similarities import WordEmbeddingSimilarityIndex, SparseTermSimilarityMatrix
# --- 新しいサンプル文書 ---
doc1 = "The weather is nice today and the park is full of people enjoying the sunshine."
doc2 = "It is raining heavily today and the streets are crowded with people carrying umbrellas."
documents = [doc1, doc2]
# --- 前処理(単純なトークナイズ) ---
def tokenize(text):
# テキストを小文字化し、非単語文字を空白に置換して単語リストに変換
return re.sub(r'\W+', ' ', text.lower()).split()
# 各文書をトークナイズ
tokenized_docs = [tokenize(doc) for doc in documents]
# --- 辞書とコーパスの作成 ---
# 辞書:各単語に一意なIDを割り当てる
dictionary = corpora.Dictionary(tokenized_docs)
# コーパス:各文書をBag-of-Words形式に変換
bow_corpus = [dictionary.doc2bow(doc) for doc in tokenized_docs]
# --- Word2Vecモデルの学習 ---
# サンプル文書のみで学習しているため、実際の用途では大規模なデータセットを用いるのが望ましい
w2v_model = Word2Vec(tokenized_docs, vector_size=50, window=2, min_count=1, workers=2)
# --- 類似度インデックスの作成 ---
# KeyedVectors を WordEmbeddingSimilarityIndex でラップして、TermSimilarityIndex に変換
termsim_index = WordEmbeddingSimilarityIndex(w2v_model.wv)
# 辞書と類似度インデックスから疎な単語類似度行列を構築
similarity_matrix = SparseTermSimilarityMatrix(termsim_index, dictionary)
# --- Soft Cosine Similarity インデックスの作成 ---
# コーパス(BoW形式)と類似度行列を用いて、SoftCosineSimilarity のインデックスを生成
soft_cosine_index = SoftCosineSimilarity(bow_corpus, similarity_matrix, num_best=1)
# --- クエリ文書に対する類似度計算 ---
query_doc = "Today is a pleasant day with clear skies, perfect for a walk in the park."
query_bow = dictionary.doc2bow(tokenize(query_doc))
sims = soft_cosine_index[query_bow]
print("Soft Cosine Similarity:", sims)
# --- inner_product メソッドによる直接計算の例 ---
# 2つの文書間のソフトコサイン類似度を直接計算
doc1_bow = dictionary.doc2bow(tokenize(doc1))
doc2_bow = dictionary.doc2bow(tokenize(doc2))
sim_inner = similarity_matrix.inner_product(doc1_bow, doc2_bow)
print("Inner product (soft cosine) similarity:", sim_inner)
Soft Cosine Similarity: (0, 0.6612653732299805)
Inner product (soft cosine) similarity: 9.811922