こちらと同じことを Mecab で行いました。
Python3: cos類似度を計算 (janome)
次のページを参考にしました。
PythonのMeCabで形態素解析!Tf-idfとCos類似度で文書の類似度を算出してみよう!
mecab_check.py
#! /usr/bin/python
#
# mecab_check.py
# Nov/27/2021
# ------------------------------------------------------------------
import sys
import MeCab
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
# ------------------------------------------------------------------
def mplg(article):
word_list = ""
m=MeCab.Tagger()
m1=m.parse(text)
for row in m1.split("\n"):
word =row.split("\t")[0]
if word == "EOS":
break
else:
word_list = word_list +" "+ word
return word_list
# ------------------------------------------------------------------
def tfidf(word_list):
docs = np.array(word_list)#Numpyの配列に変換する
#単語を配列ベクトル化して、TF-IDFを計算する
vecs = TfidfVectorizer(
token_pattern=u'(?u)\\b\\w+\\b'#文字列長が 1 の単語を処理対象に含めることを意味します。
).fit_transform(docs)
vecs = vecs.toarray()
return vecs
# ------------------------------------------------------------------
def cossim(v1,v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
sentence_list = [
'昔ある所に、王様がいました。', # 文章A
'ある所に、かわいい女の子がいました。', # 文章B
'一人の王様がいました。', # 文章C
'昔ある所に、貧しい女がいました。', # 文章D
'昔、王様がある所にいました。', # 文章E
]
word_list = []
for text in sentence_list:
word_list.append(mplg(text))
vecs=tfidf(word_list)
print(cossim(vecs[0],vecs[1]))
print(cossim(vecs[0],vecs[2]))
print(cossim(vecs[0],vecs[3]))
print(cossim(vecs[0],vecs[4]))
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
実行結果
$ ./mecab_check.py
*** 開始 ***
0.5274797167376858
0.47111722018067215
0.6698436999383569
1.0
*** 終了 ***