gpt4 book ai didi

groovy - 使用 Gremlin 在二分图上随机游走

转载 作者:行者123 更新时间:2023-12-01 15:27:18 29 4
gpt4 key购买 nike

我想根据给定的用户偏好(用户喜欢的项目)基于在 groovy 中使用 gremlin 的有向二分图上的随机游走对项目进行排名。

该图具有以下基本结构:

[User1] ---'likes'---> [ItemA] <---'likes'--- [User2] ---'likes'---> [ItemB]

以下是我提出的查询:

def runRankQuery(def userVertex) {
def m = [:]
def c = 0
while (c < 1000) {
userVertex
.out('likes') // get all liked items of current or similar user
.shuffle[0] // select randomly one liked item
.groupCount(m) // update counts for selected item
.in('likes') // get all users who also liked item
.shuffle[0] // select randomly one user that liked item
.loop(5){Math.random() < 0.5} // follow liked edge of new user (feed new user in loop)
// OR abort query (restart from original user, outer loop)
.iterate()
c++
}
m = m.sort {a, b -> b.value <=> a.value}
println "intermediate result $m"
m.keySet().removeAll(userVertex.out('likes').toList())
// EDIT (makes no sense - remove): m.each{k,v -> m[k] = v / m.values().sum()}
// EDIT (makes no sense - remove): m.sort {-it.value }
return m.keySet() as List;
}

然而,这段代码没有找到新项目(上面示例中的 [ItemB]),而是给定用户喜欢的项目(例如 [ItemA])。

  • 为了让新用户(例如 [User2])返回“out('likes')”步骤以继续行走,我需要更改什么?

  • 一旦此代码运行,是否可以将其视为“个性化 PageRank”的实现?


这里是运行示例的代码:

g = new TinkerGraph()

user1 = g.addVertex()
user1.name ='User1'
user2 = g.addVertex()
user2.name ='User2'
itemA = g.addVertex()
itemA.name ='ItemA'
itemB = g.addVertex()
itemB.name ='ItemB'

g.addEdge(user1, itemA, 'likes')
g.addEdge(user2, itemA, 'likes')
g.addEdge(user2, itemB, 'likes')

println runRankQuery(user1)

输出:

intermediate result [v[2]:1000]
[]
==>null
gremlin> g.v(2).name
==>ItemA
gremlin>

最佳答案

我发现这是一个非常奇怪的问题。我发现了几个非常奇怪的问题,这些问题不容易解释,最后,我不确定为什么会这样。对我来说很奇怪的两件大事是:

  1. 我不确定 shuffle 步骤是否有问题。在您的情况下,它似乎没有正确随机化。我似乎无法在这种情况之外重现问题,所以我不确定它是否与您的数据大小或其他因素有某种关系。
  2. 我在使用 Math.random() 跳出循环时遇到了奇怪的问题。

无论如何,我想我已经通过我的更改捕获了您的代码的本质,这些更改似乎可以满足您的要求:

runRankQuery = { userVertex ->
def m = [:]
def c = 0
def rand = new java.util.Random()
while (c < 1000) {
def max = rand.nextInt(10) + 1
userVertex._().as('x')
.out('likes')
.gather.transform{it[rand.nextInt(it.size())]}
.groupCount(m)
.in('likes')
.gather.transform{it[rand.nextInt(it.size())]}
.loop('x'){it.loops < max}
.iterate()
c++
}
println "intermediate result $m"
m.keySet().removeAll(userVertex.out('likes').toList())
m.each{k,v -> m[k] = v / m.values().sum()}
m.sort {-it.value }
return m.keySet() as List;
}

我通过从收集的列表中随机选择一个顶点,将 shuffle 替换为我自己的品牌“shuffle”。我还随机选择了一个 max 循环,而不是依赖于 Math.random()。当我现在运行它时,我想我得到了你正在寻找的结果:

gremlin> runRankQuery(user1)                                       
intermediate result [v[2]:1787, v[3]:326]
==>v[3]
gremlin> runRankQuery(user1)
intermediate result [v[2]:1848, v[3]:330]
==>v[3]
gremlin> runRankQuery(user1)
intermediate result [v[2]:1899, v[3]:339]
==>v[3]
gremlin> runRankQuery(user1)
intermediate result [v[2]:1852, v[3]:360]
==>v[3]

您可能还需要 Math.random() 来工作,因为在使用它的某些迭代中它确实对我来说表现出可预测性。

关于groovy - 使用 Gremlin 在二分图上随机游走,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24783212/

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