Falls Sie an einem schnellen visuellen Vergleich der Ähnlichkeit von Levenshtein und Difflib interessiert sind, habe ich beide für ~ 2,3 Millionen Buchtitel berechnet:
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
Ich habe dann die Ergebnisse mit R aufgezeichnet:
Streng für Neugierige habe ich auch die Ähnlichkeitswerte Difflib, Levenshtein, Sørensen und Jaccard verglichen:
library(ggplot2)
require(GGally)
difflib <- read.table("similarity_measures.txt", sep = " ")
colnames(difflib) <- c("difflib", "levenshtein", "sorensen", "jaccard")
ggpairs(difflib)
Ergebnis:
Die Difflib / Levenshtein-Ähnlichkeit ist wirklich sehr interessant.
Bearbeiten 2018: Wenn Sie daran arbeiten, ähnliche Zeichenfolgen zu identifizieren, können Sie auch Minhashing ausprobieren - hier finden Sie eine großartige Übersicht . Minhashing ist erstaunlich, wenn es darum geht, Ähnlichkeiten in großen Textsammlungen in linearer Zeit zu finden. Mein Labor hat hier eine App zusammengestellt, die die Wiederverwendung von Text mithilfe von Minhashing erkennt und visualisiert: https://github.com/YaleDHLab/intertext
difflib.SequenceMatcher verwendet den Ratcliff / Obershelp- Algorithmus und berechnet die doppelte Anzahl übereinstimmender Zeichen geteilt durch die Gesamtzahl der Zeichen in den beiden Zeichenfolgen.
Levenshtein verwendet den Levenshtein-Algorithmus , der die minimale Anzahl von Änderungen berechnet, die erforderlich sind, um eine Zeichenfolge in die andere umzuwandeln
Komplexität
SequenceMatcher ist die quadratische Zeit für den schlimmsten Fall und hat ein Verhalten im erwarteten Fall, das in komplizierter Weise davon abhängt, wie viele Elemente die Sequenzen gemeinsam haben. ( von hier )
Levenshtein ist O (m * n), wobei n und m die Länge der beiden Eingabezeichenfolgen sind.
Performance
Gemäß dem Quellcode des Levenshtein-Moduls: Levenshtein hat eine gewisse Überlappung mit Difflib (SequenceMatcher). Es werden nur Zeichenfolgen unterstützt, keine beliebigen Sequenztypen, andererseits ist es viel schneller.
quelle
I am doing clinical message normalization (spell check) in which I check each given word against 900,000 word medical dictionary. I am more concern about the time complexity/performance.
Glauben Sie, dass beide in diesem Fall gleich abschneiden?