次のページを参考にしました。
GiNZAを使って分かち書きをしてみた話
ginza_wakati.py
#! /usr/bin/python
#
# ginza_wakati.py
#
# Nov/28/2021
#
# ------------------------------------------------------------------
import sys
import spacy
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# ------------------------------------------------------------------
def to_wakati_proc(sentence_list):
nlp = spacy.load('ja_ginza')
list_aa = list(nlp.pipe(sentence_list))
docs = []
for unit_aa in list_aa:
unit_bb = []
for word in unit_aa:
unit_bb.append(str(word))
text = ' '.join(unit_bb)
docs.append(text)
# print(docs)
#
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%以上で出現する単語は無視する
try:
X = vectorizer.fit_transform(docs)
# print('feature_names:', vectorizer.get_feature_names())
# print('X:')
# print(X.toarray())
sim = cosine_similarity(X) # 類似度行列の作成
output_proc(sim)
except Exception as ee:
sys.stderr.write("*** error *** in vectorizer.fit_transform ***\n")
sys.stderr.write(str(ee) + "\n")
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
実行結果
$ ./ginza_wakati.py
*** 開始 ***
sim[0][1] = 0.238241
sim[0][2] = 0.425818
sim[0][3] = 0.315979
sim[0][4] = 1.000000
*** 終了 ***