次のページを参考にしました。
[文章生成]MeCabをインストールして分かち書きを試してみよう
文書のコサイン類似度を求める
mecab_wakati.py
#! /usr/bin/python
#
# mecab_wakati.py
#
# Nov/28/2021
#
# ------------------------------------------------------------------
import sys
import MeCab
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# ------------------------------------------------------------------
def to_wakati_proc(sentence_list):
tagger = MeCab.Tagger('-Owakati')
docs=[]
for it in range(len(sentence_list)):
result = tagger.parse(sentence_list[it])
# print(it)
# print(result)
docs.append(result)
#
return docs
# ------------------------------------------------------------------
def output_proc(sim):
from_id = 0
# print('doc_id:', from_id)
for to_id in range(1,len(docs)):
print('sim[{0}][{1}] = {2:f}'.format(
from_id, to_id, sim[from_id][to_id]))
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
sentence_list = [
'昔ある所に、王様がいました。', # 文章A
'ある所に、かわいい女の子がいました。', # 文章B
'一人の王様がいました。', # 文章C
'昔ある所に、貧しい女がいました。', # 文章D
'昔、王様がある所にいました。', # 文章E
]
docs = to_wakati_proc(sentence_list)
#
vectorizer = TfidfVectorizer(max_df=0.90) # tf-idfの計算
# 文書全体の90%以上で出現する単語は無視する
X = vectorizer.fit_transform(docs)
# print('feature_names:', vectorizer.get_feature_names())
# print('X:')
# print(X.toarray())
sim = cosine_similarity(X) # 類似度行列の作成
#
output_proc(sim)
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
実行結果
$ ./mecab_wakati.py
*** 開始 ***
sim[0][1] = 0.315979
sim[0][2] = 0.425818
sim[0][3] = 0.315979
sim[0][4] = 1.000000
*** 終了 ***