当前位置: 首页 > news >正文

【笔记】字符串相似度代码分享

目录

  • 一、算法介绍
    • 1、算法
      • 1)基于编辑距离
      • 2)基于标记
      • 3)基于序列
      • 4)基于压缩
      • 5)基于发音
      • 6)简单算法
    • 2、安装
  • 二、代码demo
    • 1、Hamming 距离
    • 2、Levenshtein 距离
    • 3、Damerau-Levenshtein距离
    • 4、Jaro 相似度
    • 5、Jaro-Winkler相似度
    • 6、Smith–Waterman相似度
    • 7、Jaccard 相似度
    • 8、Sørensen-Dice 相似度
    • 9、Tversky 相似度
    • 10、Overlap coefficient相似度
    • 11、Cosine similarity相似度
    • 12、N-gram相似度
    • 13、最长公共子字符串/子序列相似度
    • 14、Ratcliff-Obershelp相似度
  • 三、效果分析
    • 1、中文文本字符串
      • 1)效果最好排序
      • 2)速度最快排序
      • 3)综合排序
    • 2、其他
      • 1)基于压缩的应用场景
      • 2)基于发音的应用场景
      • 3)简单算法的应用场景

一、算法介绍

1、算法

1)基于编辑距离

算法函数
HammingHamminghamming
MLIPNSMlipnsmlipns
LevenshteinLevenshteinlevenshtein
Damerau-LevenshteinDamerauLevenshteindamerau_levenshtein
Jaro-WinklerJaroWinklerjaro_winkler, jaro
Strcmp95StrCmp95strcmp95
Needleman-WunschNeedlemanWunschneedleman_wunsch
GotohGotohgotoh
Smith-WatermanSmithWatermansmith_waterman

2)基于标记

算法函数
Jaccard indexJaccardjaccard
Sørensen–Dice coefficientSorensensorensen, sorensen_dice, dice
Tversky indexTverskytversky
Overlap coefficientOverlapoverlap
Tanimoto distanceTanimototanimoto
Cosine similarityCosinecosine
Monge-ElkanMongeElkanmonge_elkan
Bag distanceBagbag

3)基于序列

算法函数
最长公共子序列相似度LCSSeqlcsseq
最长公共子串相似度LCSStrlcsstr
Ratcliff-Obershelp 相似度RatcliffObershelpratcliff_obershelp

4)基于压缩

使用不同压缩算法的归一化压缩距离。

经典压缩算法:

算法函数
算术编码ArithNCDarith_ncd
RLERLENCDrle_ncd
BWT RLEBWTRLENCDbwtrle_ncd

常见压缩算法:

算法函数
平方根SqrtNCDsqrt_ncd
EntropyNCDentropy_ncd

正在开发的算法,将两个字符串比较为比特数组:

算法函数
BZ2BZ2NCDbz2_ncd
LZMALZMANCDlzma_ncd
ZLibZLIBNCDzlib_ncd

5)基于发音

算法函数
MRAMRAmra
EditexEditexeditex

6)简单算法

算法函数
前缀相似度Prefixprefix
后缀相似度Postfixpostfix
长度距离Lengthlength
身份相似度Identityidentity
矩阵相似度Matrixmatrix

2、安装

仅纯Python实现:

pip install textdistance

带有额外库以实现最大速度:

pip install "textdistance[extras]"

包含所有库(用于基准测试和测试):

pip install "textdistance[benchmark]"

带有特定算法的额外库:

pip install "textdistance[Hamming]"

提供额外库的算法有:DamerauLevenshteinHammingJaroJaroWinklerLevenshtein

二、代码demo

1、Hamming 距离

>> import textdistance as td
>> td.hamming('book', 'look')
1
>> td.hamming.normalized_similarity('book', 'look')
0.75
>> td.hamming('bellow', 'below')
3
>> td.hamming.normalized_similarity('Below', 'Bellow')
0.5

在第一个示例中,有一个不同的字符。这使得距离等于1,归一化相似度等于(4-1)/4 = 75%。在第二个示例中,比较“bellow”和“below”,前三个字母相同,但接下来的三个字母不同。因此,距离是3,归一化相似度是(6-3)/6 = 50%。

2、Levenshtein 距离

>> td.levenshtein('book', 'look')
1
>> td.levenshtein.normalized_similarity('book', 'look')
0.75
>> td.levenshtein('bellow', 'below')
1
>> td.levenshtein.normalized_similarity('Below', 'Bellow')
0.84

在第一个示例中,可以通过替换一个字母来得到另一个单词,因此归一化相似度是(4-1)/4 = 75%。在第二个示例中,有一个插入操作,因此距离是1,归一化相似度是(6-1)/6 = 84%。

3、Damerau-Levenshtein距离

>> td.levenshtein('act', 'cat')
2
>> td.levenshtein.normalized_similarity('act', 'cat')
0.34
>> td.damerau_levenshtein('act', 'cat')
1
>> td.damerau_levenshtein.normalized_similarity('act', 'cat')
0.67

Damerau-Levenshtein距离是Levenshtein 距离的一个变种,应用广泛,如拼写检查和序列分析

4、Jaro 相似度

>> td.jaro('bellow', 'below')
0.94
>> td.jaro('simple', 'plesim')
0
>> td.jaro('jaro', 'ajro')
0.92

在第一个示例中,有5个匹配字符和一个插入(这不是置换操作),因此Jaro 相似度为1/3*(5/6+5/5+6/6)。在第二个示例中,有0个匹配字符,因为共同字符不在max(|s1|, |s2|)/2-1的范围内。这就是为什么相似度为0的原因。在最后一个示例中,有4个匹配字符和第一和第二字母之间的1个置换操作,因此相似度为1/3 * (4/4+4/4+3/4) = 0.91。

5、Jaro-Winkler相似度

>> td.jaro("simple", "since")
0.7
>> t.jaro_winkler("simple", "since")
0.76

由于两个字符串有两个共同的前缀字母。Jaro-Winkler相似度大于Jaro相似度:0.7 + 0.12(1–0.7) = 0.7 + 0.06 = 0.76。

6、Smith–Waterman相似度

>> td.smith_waterman("GATTACA", "GCATGCU")
3
>> td.smith_waterman("GATTACA", "GCATGCU")
0.43

Smith–Waterman算法在生物信息学中特别有用,用于识别生物序列中的相似区域或基序

7、Jaccard 相似度

>> td.jaccard('jaccard similarity'.split(), "similarity jaccard".split())
1
>> td.jaccard('jaccard similarity'.split(), "similarity jaccard jaccard".split())
0.66

类似交并比(Intersection of Union,IoU),对比时并不考虑字符串单词的顺序

8、Sørensen-Dice 相似度

>> td.sorencen('jaccard similarity'.split(), "similarity jaccard".split())
1
>> td.sorencen('jaccard similarity'.split(), "similarity jaccard jaccard".split())
0.8

与前者相比,不考虑重复元素

9、Tversky 相似度

>> td.sorencen('tversky similarity'.split(), "similarity tversky tversky".split())
0.8
>> tversky = td.Tversky(ks=(0.5, 0.5))
>> tversky('tversky similarity'.split(), "similarity tversky tversky".split())
0.8
>> td.jaccard('tversky similarity'.split(), "similarity tversky tversky".split())
0.67
>> tversky = td.Tversky(ks=(1, 1))
>> tversky('tversky similarity'.split(), "similarity tversky tversky".split())
0.67
>> tversky = td.Tversky(ks=(0.2, 0.8))
>> tversky('tversky similarity'.split(), "similarity tversky tversky".split())
0.74

10、Overlap coefficient相似度

>> td.overlap('overlap similarity'.split(), "similarity overlap overlap".split())
1.0

