微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何计算模糊字符串匹配中的分数?

如何解决如何计算模糊字符串匹配中的分数?

我想知道计算两个字符串之间的模糊匹配分数背后的数学逻辑和公式。

比方说,我有两个字符串s1和s2,我想在python中使用模糊匹配。我知道事实,像fuzzywuzzy这样的python库可以解决这个问题。但是我想知道模糊匹配方法和比率计算背后的确切数学和逻辑。

解决方法

与名称匹配的模糊字符串由一个字母和三个数字组成:该字母是名称的第一个字母,而数字则编码其余的辅音。处于相似发音位置的辅音共享相同的数字,例如,阴唇辅音B,F,P和V各自被编码为数字1。

正确的值可以找到如下:

保留名称的第一个字母,并删除所有其他出现的a,e,i,o,u,y,h,w。 如下将辅音替换为数字(在第一个字母之后):

b,f,p,v→1

c,g,j,k,q,s,x,z→2

d,t→3

l→4

m,n→5

r→6

如果原始名称中相邻两个或两个以上具有相同编号的字母(在步骤1之前),则仅保留第一个字母;同样,用“ h”或“ w”分隔的相同数字的两个字母也被编码为一个数字,而用元音分隔的此类字母被编码两次。此规则也适用于首字母。 如果单词中的字母太少而不能分配三个数字,请在后面附加零,直到三个数字为止。如果您有四个或更多数字,请仅保留前三个。

使用此算法,“ Robert”和“ Rupert”都返回相同的字符串“ R163”,而“ Rubin”产生“ R150”。 “ Ashcraft”和“ Ashcroft”都产生“ A261”。 “ Tymczak”产生的是“ T522”而不是“ T520”(名称中的字符“ z”和“ k”两次被编码为2,因为它们之间有一个元音)。 “ Pfister”产生的是“ P236”而不是“ P123”(前两个字母具有相同的数字,并且一次编码为“ P”),“ Honeyman”产生的是“ H555”。

您可以在这里找到详细信息: https://en.wikipedia.org/wiki/Soundex#:~:text=Soundex%20is%20a%20phonetic%20algorithm,despite%20minor%20differences%20in%20spelling

,

模糊字符串匹配,也称为近似字符串匹配,是查找与给定模式近似匹配的字符串的过程。 匹配的紧密程度通常是根据编辑距离来衡量的,编辑距离是将字符串转换为精确匹配所必需的基本操作数。 基本操作通常是:插入(在给定位置插入新字符),删除(以删除特定字符)和替换(用新字符替换字符)。

模糊搜索通过使用计算两个单词之间的距离(或相似度)的数学公式来工作。这样的一种常用方法称为Levenshtein distance

Here,您可以找到公式。

Levenshtein距离的替代方法是使用余弦相似度。 余弦距离的真正优势在于您可以执行降维。这使您可以有效且模糊地处理非常大的文档。它还允许您创建有效的数据结构以查找相似的字符串等等。

Here,您可以找到公式。

,

以上回答对模糊字符串匹配常用的两种算法即Levenshtein距离和Soundex算法进行了深入讲解。我将尝试解释 Cosine Similarity 在模糊字符串匹配中的使用。

两个非零向量之间的余弦相似度只是这些向量之间夹角的余弦。核心思想是找到每个字符串对应的向量表示。这可以通过使用词袋特征提取器或 TF-IDF 特征提取器来完成。字符串之间的相似度与余弦相似度指标成正比。

例如:考虑以下名称: Name1 : athaarv 姓名2:atharv

步骤 1)这些字符串的 2gram 表示是

Name1_2gram = ["at","th","ha","aa","ar","rv"]

Name2_2gram = ["at","rv"]

Step2) 词袋表示:

Name1_BOW = [1,1,1]

Name2_BOW = [1,1]

Step3) 计算余弦相似度:

余弦相似度 = ([1 1 1 1 1 1].[1 1 1 0 1 1])/(sqrt(5)*sqrt(6)) = 0.91

注意:使用 TF-IDF 的字符串表示通常比 BOW 更好。此外,在 Nanonets 博客上有一些关于这个特定主题的资源,可能会有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。