相关代码已经上传GitHub : https://github.com/EricLi404/go-utils
0x00 概述
在做在做反垃圾账号业务的时候,检测发现有几十名用户都在某个IP上有过行为打点。
# 原始数据
꧁❥?➦SAMI?MMS➣?❥꧂
꧁❥?➦Ⓜ️AHI?MMS➣?❥꧂..
jgcch7b?V?O?I?
2kc7fd7?V?O?I?
꧁❥?➦VIDYA?MMS➣?❥꧂
RcR?Raden??F
RcR?Raden?B
꧁❥?➦RESMA?MMS➣?❥꧂
Sanny8_star197
꧁❥?PARI?MMS➣?❥꧂
❁════❃MAHAKAL❃══7══❁
꧁❥?BIPASHA?MMS➣?❥꧂
.꧁❥?ISRAT?MMS?꧂
ek8660?V?O?I?
a8h9163?V?O?I?
꧁❥?➦NIRA?➣?❥꧂
꧁❥?PARINEETI?MMS?꧂
RcR?Raden?J
dem3ba2?V?O?I?
ggk5b27?V?O?I?
?RcR?Raden??
可以很明显的感知到其中部分账号存在一定的相似性,现需要将这几十名用户按相似性分为若干组,因此提出了一种基莱文斯坦距离和并查集结构的算法,来实现将一组字符串按相似度提取出若干不重复组的功能。
0x01 理论基础
莱文斯坦距离
Wikipedia:
莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
- sitten (k→s)
- sittin (e→i)
- sitting (→g)
则两者之间莱文斯坦距离为3.
俄罗斯科学家弗拉基米尔·莱文斯坦在1965年提出这个概念。其用途主要有 DNA分析、拼写检查、语音辨识、抄袭侦测 。
并查集