Nel caso in cui ti interessi un rapido confronto visivo della somiglianza tra Levenshtein e Difflib, ho calcolato entrambi per ~ 2,3 milioni di titoli di libri:
import codecs, difflib, Levenshtein, distance
with codecs.open("titles.tsv","r","utf-8") as f:
title_list = f.read().split("\n")[:-1]
for row in title_list:
sr = row.lower().split("\t")
diffl = difflib.SequenceMatcher(None, sr[3], sr[4]).ratio()
lev = Levenshtein.ratio(sr[3], sr[4])
sor = 1 - distance.sorensen(sr[3], sr[4])
jac = 1 - distance.jaccard(sr[3], sr[4])
print diffl, lev, sor, jac
Ho quindi tracciato i risultati con R:
Rigorosamente per i curiosi, ho anche confrontato i valori di somiglianza Difflib, Levenshtein, Sørensen e Jaccard:
library(ggplot2)
require(GGally)
difflib <- read.table("similarity_measures.txt", sep = " ")
colnames(difflib) <- c("difflib", "levenshtein", "sorensen", "jaccard")
ggpairs(difflib)
Risultato:
La somiglianza con Difflib / Levenshtein è davvero piuttosto interessante.
Modifica del 2018: se stai lavorando per identificare stringhe simili, puoi anche dare un'occhiata al minhashing: qui c'è un'ottima panoramica . Il minhashing è sorprendente nel trovare somiglianze in grandi raccolte di testi in tempo lineare. Il mio laboratorio ha messo insieme un'app che rileva e visualizza il riutilizzo del testo usando minhashing qui: https://github.com/YaleDHLab/intertext