gpt4 book ai didi

neo4j - neo4j 中具有属性的协同过滤密码

转载 作者:行者123 更新时间:2023-12-05 00:52:26 25 4
gpt4 key购买 nike

我正在使用 neo4j 来设置推荐系统。我有以下设置:

节点:

  • 用户
  • 电影
  • 电影属性(例如类型)

  • 关系
  • (m:Movie)-[w:WEIGHT {weight: 10}]->(a:Attribute)
  • (u:User)-[r:RATED {rating: 5}]->(m:Movie)

  • 这是它的外观图:

    enter image description here

    我现在正试图弄清楚如何应用一个如下工作的协同过滤方案:
  • 检查 user 的哪些属性已经喜欢(暗中通过喜欢电影)
  • 查找类似信息 other users喜欢这些相似属性的人
  • 推荐顶级电影给user ,用户没有看到,但类似 ​​other users看到。

  • 条件显然是每个属性对每部电影都有一定的权重。例如。流派 adventure可以有 10 的权重指环王但重量为 5对于泰坦尼克号。

    此外,系统需要考虑每部电影的评分。例如。如果 other user已评价指环王 5 ,那么他/她的山脉之王的属性被缩放 5而不是 10 . user对隐含属性的评分也接近 5然后应该推荐这部电影,而不是另一个对类似属性评分更高的用户。

    我一开始只是简单地推荐其他用户评价过的其他电影,但我不确定如何考虑 RATING 和 WEIGHT 之间的关系。它也不起作用:
    MATCH (user:User)-[:RATED]->(movie1)<-[:RATED]-(ouser:User),
    (ouser)-[:RATED]->(movie2)<-[:RATED]-(oouser:User)
    WHERE user.uid = "user4"
    AND NOT (user)-[:RATED]->(movie2)
    RETURN oouser

    最佳答案

    从数学上讲,您正在寻找的是一个简化的 Jaccard index两个用户之间。也就是说,它们的相似程度取决于它们有多少共同点。我说简化是因为我们没有考虑他们不同意的电影。基本上,按照您的订单,它将是:

    1)获取每个用户的每个属性的总权重。例如:

    MATCH (user:User{name:'user1'})
    OPTIONAL MATCH (user)-[r:RATED]->(m:Movie)->[w:WEIGHT]->(a:Attribute)
    WITH user, r.rating * w.weight AS totalWeight, a
    WITH user, a, sum(totalWeight) AS totalWeight

    我们需要最后一行,因为每个电影属性组合都有一行

    2)然后,我们得到具有相似品味的用户。这是一个性能危险区域,可能需要进行一些过滤。但是强制执行它,我们让用户在 10% 的错误范围内喜欢每个属性(例如)
    WITH user, a, totalWeight*0.9 AS minimum, totalWeight*1.10 AS maximum
    MATCH (a)<-[w:WEIGHT]-(m:Movie)<-[r:RATES]-(otherUser:User)
    WITH user, a, otherUser
    WHERE w.weight * r.rating > minimum AND w.weight * r.rating < maximum
    WITH user, otherUser

    所以现在我们有一行(由于最后一行而唯一)与匹配的任何其他用户。在这里,老实说,我需要尝试确定是否包含只有 1 个类型匹配的其他用户......如果是,则需要额外的过滤器。但我认为这应该在我们开始之后进行。

    3)现在很容易:
    MATCH (otherUser)-[r:RATES]->(m:Movie)
    WHERE NOT (user)-[:RATES]->(m)
    RETURN m, sum(r.rating) AS totalRating ORDER BY totalRating DESC

    如前所述,棘手的部分是 2),但在我们知道如何进行数学运算后,它应该会更容易。哦,关于数学,要使其正常工作,电影的总权重应为 1 ( normalizing )。在任何其他情况下,电影总权重之间的差异都会导致不公平的比较。

    我在没有适当学习(纸、铅笔、方程、统计)和在示例数据集中尝试代码的情况下写了这个。我希望它无论如何都能帮到你!

    如果您想要此推荐而不考虑用户评分或属性权重,则将 1) 和 2) 行中的数学分别替换为 r.rating 或 w.weight 就足够了。仍会使用 RATES 和 WEIGHTS 关系,例如,冒险电影的狂热消费者将被冒险电影的消费者推荐电影,但不会根据我们选择的评级或属性权重进行修改。

    编辑:编辑代码以修复评论中讨论的语法错误。

    关于neo4j - neo4j 中具有属性的协同过滤密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789290/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com