文字の類似度を計算するするのは自分で実装するのはなかなか難しい。
pythonのdifflib.SequenceMatcherを使えば、簡単に実現できるため、使ってみました。
difflib.SequenceMatcherの使い方
import difflib
str1 = "サーバー証明書"
str2 = "サーバ証明書"
s = difflib.SequenceMatcher(None, str1, str2).ratio()
print(str1 + "<----->" + str2)
print("match ratio:" + str(s) + "\n")
### サーバー証明書<----->サーバ証明書
### match ratio:0.9230769230769231
もう少し複雑に
リストAにもリストBにもたくさんの文字列があり、リストBからリストAの各文字列に一番類似するものを探し出したい。
データを準備
LIST_A.txt
テスト
apple
天気が良い
自動車
train
りんご
LIST_B.txt
天気がよい
テスト・テスト
テスト
application
train
電車
自転車
りん
りんご
applepie
pythonのソースコード
import difflib
import sys
import csv
listA = "./LIST_A.txt"
listB = "./LIST_B.txt"
#類似度を初期化
maxMacherIndex = -1
#一番類似する文字列を保持するための変数
maxMacher = ""
#処理進捗を表示するためのカウント
count = 0
with open(listA, "r", encoding="SJIS") as f:
listAlines = f.readlines()
with open(listB, "r", encoding="SJIS") as f:
listBlines = f.readlines()
#結果を書き込みするためのファイル、上書き
f = open("result.txt", "w")
for aitem in listAlines:
for bitem in listBlines:
#類似度計算
r = difflib.SequenceMatcher(None, aitem, bitem).ratio()
if r > maxMacherIndex:
maxMacherIndex = r
maxMacher = bitem
f.write(aitem.strip() + " <---> " + maxMacher.strip() + "\n")
maxMacherIndex = -1
#列が多い際、進捗(処理数)を表示する
count += 1
if count % 10 == 0:
sys.stdout.write("\r{}".format(count))
sys.stdout.flush()
f.close()
実行結果
result.txt
テスト <—> テスト
apple <—> applepie
天気が良い <—> 天気がよい
自動車 <—> 自転車
train <—> train
りんご <—> りんご
コメント