计算集合交集大小与较小集合大小的比例

11、Cosine similarity相似度

>> td.cosine('cosine'.split(), "similarity".split())
0
>> td.cosine('cosine sim'.split(), "cosine sim sim".split())
0.81

12、N-gram相似度

N-gram 相似度是一种基于字符串中连续N个字符的相似度度量方法。它通过将字符串拆分为N-gram(N个连续字符的子串),然后比较这些N-gram的集合来计算两个字符串之间的相似度。下面是用 Python 实现 N-gram 相似度的代码示例:

def ngrams(string, n):"""将字符串拆分为N-gram"""return [string[i:i+n] for i in range(len(string)-n+1)]def ngram_similarity(str1, str2, n):"""计算两个字符串的N-gram相似度"""ngrams1 = set(ngrams(str1, n))ngrams2 = set(ngrams(str2, n))intersection = ngrams1.intersection(ngrams2)union = ngrams1.union(ngrams2)return len(intersection) / len(union) if union else 0.0# 示例
str1 = "hello"
str2 = "hallo"
n = 2similarity = ngram_similarity(str1, str2, n)
print(f"{n}-gram 相似度: {similarity:.2f}")
# 2-gram 相似度: 0.33

13、最长公共子字符串/子序列相似度

>> s1, s2 = "RO PATTERN MATCHING", "RO PRACTICE"
>> td.lcsstr(s1, s2), td.lcsseq(s2, s1), td.lcsseq(s2, s1)('RO P', 'RO PRATC', 'RO PRACI')
>> td.lcsstr.normalized_similarity(s1, s2), td.lcsseq.normalized_similarity(s1, s2)(0.21, 0.42)

最长公共子字符串专注于找出两个字符串之间的最长公共子字符串,它通过识别两个字符串共享的最长连续字符序列来衡量字符串之间的相似度
子序列不要求在原始序列中占据连续位置。因此,最长公共子序列总是大于最长公共子字符串

14、Ratcliff-Obershelp相似度

>> s1, s2 = "RO PATTERN MATCHING", "RO PRACTICE"
>> td.ratcliff_obershelp(s1, s2), td.ratcliff_obershelp(s2, s1), len(s1), len(s2)
(0.46, 0.53, 19, 11)

三、效果分析

1、中文文本字符串

在对中文文本字符串进行相似度比较时,效果和速度各有不同的算法可供选择。以下是根据效果最好和速度最快分别排序的算法:

1)效果最好排序

  1. Levenshtein:计算编辑距离,考虑到中文字符的插入、删除和替换,效果较好。
  2. Damerau-Levenshtein:比Levenshtein更进一步,考虑到字符的交换,能更准确地反映一些错别字的相似性。
  3. Jaro-Winkler:考虑字符的匹配和位移,对拼音和形近字有较好的识别效果。
  4. Needleman-Wunsch:常用于序列比对,适合处理长文本,但速度较慢。
  5. Smith-Waterman:和Needleman-Wunsch类似,但更精细,适合局部相似性比对。
  6. Cosine similarity:基于向量空间模型,适合处理词语或短句相似度,但需要预处理成向量表示。
  7. Jaccard index:基于集合的相似度计算,适合分词后的文本比较。

2)速度最快排序

  1. Hamming:适合固定长度的字符串比较,速度极快,但只能比较长度相同的字符串。
  2. Jaccard index:基于集合操作,速度较快,尤其是在分词后的文本上。
  3. Cosine similarity:向量化处理后计算余弦相似度,速度较快,但依赖预处理。
  4. Jaro-Winkler:速度相对较快,适合短文本比较。
  5. Levenshtein:虽然是动态规划算法,但优化后速度也较快,适合中短文本比较。
  6. Damerau-Levenshtein:考虑交换操作,稍慢于Levenshtein,但仍然较快。
  7. Smith-Waterman:局部比对,速度较慢,适合较短文本。
  8. Needleman-Wunsch:全局比对,速度慢,适合处理长文本。

