繁体   English   中英

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

[英]How to calculate score in fuzzy string matching?

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

假设我有两个字符串 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

升 → 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 ,尽管% 20minor%20differences%20in%20spelling

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

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

在这里你可以找到公式。

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

在这里你可以找到公式。

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

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

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

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

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

Name2_2gram = ["at","th","ha","ar","rv"]

Step2) Bag of Words 表示:

Name1_BOW = [1,1,1,1,1,1]

Name2_BOW = [1,1,1,0,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 博客有一些关于这个特定主题的资源,可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM