V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coderxy
V2EX  ›  程序员

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

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

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

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

    41 条回复    2024-08-30 14:28:37 +08:00
    GeekGao
        1
    GeekGao  
       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
    janus77
        13
    janus77  
       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 。到这个程度已经可以应付大部分场景了。
    在往上基本就是头部公司了,会有专门的部门优化这些。
    GeekGao
        23
    GeekGao  
       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 在看 🤣 就是因为现在啥都没有,才来社区问问大佬们有啥意见
    GeekGao
        31
    GeekGao  
       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  
       83 天前 via Android
    @coderxy 楼主最后是怎么做的,我也要做类似的功能,之前也没做过。初创项目,初期不用那么复杂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2304 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:11 · PVG 00:11 · LAX 08:11 · JFK 11:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.