3)综合排序

结合效果和速度,以下是综合排序:

  1. Levenshtein:综合效果和速度,适合大多数情况。
  2. Damerau-Levenshtein:效果好于Levenshtein,速度稍慢,但仍然适用。
  3. Jaro-Winkler:适合拼音和形近字,速度较快。
  4. Cosine similarity:需要预处理,但在向量化后速度较快,效果也不错。
  5. Jaccard index:适合分词后的文本比较,速度快。
  6. Needleman-Wunsch:适合长文本,效果好但速度慢。
  7. Smith-Waterman:适合局部相似性比较,效果好但速度最慢。

选择具体算法时,可以根据文本的长度、预处理的复杂度以及对效果的要求来综合考虑。
英文文本也适用

2、其他

1)基于压缩的应用场景

基于压缩的算法主要用于处理和比较大规模或复杂的数据集,因为它们能够有效地压缩和分析数据。这些算法常用于以下场景:

  1. 大数据分析:在需要处理和比较大量文本数据的场景中,如日志文件、网络爬虫数据等。
  2. 数据压缩和传输:在需要高效压缩和传输数据的应用中,这些算法可以用于优化数据存储和传输效率。
  3. 文本和字符串匹配:用于需要在大文本库中查找相似文本或字符串的场景。

2)基于发音的应用场景

基于发音的算法主要用于处理语音和文本的相似性计算,这在以下场景中尤为有用:

  1. 语音识别和处理:在语音识别系统中,用于比较和识别发音相似的词汇。
  2. 拼写纠正:在文本输入系统中,根据发音相似性来纠正拼写错误。
  3. 名称匹配:用于比较和匹配发音相似的人名、地名等,如客户关系管理系统中匹配相似的客户名字。

3)简单算法的应用场景

简单算法通常用于需要快速、直接比较的场景,这些场景不需要复杂的计算或大量数据处理:

  1. 前缀和后缀匹配:用于文件名或路径的匹配和分类,如查找特定前缀或后缀的文件。
  2. 长度比较:用于需要比较字符串长度的场景,如数据验证和清理。
  3. 身份相似度:用于简单的字符串相等性比较,如用户输入的验证码验证。
  4. 矩阵相似度:用于矩阵数据的比较,如图像处理中的像素矩阵比较。

相关文章:

【笔记】字符串相似度代码分享

目录 一、算法介绍1、算法1)基于编辑距离2)基于标记3)基于序列4)基于压缩5)基于发音6)简单算法 2、安装 二、代码demo1、Hamming 距离2、Levenshtein 距离3、Damerau-Levenshtein距离4、Jaro 相似度5、Jaro…...

AI墓地:738个倒闭AI项目的启示

近年来,人工智能技术迅猛发展,然而,不少AI项目却在市场上悄然消失。根据AI工具聚合网站“DANG”的统计,截至2024年6月,共有738个AI项目停运或停止维护。本文将探讨这些AI项目失败的原因,并分析当前AI初创企…...

工程文件参考——CubeMX+LL库+SPI主机 阻塞式通用库

文章目录 前言CubeMX配置SPI驱动实现spi_driver.hspi_driver.c 额外的接口补充 前言 SPI,想了很久没想明白其DMA或者IT比较好用的方法,可能之后也会写一个 我个人使用场景大数据流不多,如果是大批量数据交互自然是DMA更好用,但考…...

LLM - 模型历史

...

Go语言中的时间与日期处理:time包详解

在Go语言中,time包提供了丰富而强大的功能来处理时间和日期,这对于构建精确计时、定时任务、日期格式化等应用场景至关重要。本文将深入浅出地探讨time包的核心概念、常见问题、易错点及其规避策略,并通过实用代码示例加深理解。 一、时间与…...

Java实现单点登录(SSO)详解:从理论到实践

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…...

