求一个可行方案:计算新用户和老用户通讯录的最高匹配度

2018-10-29 12:13:42 +08:00
 iblislsy

需求: 对于每一个新用户,希望能计算出和老用户的通讯录最高匹配度,找到类似伪造通讯录的情况。

例子: 每一个用户的通讯录表结构如下

user_id phone

123 18721212111

123 18721212112

123 18721212113

124 18721212111

124 18721212112

124 18721212115

124 18721212116

假设 user_id:123 是一个新用户,可以发现用户 123 和用户 124 存有相同的联系人

用户 123 和 124 的匹配度为: 相同号码数量 /新用户的号码数量 = 2/3 = 0.67

需要遍历找到匹配度最高的用户,或者是大于某一阈值的用户群体。

各位大佬,这个复杂度似乎有点高,有没有可行的方案。

4978 次点击
所在节点    程序员
51 条回复
iblislsy
2018-10-29 13:26:09 +08:00
@semut 看了一下 simhash ,LSH ,好像都是针对文本类的(可以分词)的数据? 像手机号码这样的 应该怎么办
iblislsy
2018-10-29 13:26:28 +08:00
看了一下 simhash ,LSH ,好像都是针对文本类的(可以分词)的数据? 像手机号码这样的 应该怎么办
@luckychenhaha
owenliang
2018-10-29 13:37:59 +08:00
我有一个方案,楼主看一下是否可行。(用 Elasticsearch,没什么神奇的东西)

核心思路:new user 有 100 个号码,找一个 old user 与 new user 的 phone 交集最大。

过程:
1,把 user phone 的关系一条一条的存到 ES 里。
2,给定一个 new user,它的 phone list 有 100 条,那么去 ES 里做 terms query 召回关联任意 phone 的记录。
3,召回的 user phone 记录的 phone 一定在 100 条内,所以接着做 agg 聚合统计每个 user 的出现次数,保留 size=10 就是相同号码最多的 10 个用户了。
guyskk0x0
2018-10-29 14:05:27 +08:00
@owenliang 你提醒了我,也可以用 redis 实现:
以 phone 为键,user_id 集合为值,数据全部存入 redis。查询时用 new user 的 phone list 把相关 user_id 取出,再统计 user_id 出现次数。
owenliang
2018-10-29 14:09:08 +08:00
@guyskk0x0 redis 扩展性不好嘛,用 ES 就能应付,1000 万级别实时聚合没啥问题。
iblislsy
2018-10-29 14:10:49 +08:00
@owenliang
@guyskk0x0 我现在准备用 ES 试一下,之前没用过,我现在开天辟地
gamexg
2018-10-29 14:13:20 +08:00
能提升些效率,

Bloom Filter
每个用户有一个自己的 Bloom Filter,新用户添加时,遍历所有现存用户的 Bloom Filter,如果命中率较低,可以跳过,否则进行详细查询。
jadec0der
2018-10-29 14:14:06 +08:00
对,楼上两层倒排索引的思路是可行的
iblislsy
2018-10-29 14:21:13 +08:00
@gamexg bloom 感觉弄大动作了,我先学一下 ES
SeaRecluse
2018-10-29 16:02:19 +08:00
啧,你可以按号码段分开然后存成向量,然后根据号码数生成矩阵,矩阵运算很容易得到匹配的号码数。
e.g.: ((1,3,9),(1,8,7),(1,6,1),(1,2,3)...) * (... ; ...)T = (a,b,c;.......)
if a == 1^2 + 3 ^2 + 9^2
balabalbala..........
liwl
2018-10-29 16:02:38 +08:00
麻烦说明下是什么 app,我先去卸载了
WhyLiam
2018-10-29 16:20:48 +08:00
别整体卸载卸载的,单纯看看技术讨论也是值得学习的
iblislsy
2018-10-29 16:23:52 +08:00
@WhyLiam 钢筋太多,应该是下午茶时间到了
amao12580
2018-10-29 17:02:39 +08:00
哪来这么多钢筋
lance6716
2018-10-29 17:10:12 +08:00
感觉还是先试一下允许的复杂度,一般能应用的算法不超过线性代数级别。但是要是能控制数量级的话就好说。线性对数以内没想到好的方法
imn1
2018-10-29 17:14:11 +08:00
昨晚才给手机通讯录添加了 800+人
八百标兵奔北坡
ooooo
2018-10-29 17:17:30 +08:00
这是在讨论交流做恶技术,楼主在哪个 996 的金融创业公司?约莫是山西人?
smilenceX
2018-10-29 17:24:12 +08:00
麻烦说明下是什么 app,我先去卸载了
欢迎 block,直接 B 就行,不用艾特通知我。
xiaoxinshiwo
2018-10-29 17:44:43 +08:00
@ooooo #37 如果改成文档的相似度是不是就不作恶了?
iblislsy
2018-10-29 17:53:05 +08:00
@xiaoxinshiwo 不用搭理钢筋

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

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

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

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

© 2021 V2EX