在Python中模糊string比较,与哪个库混淆使用

我想做模糊的string比较,但与哪个库混淆使用。

选项1:

import Levenshtein Levenshtein.ratio('hello world', 'hello') Result: 0.625 

选项2:

 import difflib difflib.SequenceMatcher(None, 'hello world', 'hello').ratio() Result: 0.625 

在这个例子中,两者给出了相同的答案。 但我更喜欢使用difflib 。 任何专家的build议。 谢谢。

Updated:

我正在做临床消息正常化(拼写检查),在这个过程中,我检查每个给定的单词与900,000字医学词典。 我更关心时间复杂度/性能。

你认为在这种情况下两者performance相似吗?

  • difflib.SequenceMatcher使用Ratcliff / Obershelpalgorithm计算匹配字符的两倍数除以两个string中的字符总数。

  • Levenshtein使用Levenshteinalgorithm计算将一个string转换为另一个string所需的最less编辑次数

复杂

SequenceMatcher是最坏情况下的二次方时间,并且预期情况行为以复杂的方式依赖于序列有多less共同的元素。 ( 从这里 )

Levenshtein是O(m * n),其中n和m是两个inputstring的长度。

性能

根据Levenshtein模块的源代码 :Levenshtein与difflib(SequenceMatcher)有一些重叠。 它只支持string,而不是任意的序列types,但另一方面它更快。

如果你对Levenshtein和Difflib的相似度进行快速的视觉比较感兴趣,我计算了两百三十万的书名:

 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的相似性真的很有趣。