概要
difflib
モジュールのSequenceMatcher
クラスというツールを使って、類似度計算を行いました。
このクラスは、テキスト処理に関連する多くの処理を行うことができます。
サンプルコード
以下のサンプルコードは、2つの文字列の類似度を計算し、特定の比率を超える場合に "重複発見!"
というメッセージを表示するものです。
from difflib import SequenceMatcher
phrase1 = "あいうえおかきくけこ"
phrase2 = "あいうえお"
def similar(a, b):
match_ratio = SequenceMatcher(None, a, b).ratio()
print(match_ratio)
return match_ratio
def check_for_duplicate(ratio):
if similar(phrase1, phrase2) > ratio:
print("重複発見!")
ratio = 0.6
check_for_duplicate(ratio)
## 出力結果 ##
# 0.6666666666666666
# 重複発見!
最初ちょっと「?」となったことがあります。
上記のひらがなのように10文字中5文字が同じであれば、同じ文字は50%なので、ratio
が0.6
の場合は重複発見!
が表示されないのかなと思いました。しかし、実際の公式は以下の公式ドキュメントに記載してあります。
6.3. difflib --- 差分の計算を助ける — Python 3.5.10 ドキュメント
T が2つのシーケンスの要素数の総計だと仮定し、M をマッチした数とすると、この値は 2.0*M / T であらわされます。もしシーケンスがまったく同じ場合、値は 1.0 となり、まったく異なる場合には 0.0 となります。
上記の例で言うと、Mは5
であり、Tは15
になります。つまり、以下の計算が行われていたのです。
2 * 5 / 15 = 0.6666666666666666...
言われてみればそれはそうか、と思いました...。