Python中的高性能模糊字符串比较,使用Levenshtein或difflib

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()

我正在进行临床信息规范化(拼写检查),其中我根据900000字的医学词典检查每个给定的单词。我更关心时间复杂性/性能

我想做模糊字符串比较,但我不确定使用哪个库

备选案文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.SequenceMatcher使用算法计算匹配字符的两倍数除以两个字符串中的字符总数

  • Levenshtein使用它计算将一个字符串转换为另一个字符串所需的最小编辑次数

复杂性

SequenceMatcher是最坏情况下的二次时间,其预期情况行为以复杂的方式依赖于序列共有多少个元素。()

Levenshtein是O(m*n),其中n和m是两个输入字符串的长度

性能

根据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,感谢您的详细分析。我对这类情节不熟悉,不知道如何解读。这些情节叫什么,好让我查一查,了解一下?