【leetcode82-91动态规划,91-95多维动态规划】

动态规划【82-91】 多维动态规划【91-95】...

Django学习第四天

启动项目命令 python manage.py runserver 分页功能封装到类中去 封装的类的代码 """ 自定义的分页组件,以后如果想要使用这个分页组件,你需要做: def pretty_list(request):# 靓号列表data_dict {}search_data request.GET.get(q, &…...

redis-benchmark 使用

Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求。 Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>]-h <hostname> Server hostname (default 127.0…...

什么是 qobject_cast?

前言 在 C++ 中,类型转换是一项常见的操作,比如将 int 转换为 char 或将 QString 用于 QMessageBox。但是,为什么我们需要将一个类转换为另一个类呢?本文将解释 qobject_cast 是什么,它的作用以及为什么需要类型转换。 dynamic_cast 和 qobject_cast 的概述 什么是 dyn…...

Python酷库之旅-第三方库Pandas(001)

目录 一、Pandas库的由来 1、背景与起源 1-1、开发背景 1-2、起源时间 2、名称由来 3、发展历程 4、功能与特点 4-1、数据结构 4-2、数据处理能力 5、影响与地位 5-1、数据分析“三剑客”之一 5-2、社区支持 二、Pandas库的应用场景 1、数据分析 2、数据清洗 3…...

Firefox 编译指南2024 Windows10篇- 编译Firefox(三)

1.引言 在成功获取了Firefox源码之后&#xff0c;下一步就是将这些源码编译成一个可执行的浏览器。编译是开发流程中的关键环节&#xff0c;通过编译&#xff0c;我们可以将源代码转换为可执行的程序&#xff0c;测试其功能&#xff0c;并进行必要的优化和调试。 对于像Firef…...

CSS弹性布局:打造响应式与灵活的网页设计

一、弹性布局是什么&#xff1f; 弹性布局&#xff08;Flexbox&#xff09;是一种CSS布局模型&#xff0c;它提供了一种更加高效的方式来对容器中的项目进行布局、对齐和分配空间。与传统的布局方式相比&#xff0c;Flexbox旨在提供一个更加灵活的方式来布局复杂的网页结构&am…...

【高阶数据结构】图的应用--最短路径算法

文章目录 一、最短路径二、单源最短路径--Dijkstra算法三、单源最短路径--Bellman-Ford算法四、多源最短路径--Floyd-Warshall算法 一、最短路径 最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点的最短路径&#xff0c;最短也就是沿…...

腾讯云函数node.js返回自动带反斜杠

云函数返回自动带反斜杠 这里建立了如下一个云函数,目的是当APP过来请求的时候响应支持的版本号: use strict; function main_ret(status,code){let ret {status: status,error: code};return JSON.stringify(ret); } exports.main_handler async (event, context) > {/…...

大模型知识学习

大模型训练过程 数据清洗 拟人化描述&#xff1a;知识库整理 预训练 拟人化描述&#xff1a;知识学习可以使用基于BERT预训练模型进行训练 指令微调 拟人化描述&#xff1a;实际工作技能学习实际操作&#xff1a;让大模型模仿具体的输入输出进行拟合&#xff0c;即模仿学…...

JAVA声明数组

一、声明并初始化数组 直接初始化&#xff1a;在声明数组的同时为其分配空间并初始化元素。 int[] numbers {1, 2, 3, 4, 5}; 动态初始化&#xff1a;先声明数组&#xff0c;再为每个元素分配初始值。 double[] decimals;decimals new double[5]; // 分配空间&#xff0c;但…...

VBA通过Range对象实现Excel的数据写入

前言 本节会介绍通过VBA中的Range对象&#xff0c;来实现Excel表格中的单元格写入、区域范围写入&#xff0c;当然也可以写入不同类型的数据&#xff0c;如数值、文本、公式&#xff0c;以及实现公式下拉自动填充的功能。 一、单元格输入数据 1.通过Value方法实现输入不同类型…...

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后&#xff0c;在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…...

算法体系-25 第二十五节:窗口内最大值或最小值的更新结构

一 滑动窗口设计知识点 滑动窗口是什么&#xff1f; 滑动窗口是一种想象出来的数据结构&#xff1a; 滑动窗口有左边界L和有边界R 在数组或者字符串或者一个序列上&#xff0c;记为S&#xff0c;窗口就是S[L..R]这一部分 L往右滑意味着一个样本出了窗口&#xff0c;R往右滑意味…...

安装lsaac lab

在 Ubuntu 22.04 环境下&#xff0c;使用 Conda 管理 Isaac Lab 是最稳妥的方案&#xff0c;因为它可以完美隔离 Isaac Sim 所需的特定 Python 版本环境。以下是基于 Conda 的保姆级安装步骤&#xff1a;第一步&#xff1a;创建 Conda 环境Isaac Sim 4.x 需要 Python 3.10&…...

3月31日(AI审批+技术岗位情况+知识获取方法)

如何用 AI 分类器替代人工审批 Claude 每执行一个命令、每改一个文件&#xff0c;都要你点一次“同意”。用户 93% 的操作都会批准。也就是说&#xff0c;这个“安全审批”环节&#xff0c;绝大多数时候只是一个条件反射。 告警疲劳&#xff1a;100 条告警里只有 7 条需要关注…...

Android 应用间文件共享:FileProvider 配置与实战解析

1. 为什么需要FileProvider&#xff1f; 在Android开发中&#xff0c;每个应用都有自己的私有存储空间&#xff0c;这些目录默认是其他应用无法访问的。这种设计保证了应用数据的安全性&#xff0c;但同时也带来了一个问题&#xff1a;当我们需要与其他应用共享文件时该怎么办&…...

一套万能的异步处理方案!(珍藏版)

前言 良好的系统设计必须要做到开闭原则&#xff0c;随着业务的不断迭代更新&#xff0c;核心代码也会被不断改动&#xff0c;出错的概率也会大大增加。但是大部分增加的功能都是在扩展原有的功能&#xff0c;既要保证性能又要保证质量&#xff0c;我们往往都会使用异步线程池…...

Wan2.2-T2V-A5B常见错误排查:运行失败、生成卡顿的解决方法

Wan2.2-T2V-A5B常见错误排查&#xff1a;运行失败、生成卡顿的解决方法 1. 问题概述与快速诊断 Wan2.2-T2V-A5B作为一款轻量级文本到视频生成模型&#xff0c;虽然在资源消耗和响应速度上具有优势&#xff0c;但在实际使用过程中仍可能遇到运行失败或生成卡顿的问题。这些问题…...

良久团购报单查单小程序开发

需求分析与规划 明确小程序的核心功能&#xff1a;报单&#xff08;提交订单&#xff09;、查单&#xff08;查询订单状态&#xff09;、团购管理&#xff08;商品展示、拼团进度&#xff09;。 确定用户角色&#xff1a;普通用户&#xff08;参与团购&#xff09;、管理员&…...

Umi-OCR终极指南:3分钟掌握免费离线OCR文字识别

Umi-OCR终极指南&#xff1a;3分钟掌握免费离线OCR文字识别 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库。 …...

Windows更新修复完全指南:从诊断到解决的系统更新问题处理方案

Windows更新修复完全指南&#xff1a;从诊断到解决的系统更新问题处理方案 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool Win…...

Czkawka:智能存储管理的5个核心解决方案

Czkawka&#xff1a;智能存储管理的5个核心解决方案 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 1.0 现象剖析&#xff1a;数字存储管理的现实困…...

vLLM-v0.17.1部署实战教程:3步启用OpenAI兼容API服务

vLLM-v0.17.1部署实战教程&#xff1a;3步启用OpenAI兼容API服务 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;以其出色的速度和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff0c;现在已经发展成为一…...