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