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

标签 python string-matching levenshtein-distance difflib

我正在进行临床信息规范化(拼写检查),其中我将每个给定的单词与 900,000 个单词的医学词典进行核对。我更关心时间复杂度/性能。

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

选项 1:

import Levenshtein
Levenshtein.ratio('hello world', 'hello')

Result: 0.625

选项 2:

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

Result: 0.625

在这个例子中,两者都给出了相同的答案。您认为在这种情况下两者的表现是否相同?

最佳答案

如果您对 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 绘制了结果:

enter image description here

出于好奇,我还比较了 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)

结果: enter image description here

Difflib/Levenshtein 的相似性确实很有趣。

2018 年编辑:如果您正在努力识别相似的字符串,您还可以查看 minhashing——有一个 great overview here . Minhashing 擅长在线性时间内发现大型文本集合中的相似性。我的实验室在此处组装了一个应用程序,该应用程序使用 minhashing 检测和可视化文本重用:https://github.com/YaleDHLab/intertext

关于python - Python 中的高性能模糊字符串比较,使用 Levenshtein 或 difflib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6690739/

相关文章:

python - 使用 Python 实现单个消费者、多个生产者场景的最佳方法是什么?

r - SparkR:levenshtein 来自 2 个 Spark 数据帧的 2 个变量之间的模糊字符串匹配

ruby - ruby 中大型数组中的快速近似字符串匹配

java - Levenshtein 到 Damerau-Levenshtein

python - 如何使用 Opengl 在 pygame 中制作可调整大小的窗口

c# - C# 的 GIL 版本是什么?

java - 性能方面,Python VS JAVA 基于文件的处理

algorithm - 字符串匹配替代方法

完整和不完整(或短格式)字符串之间的字符串匹配

Excel MATCH 范围,没有特定的 CELL