【python】difflib.SequenceMatcherを使って文字列の類似度を計算する

pyhton

 文字の類似度を計算するするのは自分で実装するのはなかなか難しい。
 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
りんご <—> りんご

コメント

タイトルとURLをコピーしました