如果您对 Levenshtein 和 Difflib 相似性的快速直观比较感兴趣,我计算了大约 230 万本书的标题:
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
然后我用 R 绘制了结果:
出于好奇,我还比较了 Difflib、Levenshtein、Sørensen 和 Jaccard 的相似度值:
library(ggplot2)
require(GGally)
difflib <- read.table("similarity_measures.txt", sep = " ")
colnames(difflib) <- c("difflib", "levenshtein", "sorensen", "jaccard")
ggpairs(difflib)
结果:
Difflib / Levenshtein 的相似性确实很有趣。
2018 年编辑:如果您正在努力识别相似的字符串,您还可以查看 minhashing——有一个 great overview here。 Minhashing 擅长在线性时间内发现大型文本集合中的相似性。我的实验室在此处组装了一个使用 minhashing 检测和可视化文本重用的应用程序:https://github.com/YaleDHLab/intertext