En caso de que esté interesado en una comparación visual rápida de la similitud de Levenshtein y Difflib, calculé ambos para ~ 2.3 millones de títulos de libros:
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
Luego tracé los resultados con R:
Estrictamente para los curiosos, también comparé los valores de similitud de Difflib, Levenshtein, Sørensen y Jaccard:
library(ggplot2)
require(GGally)
difflib <- read.table("similarity_measures.txt", sep = " ")
colnames(difflib) <- c("difflib", "levenshtein", "sorensen", "jaccard")
ggpairs(difflib)
Resultado:
La similitud de Difflib / Levenshtein realmente es bastante interesante.
Edición de 2018: si está trabajando en la identificación de cadenas similares, también puede consultar minhashing: aquí hay una excelente descripción general . Minhashing es sorprendente para encontrar similitudes en grandes colecciones de texto en tiempo lineal. Mi laboratorio creó una aplicación que detecta y visualiza la reutilización de texto usando minhashing aquí: https://github.com/YaleDHLab/intertext