类似于好友推荐有没有比较好的实现方案推荐? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
coderxy
V2EX    程序员

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

  •  
  •   coderxy 2023-10-31 10:06:53 +08:00 3503 次点击
    这是一个创建于 734 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    41 条回复    2024-08-30 14:28:37 +08:00
    R4rvZ6agNVWr56V0
        1
    R4rvZ6agNVWr56V0  
       2023-10-31 10:21:23 +08:00
    你是说算法,还是机器推荐技术?
    LitterGopher
        2
    LitterGopher  
       2023-10-31 10:26:31 +08:00   1
    如果将来有幸成为你的用户,我只想问一个问题:我什么要告诉你那么多个人信息?或者说为何要告诉你那么多真实信息,甚至给你开放相应权限?
    SoviaPhilo
        3
    SoviaPhilo  
       2023-10-31 10:31:34 +08:00
    用个人信息来做推荐妥妥会遇到#2 的问题

    建议用爱好和倾向来做。
    相同的一篇文章,你和他都喜欢,那么你和他就有可能有共同语言
    fnd
        4
    fnd  
       2023-10-31 10:37:10 +08:00
    可以看看推荐系统,先了解下大家都是咋做的。
    你说的这个太基础太浅了,都还到不了需要讨论的阶段,还是先以学习为主。
    coderxy
        5
    coderxy  
    OP
       2023-10-31 10:40:23 +08:00
    @GeekGao 如果不用算法,有什么其它方案可选啊? 比如有没有某种数据库可以实现类似的对比、加权、排序需求。
    coderxy
        6
    coderxy  
    OP
       2023-10-31 10:42:37 +08:00
    @LitterGopher 性别、年龄、生日、包括地理位置都是用户自己可选的, 用户不选我就过滤掉这一项就好了, 还有,app 的正常用户的主要目的是来交友的,而不是抬杠。
    coderxy
        7
    coderxy  
    OP
       2023-10-31 10:43:01 +08:00
    @fnd 在看大家怎么做的,也想在社区问问,扩展一下思路
    coderxy
        8
    coderxy  
    OP
       2023-10-31 10:43:47 +08:00
    @SoviaPhilo 这是另外一个维度,也就是关联推荐,跟我们现在做的并不冲突。
    sss15
        9
    sss15  
       2023-10-31 10:49:17 +08:00
    读用户的通讯录啊,手机号在对方通讯录的就给他推荐,再把好友的通讯录里的好友也给他推荐
    coderxy
        10
    coderxy  
    OP
       2023-10-31 10:51:35 +08:00
    @sss15 陌生人社交不是熟人社交,这个是熟人社交的做法
    guxingke
        11
    guxingke  
       2023-10-31 10:55:40 +08:00
    不如指导用户如何把 头像 做好看点
    dzdh
        12
    dzdh  
       2023-10-31 10:58:01 +08:00
    rb6221
        13
    rb6221  
       2023-10-31 11:06:32 +08:00
    你这个底层应该是产品需求来定义吧,比如你们的产品形态是什么样的,要以什么为交友的核心点?兴趣,还是地域,还是别的什么
    但是我觉得,profile 资料只能做一个兜底,主要还是以用户自己编辑的 tag 和发过的、浏览过的动态来作为推荐算法的入参
    piecezzz
        14
    piecezzz  
       2023-10-31 11:09:25 +08:00
    再简单也绕不开算法,你说的向量+权重也是算法。
    coderxy
        15
    coderxy  
    OP
       2023-10-31 11:18:22 +08:00
    @piecezzz 必须要用算法模型去实现吗?
    ColdBird
        16
    ColdBird  
       2023-10-31 11:39:03 +08:00
    @coderxy 推荐的核心不就是算法模型吗,没有算法模型推荐啥,随机用户吗
    encro
        17
    encro  
       2023-10-31 12:04:29 +08:00
    3 楼的方法啊,就是根据历史浏览,购买行为的协同算法,最简单,最容易,最有效了。

    比如买过 a 的人也会买 b 。

    每天统计一下,浏览的时候直接查询结果表就行。
    encro
        18
    encro  
       2023-10-31 12:05:10 +08:00
    其他算法类似楼上的做法,无非就是缓存结果,用的场景直接查询。
    LitterGopher
        19
    LitterGopher  
       2023-10-31 13:46:34 +08:00
    @coderxy #6 不是抬杠,而是如果这些信息缺失,剩下的条件是按照原有权重不变?等比上升?依据具体情况变化?如果允许为空或者模糊(提供“不告诉”选项,和允许用户不填写留空),那么空和模糊是否相等着是否也是需要考量的问题呢?
    marcolin18
        20
    marcolin18  
       2023-10-31 14:01:36 +08:00
    核心还是定义推荐规则:比如你认为地理位置相近的、同时年龄在同一档 且 星座相同的用户,可以相互推荐,那这就是搜索问题,使用 geo 函数计算地理位置关系、给年龄分档(幼、青、中、老)、星座匹配,只要同时命中 3 个条件的,按预定的权重来计算评分,然后排序取前 10%,每次随机从中取 10 个人推荐,还可以实现“换一批”功能是不是。

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

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

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

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

    当然如果这是你的作业或者交差的,那又是另外一回事了。
    Kumo31
        38
    Kumo31  
       2023-11-01 10:24:22 +08:00
    可以看看 https://gorse.io/zh/ 这个项目?直接当做一个服务来调用就行,小规模的使用应该足够了
    LaurelHarmon
        39
    LaurelHarmon  
       2023-11-01 10:44:21 +08:00
    需要的数据大概长这样:总共 2n+1 列,前 n 列是当前用户的资料,中间 n 列是被推荐用户的资料,最后一列是是否点击。
    先搞一个随机版本,收集一点数据,然后拿 LightGBM 训练模型,输入是前 2n 列,输出是最后一列。
    训练完之后,对于每一个当前用户,遍历所有用户,得到打分最高的那几个,放在当前用户的推荐栏,然后继续收集数据。
    然后循环迭代。
    不过我最烦这种 b 功能了,只想上网当小透明,不想裸身冲浪。
    yufeng0681
        40
    yufeng0681  
       2023-11-01 22:07:51 +08:00
    不管用了啥算法, 推荐效果的跟踪也一并要做了。
    这样方便进行业务调整,看看不同画像的人是否需要不同的策略, 如果一个都没效果,那基本策略都要调整。
    kanonlee207
        41
    kanonlee207  
       2024-08-30 14:28:37 +08:00 via Android
    @coderxy 楼主最后是怎么做的,我也要做类似的功能,之前也没做过。初创项目,初期不用那么复杂
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3596 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 04:17 PVG 12:17 LAX 20:17 JFK 23:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86