我在寻找字符串相似性时遇到了一个问题。
场景:由以下字段组成的字符串: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相似度算法,但结果并不令人满意。
注意:我必须根据名称查找重复数据消除,这就是为什么我必须考虑所有可能的名称。
1条答案
按热度按时间ddarikpa1#
对于这种字符串相似性,我最近实现了一种算法,它非常适合我的用例,这与您的用例非常相似。以下是博客文章:http://www.catalysoft.com/articles/strikeamatch.html
要比较两个字符串,请执行以下操作:
字符串
这个算法的伟大之处在于它通过使用字母对来考虑字符串的排序,字母对是有序的。另一方面,它不考虑排序,因为所有对都可以以任何顺序混合。这使得它非常适合我的特定用例,类似于您的情况,我想将“abc def”视为与“def abc”完全匹配。
您也可以修改算法。我的部分用例是在较长的文本中搜索短字符串。为此,我将使用相似性度量
same_pairs / pairs_1
,搜索词中相同对的数量。如果文本中出现了一个单词,则无论搜索文本有多长,相似度都为1.0。在这种情况下,上述相似性将惩罚较长的文本。关于执行的另一个说明。你可以让它变得非常高效和健壮。我首先把字母表简化为小写字母、数字和空格。
26+10+1 = 37
符号我把A
Map到a
,把ä
Map到a
等等。可能的字母对的数量现在是37*37 = 1369
。我计算配对的方法是使用数组pairCounts [37*37]byte
,其中配对aa
Map到0
,ab
Map到1
等。所以如果我在字符串中找到对ac
,ac
Map到索引2
,所以我说pairCounts[2]++
。每一对可以以这种方式出现256
次(我使用byte
)。规范化字母使其不区分大小写,使用数组而不是完整的
map
使其运行速度非常快。