我在查找字符串相似度时遇到了一个问题.

场景:由以下字段组成的字符串 名字、中间名和姓氏

我要做的是找到A和B之间的字符串相似性(两者都有相同的字段),但确保考虑到所有的可能性.

case 1: 假设字符串A的名字是:Rahul 中间名是:库马尔 姓氏是:""

字符串B的名字是:库马尔 中间名:"" 姓氏:拉胡尔

通过观察,我们可以说这两个名字可能是相同的.但目前的相似度算法给出的相似度约为71%.

case 2:

比方说,字符串B的名字是:Rahul 中间名:"" 姓氏:K.

在本例中,相似度%age下降,但名称可能相同.

考虑到名字、中间名和姓氏的所有可能组合,并以一种优化的方式,我应该如何处理相似性?

E.g Rahul Rakesh Kumar可以像 拉胡尔·库马尔 拉胡尔 拉胡尔·K. 库马尔·拉胡尔 库马尔·拉杰什·拉胡尔. 拉胡尔·R·库马尔什么的.

我曾try 使用Jaccard、CoSine、Jaro-Wrinklr相似性算法,但结果并不令人满意.

注意:我必须根据名称找到重复数据删除,这就是为什么我必须考虑所有可能的名称.

推荐答案

对于这种字符串相似性,我最近实现了一个非常适合我的用例的算法,它与您的用例非常相似.这是一篇博文: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个符号.我将A映射到a,ä映射到a等等.可能的字母对的数量现在是37*37 = 1369.我计算对的方法是使用数组pairCounts [37*37]byte,其中对aa映射到0,ab映射到1,等等.所以如果我在字符串中找到对ac,ac映射到索引2,所以我说pairCounts[2]++.每一对都可以以这种方式出现256次(我使用byte次).

将字母归一化使其不区分大小写,使用数组而不是完全的map使其运行得非常快.

Go相关问答推荐

语法-for循环中的initit陈述是否允许分配?

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

如何在Golang中获取mp3文件的持续时间?

在Golang中Mergesort的递归/并行实现中出现死锁

如何执行asn 1 marshal/unmarshal和omit字段?

如何配置vscode以在Go中显示不必要的(过度指定的)泛型?

显示GUI时后台处理功能

我们如何保证取消的上下文会导致 goroutine 终止?

Yocto 无法交叉编译 GoLang Wails 应用程序

从 eBPF LRU 哈希映射中错误驱逐的元素

golang 上基于标头的版本控制

为超时的单元测试创​​建 deadlineExceededError:true

Go cmp - 如何为以 struct 为键的映射定义自定义相等性?

仅在工作日运行 cron

Gorm 在保存/创建时序列化 struct

使用 delve 在容器中调试 Golang:container_linux.go:380:启动容器进程导致:exec:/dlv:stat /dlv:没有这样的文件或目录

如何在循环中旋转图像以便在 golang 中创建 GIF?

即使没有竞争条件也没有得到任何输出

Golang 泛型同时具有接口和实现

Golang 与 Cassandra db 使用 docker-compose:cannot connect (gocql)