Python中的高性能模糊字符串比较,使用Levenshtein或difflib
我正在进行临床信息规范化(拼写检查),其中我根据900000字的医学词典检查每个给定的单词。我更关心时间复杂性/性能 我想做模糊字符串比较,但我不确定使用哪个库 备选案文1:Python中的高性能模糊字符串比较,使用Levenshtein或difflib,python,string-matching,levenshtein-distance,difflib,Python,String Matching,Levenshtein Distance,Difflib,我正在进行临床信息规范化(拼写检查),其中我根据900000字的医学词典检查每个给定的单词。我更关心时间复杂性/性能 我想做模糊字符串比较,但我不确定使用哪个库 备选案文1: import Levenshtein Levenshtein.ratio('hello world', 'hello') Result: 0.625 备选案文2: import difflib difflib.SequenceMatcher(None, 'hello world', 'hello').ratio()
import Levenshtein
Levenshtein.ratio('hello world', 'hello')
Result: 0.625
备选案文2:
import difflib
difflib.SequenceMatcher(None, 'hello world', 'hello').ratio()
Result: 0.625
在这个例子中,两者给出了相同的答案。您认为在这种情况下,两者的表现是否相同?- difflib.SequenceMatcher使用算法计算匹配字符的两倍数除以两个字符串中的字符总数
- Levenshtein使用它计算将一个字符串转换为另一个字符串所需的最小编辑次数
Levenshtein与difflib(SequenceMatcher)有些重叠。它只支持字符串,不支持任意序列类型,但另一方面速度要快得多。如果您对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)
库(ggplot2)
需要(GGALY)
difflib非常感谢您提供的信息。我补充了更多细节。这里是:我正在做临床信息规范化(拼写检查),在这个过程中,我根据900000字的医学词典检查每个给定的单词。我更关心的是时间复杂度/性能。
在这种情况下,您认为两者的性能相似吗?这太酷了!那么你对此有何看法?Levenshtein是否对标题长度字符串不好?这真的取决于您试图在相似性度量中捕获什么…我认为difflib和Levenshtein之间的一些分歧可以解释为difflib使用的自动垃圾启发。如果禁用它会发生什么?这是个好问题。“自动垃圾过滤器”仅在观察次数大于200时生效,因此我不确定该特定数据集(书名)是否会受到重大影响,但值得调查…@duhaime,感谢您的详细分析。我对这类情节不熟悉,不知道如何解读。这些情节叫什么,好让我查一查,了解一下?