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



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

假设我有两个字符串s1和s2,我想在python中使用模糊匹配。我知道像fuzzywuzzy这样的python库可以做到这一点。但我想知道模糊匹配方法和比率计算背后的确切数学和逻辑。

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

模糊搜索通过使用数学公式来计算两个单词之间的距离(或相似性)。其中一种常用的方法被称为Levenstein距离

在这里你可以找到公式。

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

在这里你可以找到公式。

名称的模糊字符串匹配由一个字母后面跟着三个数字组成:字母是名称的第一个字母,数字编码其余的辅音。发音位置相似的辅音共用同一个数字,因此,例如,唇辅音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";而";鲁宾";收益率";R150"Ashcraft";以及";Ashcroft";两者都产生";A261"Tymczak";收益率";T522〃;而不是";T520〃;(名称中的字符"z"one_answers"k"被编码为2两次,因为元音位于它们之间)"Pfister";收益率";P236";而不是";P123";(前两个字母具有相同的数字并且被编码一次为"P");Honeyman"收益率";H555";。

您可以在此处找到详细信息:https://en.wikipedia.org/wiki/Soundex#:~:text=Soundex%20is%20a%20语音%20算法,尽管%20minor%20差异%20in%20拼写。

以上答案对两种常用的模糊字符串匹配算法——Levenstein距离算法和Soundex算法——进行了深入的解释。我将尝试解释余弦相似性在模糊字符串匹配中的使用。

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

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

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

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

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

步骤2)单词袋表示:

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

Name2_BOW=[1,1,1,0,1,1]

步骤3)计算余弦相似度:

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

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

最新更新