案例: 根据用户的地理位置、性别、年龄、星座等多属性给用户推荐最适合他的其它用户,过程中涉及到每个属性不同加权,并最终排序
有没有大佬做过类似的案例,有没有好的实现方案推荐的?
1
GeekGao 2023-10-31 10:21:23 +08:00
你是说算法,还是机器推荐技术?
|
2
LitterGopher 2023-10-31 10:26:31 +08:00 1
如果将来有幸成为你的用户,我只想问一个问题:我什么要告诉你那么多个人信息?或者说为何要告诉你那么多真实信息,甚至给你开放相应权限?
|
3
SoviaPhilo 2023-10-31 10:31:34 +08:00
用个人信息来做推荐妥妥会遇到#2 的问题
建议用爱好和倾向来做。 相同的一篇文章,你和他都喜欢,那么你和他就有可能有共同语言 |
4
fnd 2023-10-31 10:37:10 +08:00
可以看看推荐系统,先了解下大家都是咋做的。
你说的这个太基础太浅了,都还到不了需要讨论的阶段,还是先以学习为主。 |
6
coderxy OP @LitterGopher 性别、年龄、生日、包括地理位置都是用户自己可选的, 用户不选我就过滤掉这一项就好了, 还有,app 的正常用户的主要目的是来交友的,而不是抬杠。
|
8
coderxy OP @SoviaPhilo 这是另外一个维度,也就是关联推荐,跟我们现在做的并不冲突。
|
9
sss15 2023-10-31 10:49:17 +08:00
读用户的通讯录啊,手机号在对方通讯录的就给他推荐,再把好友的通讯录里的好友也给他推荐
|
11
guxingke 2023-10-31 10:55:40 +08:00
不如指导用户如何把 头像 做好看点
|
12
dzdh 2023-10-31 10:58:01 +08:00
|
13
janus77 2023-10-31 11:06:32 +08:00
你这个底层应该是产品需求来定义吧,比如你们的产品形态是什么样的,要以什么为交友的核心点?兴趣,还是地域,还是别的什么
但是我觉得,profile 资料只能做一个兜底,主要还是以用户自己编辑的 tag 和发过的、浏览过的动态来作为推荐算法的入参 |
14
piecezzz 2023-10-31 11:09:25 +08:00
再简单也绕不开算法,你说的向量+权重也是算法。
|
17
encro 2023-10-31 12:04:29 +08:00
3 楼的方法啊,就是根据历史浏览,购买行为的协同算法,最简单,最容易,最有效了。
比如买过 a 的人也会买 b 。 每天统计一下,浏览的时候直接查询结果表就行。 |
18
encro 2023-10-31 12:05:10 +08:00
其他算法类似楼上的做法,无非就是缓存结果,用的场景直接查询。
|
19
LitterGopher 2023-10-31 13:46:34 +08:00
@coderxy #6 不是抬杠,而是如果这些信息缺失,剩下的条件是按照原有权重不变?等比上升?依据具体情况变化?如果允许为空或者模糊(提供“不告诉”选项,和允许用户不填写留空),那么空和模糊是否相等着是否也是需要考量的问题呢?
|
20
marcolin18 2023-10-31 14:01:36 +08:00
核心还是定义推荐规则:比如你认为地理位置相近的、同时年龄在同一档 且 星座相同的用户,可以相互推荐,那这就是搜索问题,使用 geo 函数计算地理位置关系、给年龄分档(幼、青、中、老)、星座匹配,只要同时命中 3 个条件的,按预定的权重来计算评分,然后排序取前 10%,每次随机从中取 10 个人推荐,还可以实现“换一批”功能是不是。
核心还是基于你们的产品设计,至于是用知识图谱去发现和推荐,还是按一般的 item-base 、user-base ,计算一下“相似度”,排序推荐,又或者向上面用 MySQL 的二维表对你列出这些维度的“排序”来决定推荐次序,都可以做得到。 |
21
marcolin18 2023-10-31 14:05:49 +08:00
如果是想更深入讨论的,那么建议还是补充一些细节。否则只能得到泛泛的回应。
|
22
SakuraSa 2023-10-31 14:12:00 +08:00
业务刚开始数据量很少的时候,其实简简单单的返回热门内容效果最好。
数据多到需要考虑个性化的时候,可以从协同过滤开始(假设属性类似的用户喜欢的内容也类似)。 在往上就需要考虑推荐的目标了(例如目标是让用户点击就用点击率作为目标),然后将能收集到的信息做成特征喂给 XGBoost 。到这个程度已经可以应付大部分场景了。 在往上基本就是头部公司了,会有专门的部门优化这些。 |
23
GeekGao 2023-10-31 14:17:21 +08:00
@coderxy 一定要有算法的,否则推荐框架只是一些概率和统计学公式组成的框架而已。
具体要看产品的要求,例如,婚恋交友 app ,就会倾向于推荐性别差异的、年龄差一定范围内能接受的、星座匹配的优先展示,以及用户个人标签偏好,例如 A 女择偶标签为:170cm+、信星座、大叔控,那就要优先把身高超过 170cm 的年龄大于 n 岁的,星座匹配的大叔给展示出来。这也是算法。 |
24
coderxy OP @GeekGao 那这种算法是需要用到哪些算法推荐框架吗? 还是说依赖哪些数据库? 或者是哪些基础设施? 因为我没弄过这一块,可能问的问题很不专业, 明了一点说就是我现在只会写代码,这样一个推荐需求我无从下手。
|
25
coderxy OP @marcolin18 用 mysql 这种关系型数据库也可以实现多维度、不同加权、综合排序吗?
|
26
coderxy OP @SakuraSa 因为涉及到类似于男女匹配推荐,所以跟 feed 流的推荐有点不一样。 您提到的协同过滤是需要用到什么算法框架去实现吗?
|
27
yufeng0681 2023-10-31 14:59:33 +08:00
年龄这个属性咋做匹配? 假设数据库里 1000 万用户,
用户 A 年龄 28 , 只能匹配同龄人? 27 29 的人就不匹配么? 为了找用户 A 适配的人,轮训一遍数据库 1 千万用户, 把 top100~200 找出来给用户 A 推荐? |
28
coderxy OP @yufeng0681 我现在的疑问就是这个方案该怎么定。 以最简单粗暴的一种思路来讲, 如果需求是给男性用户推荐小于或等于他年龄的用户, 则根据用户的生日去数据库查询生日小于等于他的、且最近活跃的 100 个用户, 然后在程序内做去重。 当然实际业务还有很多个加权项,有的项目没有办法从数据库直接查,所以就有了这个提问。
|
29
someday3 2023-10-31 16:18:38 +08:00
楼主想的太简单了,想通过一个数据库就昨晚,那不可能的。
要上一整套的数据分析系统,流式的,批式的,然后再上算法。 只用一个 sql 怎么推荐啊,每个用户查一次?狗粗暴,但系统扛不住。 你甚至连你的系统雏形都没有,就一个数据库,网上找找推荐类的文章啊、论文啊,读几篇,先把架构学到 |
32
marcolin18 2023-10-31 17:00:47 +08:00
@coderxy MySQL 可以,但性能可能受限,先做数据预处理,不要想着一条 SQL 搞定,可以定时跑批实现。
给 OP 一个简单思路:原始业务数据 --> 特征提取 --> 预处理入库 --> 搜索预处理数据进行推荐。 接下来就是要明确一下业务数据来源、数据规模、提取方法、预处理方法、查询展示方法。 如果不是实时模型,是可以将 OP 的这个需求理解为一个传统 ETL 任务来实现的。 |
34
coderxy OP @marcolin18 我试试,谢谢大佬
|
35
marcolin18 2023-10-31 17:29:45 +08:00
@coderxy 友情提醒:不要因为 ETL 概念陷到数据仓库的领域里面去了哈,工程问题,够用就好。
|
36
zhuanggu 2023-10-31 19:28:33 +08:00
这个就是学校里的一个推荐的联系项目,实际工作中不可能给你提供这么多属性信息。更多的是通过统计用户的行为信息作为画像的特征。
|
37
kuber 2023-10-31 22:44:46 +08:00
@coderxy 实现的工程方法有很多种,需要结合你的实际情况来考虑,否则容易 over engineering 。
1. 你是个人/初创项目还是企业商业化产品?个人/初创项目的话可以一开始可以做得很简单,不用考虑太多 2. 你设想的用户量有多少(如果不清楚,可以估计一下 1~2 年最多多少用户。一两万,一两百万和一两千万用户量在工程上是不同的需求) 3. 你需要的实时性是怎么样的?一个新用户进来就要马上看到推荐的好友还是可以容忍几分钟/几小时/几天? 4. 什么样的推荐才是”最适合他的其它用户“,容忍度有多少?你最好访问一下你的目标用户,甚至手工做个测试。 5. 你怎么评价推荐的有效性?很多情况下,你推荐一个“相对”热门的其实就够了。比如一个省/市,年龄合适的异性朋友。在启动阶段尤其如此,其他的可以等产品跑起来再去优化。这种交友产品的初始阶段可能准确性并不重要,所以可能不是你投入资源的优先事项。 当然如果这是你的作业或者交差的,那又是另外一回事了。 |
38
Kumo31 2023-11-01 10:24:22 +08:00
可以看看 https://gorse.io/zh/ 这个项目?直接当做一个服务来调用就行,小规模的使用应该足够了
|
39
LaurelHarmon 2023-11-01 10:44:21 +08:00
需要的数据大概长这样:总共 2n+1 列,前 n 列是当前用户的资料,中间 n 列是被推荐用户的资料,最后一列是是否点击。
先搞一个随机版本,收集一点数据,然后拿 LightGBM 训练模型,输入是前 2n 列,输出是最后一列。 训练完之后,对于每一个当前用户,遍历所有用户,得到打分最高的那几个,放在当前用户的推荐栏,然后继续收集数据。 然后循环迭代。 不过我最烦这种 b 功能了,只想上网当小透明,不想裸身冲浪。 |
40
yufeng0681 2023-11-01 22:07:51 +08:00
不管用了啥算法, 推荐效果的跟踪也一并要做了。
这样方便进行业务调整,看看不同画像的人是否需要不同的策略, 如果一个都没效果,那基本策略都要调整。 |
41
kanonlee207 103 天前 via Android
@coderxy 楼主最后是怎么做的,我也要做类似的功能,之前也没做过。初创项目,初期不用那么复杂
|