Go语言 字符串相似度为所有可能的组合在优化的方式

ee7vknir  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(124)

我在寻找字符串相似性时遇到了一个问题。
场景:由以下字段组成的字符串:first_name、middle_name和last_name
我要做的是找到A和B之间的字符串相似性(两者都有相同的字段),但要确保考虑到所有的可能性。
例1:假设字符串A的名字是:Rahul的中间名是:Kumar姓氏是:”
字符串B有名字:Kumar中间名:““姓氏:拉胡尔
通过观察我们可以说两个名字可能是一样的。但是目前的相似度算法给出了大约71%的相似度。
案例二:
假设字符串B有名字:Rahul中间名:““姓氏:K的。
在这种情况下,相似性%age福尔斯,但名称可能相同。
我应该怎么做的相似性,考虑到所有可能的组合的第一,中间和姓氏,并在一个优化的方式?
例如,Rahul Rakesh Kumar可以写成Rahul Kumar Rahul Rahul K。Kumar Rahul Kumar rakesh Rahul. Rahul R. Kumar等
我曾尝试使用Jaccard,余弦,Jaro-Wrinklr相似度算法,但结果并不令人满意。
注意:我必须根据名称查找重复数据消除,这就是为什么我必须考虑所有可能的名称。

ddarikpa

ddarikpa1#

对于这种字符串相似性,我最近实现了一种算法,它非常适合我的用例,这与您的用例非常相似。以下是博客文章:http://www.catalysoft.com/articles/strikeamatch.html
要比较两个字符串,请执行以下操作:

1. Make a list of overlapping letter-pairs. "kumar" gives us pairs: "ku", "um", "ma", "ar".
2. Say the second string is "maria". Pairs: "ma", "ar", "ri", "ia".
3. Count how many pairs are the same: "ma" and "ar".
4. The similarity is computed as: 2 * same_pairs / (pairs_1 + pairs_2) = 2*2/(4+4) = 0.5

字符串
这个算法的伟大之处在于它通过使用字母对来考虑字符串的排序,字母对是有序的。另一方面,它不考虑排序,因为所有对都可以以任何顺序混合。这使得它非常适合我的特定用例,类似于您的情况,我想将“abc def”视为与“def abc”完全匹配。
您也可以修改算法。我的部分用例是在较长的文本中搜索短字符串。为此,我将使用相似性度量same_pairs / pairs_1,搜索词中相同对的数量。如果文本中出现了一个单词,则无论搜索文本有多长,相似度都为1.0。在这种情况下,上述相似性将惩罚较长的文本。
关于执行的另一个说明。你可以让它变得非常高效和健壮。我首先把字母表简化为小写字母、数字和空格。26+10+1 = 37符号我把AMap到a,把äMap到a等等。可能的字母对的数量现在是37*37 = 1369。我计算配对的方法是使用数组pairCounts [37*37]byte,其中配对aaMap到0abMap到1等。所以如果我在字符串中找到对acacMap到索引2,所以我说pairCounts[2]++。每一对可以以这种方式出现256次(我使用byte)。
规范化字母使其不区分大小写,使用数组而不是完整的map使其运行速度非常快。

相关问题