类似于好友推荐有没有比较好的实现方案推荐?

2023-10-31 10:06:53 +08:00
 coderxy

案例: 根据用户的地理位置、性别、年龄、星座等多属性给用户推荐最适合他的其它用户,过程中涉及到每个属性不同加权,并最终排序

有没有大佬做过类似的案例,有没有好的实现方案推荐的?

2993 次点击
所在节点    程序员
41 条回复
marcolin18
2023-10-31 14:05:49 +08:00
如果是想更深入讨论的,那么建议还是补充一些细节。否则只能得到泛泛的回应。
SakuraSa
2023-10-31 14:12:00 +08:00
业务刚开始数据量很少的时候,其实简简单单的返回热门内容效果最好。
数据多到需要考虑个性化的时候,可以从协同过滤开始(假设属性类似的用户喜欢的内容也类似)。
在往上就需要考虑推荐的目标了(例如目标是让用户点击就用点击率作为目标),然后将能收集到的信息做成特征喂给 XGBoost 。到这个程度已经可以应付大部分场景了。
在往上基本就是头部公司了,会有专门的部门优化这些。
GeekGao
2023-10-31 14:17:21 +08:00
@coderxy 一定要有算法的,否则推荐框架只是一些概率和统计学公式组成的框架而已。
具体要看产品的要求,例如,婚恋交友 app ,就会倾向于推荐性别差异的、年龄差一定范围内能接受的、星座匹配的优先展示,以及用户个人标签偏好,例如 A 女择偶标签为:170cm+、信星座、大叔控,那就要优先把身高超过 170cm 的年龄大于 n 岁的,星座匹配的大叔给展示出来。这也是算法。
coderxy
2023-10-31 14:23:37 +08:00
@GeekGao 那这种算法是需要用到哪些算法推荐框架吗? 还是说依赖哪些数据库? 或者是哪些基础设施? 因为我没弄过这一块,可能问的问题很不专业, 明了一点说就是我现在只会写代码,这样一个推荐需求我无从下手。
coderxy
2023-10-31 14:24:55 +08:00
@marcolin18 用 mysql 这种关系型数据库也可以实现多维度、不同加权、综合排序吗?
coderxy
2023-10-31 14:26:01 +08:00
@SakuraSa 因为涉及到类似于男女匹配推荐,所以跟 feed 流的推荐有点不一样。 您提到的协同过滤是需要用到什么算法框架去实现吗?
yufeng0681
2023-10-31 14:59:33 +08:00
年龄这个属性咋做匹配? 假设数据库里 1000 万用户,
用户 A 年龄 28 , 只能匹配同龄人? 27 29 的人就不匹配么?
为了找用户 A 适配的人,轮训一遍数据库 1 千万用户, 把 top100~200 找出来给用户 A 推荐?
coderxy
2023-10-31 15:07:58 +08:00
@yufeng0681 我现在的疑问就是这个方案该怎么定。 以最简单粗暴的一种思路来讲, 如果需求是给男性用户推荐小于或等于他年龄的用户, 则根据用户的生日去数据库查询生日小于等于他的、且最近活跃的 100 个用户, 然后在程序内做去重。 当然实际业务还有很多个加权项,有的项目没有办法从数据库直接查,所以就有了这个提问。
someday3
2023-10-31 16:18:38 +08:00
楼主想的太简单了,想通过一个数据库就昨晚,那不可能的。

要上一整套的数据分析系统,流式的,批式的,然后再上算法。

只用一个 sql 怎么推荐啊,每个用户查一次?狗粗暴,但系统扛不住。

你甚至连你的系统雏形都没有,就一个数据库,网上找找推荐类的文章啊、论文啊,读几篇,先把架构学到
coderxy
2023-10-31 16:27:15 +08:00
@someday3 在看 🤣 就是因为现在啥都没有,才来社区问问大佬们有啥意见
GeekGao
2023-10-31 16:55:56 +08:00
@coderxy 推荐你先补充一下基本的原理和实践,看看这本书《集体智慧编程》
marcolin18
2023-10-31 17:00:47 +08:00
@coderxy MySQL 可以,但性能可能受限,先做数据预处理,不要想着一条 SQL 搞定,可以定时跑批实现。
给 OP 一个简单思路:原始业务数据 --> 特征提取 --> 预处理入库 --> 搜索预处理数据进行推荐。
接下来就是要明确一下业务数据来源、数据规模、提取方法、预处理方法、查询展示方法。
如果不是实时模型,是可以将 OP 的这个需求理解为一个传统 ETL 任务来实现的。
coderxy
2023-10-31 17:21:30 +08:00
@GeekGao 谢谢大佬
coderxy
2023-10-31 17:21:40 +08:00
@marcolin18 我试试,谢谢大佬
marcolin18
2023-10-31 17:29:45 +08:00
@coderxy 友情提醒:不要因为 ETL 概念陷到数据仓库的领域里面去了哈,工程问题,够用就好。
zhuanggu
2023-10-31 19:28:33 +08:00
这个就是学校里的一个推荐的联系项目,实际工作中不可能给你提供这么多属性信息。更多的是通过统计用户的行为信息作为画像的特征。
kuber
2023-10-31 22:44:46 +08:00
@coderxy 实现的工程方法有很多种,需要结合你的实际情况来考虑,否则容易 over engineering 。
1. 你是个人/初创项目还是企业商业化产品?个人/初创项目的话可以一开始可以做得很简单,不用考虑太多
2. 你设想的用户量有多少(如果不清楚,可以估计一下 1~2 年最多多少用户。一两万,一两百万和一两千万用户量在工程上是不同的需求)
3. 你需要的实时性是怎么样的?一个新用户进来就要马上看到推荐的好友还是可以容忍几分钟/几小时/几天?
4. 什么样的推荐才是”最适合他的其它用户“,容忍度有多少?你最好访问一下你的目标用户,甚至手工做个测试。
5. 你怎么评价推荐的有效性?很多情况下,你推荐一个“相对”热门的其实就够了。比如一个省/市,年龄合适的异性朋友。在启动阶段尤其如此,其他的可以等产品跑起来再去优化。这种交友产品的初始阶段可能准确性并不重要,所以可能不是你投入资源的优先事项。

当然如果这是你的作业或者交差的,那又是另外一回事了。
Kumo31
2023-11-01 10:24:22 +08:00
可以看看 https://gorse.io/zh/ 这个项目?直接当做一个服务来调用就行,小规模的使用应该足够了
LaurelHarmon
2023-11-01 10:44:21 +08:00
需要的数据大概长这样:总共 2n+1 列,前 n 列是当前用户的资料,中间 n 列是被推荐用户的资料,最后一列是是否点击。
先搞一个随机版本,收集一点数据,然后拿 LightGBM 训练模型,输入是前 2n 列,输出是最后一列。
训练完之后,对于每一个当前用户,遍历所有用户,得到打分最高的那几个,放在当前用户的推荐栏,然后继续收集数据。
然后循环迭代。
不过我最烦这种 b 功能了,只想上网当小透明,不想裸身冲浪。
yufeng0681
2023-11-01 22:07:51 +08:00
不管用了啥算法, 推荐效果的跟踪也一并要做了。
这样方便进行业务调整,看看不同画像的人是否需要不同的策略, 如果一个都没效果,那基本策略都要调整。

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

https://tanronggui.xyz/t/986970

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

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

© 2021 V2EX