计算两个字符串相似度,它来了,后端集成多种算法

2020-08-17 09:27:02 +08:00
 guonaihong

strsim

strsim 是 golang 实现的字符串相识度库,后端集成多种算法,主要解决现有相似度库不能很好的处理中文

项目地址

https://github.com/antlabs/strsim

构架

功能

内容

比较两个字符串相识度

strsim.Compare("中国人", "中")
// -> 0.333333

从数组里找到相似度最高的字符串

strsim.FindBestMatchOne("海刘", []string{"白日依山尽", "黄河入海流", "欲穷千里目", "更上一层楼"})

选择不同算法

莱文斯坦-编辑距离(Levenshtein)

strsim.Compare("abc", "ab")
// -> 0.6666666666666667

选择 Dice's coefficient

strsim.Compare("abc", "ab", strsim.DiceCoefficient(1))
//-> 0.6666666666666666

选择 jaro

strsim.Compare("abc", "ab", strsim.Jaro())

选择 Hamming

strsim.Compare("abc", "ab", strsim.Hamming())
7220 次点击
所在节点    Go 编程语言
23 条回复
liukangxu
2020-08-17 09:58:24 +08:00
最后一个例子,两个不等长的字符串计算 Hamming distance ?
guonaihong
2020-08-17 10:04:17 +08:00
@liukangxu hamming 主要计算相等长度字符串。后面把例子修改下。
stone666
2020-08-17 10:44:11 +08:00
hutool 中有个相似的方法 StrUtil.similar(str1,str2); 看起来实现原理差不多
GM
2020-08-17 10:47:01 +08:00
选择的示例不好,看不出有什么特点和优势。主要是示例用的文本太短,随便弄个 strpos 也能算,没有对比优势。
guonaihong
2020-08-17 11:02:26 +08:00
@GM ok, 后面优化小示例。
zcfnc
2020-08-17 11:18:58 +08:00
如果是匹配的数组里面元素比较多,效率如何呢
Mohanson
2020-08-17 11:32:47 +08:00
刷题的时候写过 Levenshtein 算法,实现起来不难,20 行不到,很多用在命令行工具上,当你敲错了命令,就可以提示 command not found, did you mean "xxxxx xxxxx"
Mohanson
2020-08-17 11:35:00 +08:00
其实这种简单的算法我还是建议自己手写,维基百科上都有伪代码说明的
guonaihong
2020-08-17 11:39:35 +08:00
@zcfnc 会加上 benchmark,关注下就行。
guonaihong
2020-08-17 11:42:08 +08:00
@Mohanson wiki 上面的算法只是直译公式,工程上没有任何优化。太浪费空间。
blless
2020-08-17 11:43:50 +08:00
有拼音相似度算法吗
guonaihong
2020-08-17 11:46:50 +08:00
@blless 没关注过,可以到 github 上找找,我理解这种库,先用 mmseg 分词,然后决策出最佳读音,再根据国人的习惯,忽略后鼻音,前鼻音的。。。
woostundy
2020-08-17 13:42:37 +08:00
我以前做过类似的东西,中文相似度靠发音 + 按笔画拆解编码,看两个笔画编码的相似度。
cladg123
2020-08-17 14:40:30 +08:00
@woostundy 有相关的示例吗
woostundy
2020-08-17 14:48:01 +08:00
@cladg123 #14 在上上家公司做的反洗钱黑名单匹配算法。。没开源。
selca
2020-08-17 14:59:54 +08:00
@blless 记得百度还是哪家的语音识别里面给出过一个拼音相似度的算法实现,是基于上述的 Levenshtein 的一个实现,之前有参照这个写过一个东西,不过源码拿不回来了
njushannon
2020-08-17 15:00:51 +08:00
之前做过一套计算数据相似度的算法,不过是一套系统了
takemeaway
2020-08-17 15:02:59 +08:00
啥叫相似度? 就是这个字符串在那个字符串里面的占比???
superrichman
2020-08-17 16:49:59 +08:00
丟一堆论文查重试试 doge
xupefei
2020-08-17 17:09:13 +08:00
几个意见:
1. 编辑距离有更快的 Ukkonen 算法: https://github.com/sunesimonsen/ukkonen
2. best_result 在不同算法下有不同的解法。比如在编辑距离下,相似度最高的字符串可以用前缀数拿到: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/sigmod513.pdf

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698824

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX