我有800万个唯一的user_id到item_id配对,如下所示:
user_id item_id
1 item10
1 item11
1 item12
1 item13
2 item11
2 item13
2 item14
2 item15
3 item10
3 item14
3 item18
我想把它变成以下格式:node1,node2,weight,其中所有节点都是user_ids,它们之间的权重是它们共享的item_id的数量。因此,例如,1和2连接,因为它们共享2个item_ids [item11和item13],1和3共享1 item_id [item_10],2和3共享1以及......等等。
1,2,2
1,3,1
2,3,1
将是我正在寻找的最终结果。但是,我有800万行(大约25个唯一的user_id,但很多连接)最有效的方法是什么?我用来从大约50.000行检索类似(但不完全相同)的网络的SQL查询需要很长时间,因此我正在寻找替代方案。我可以用R,php,sql或python来做。
答案 0 :(得分:5)
像
这样的东西SELECT node1.user_id, node2.user_id, COUNT(item_id)
FROM yourtable AS node1
JOIN yourtable AS node2 ON
(node1.user_id <> node2.user_id) AND (node1.item_id = node2.item_id)
GROUP BY node1.user_id, node2.user_id
答案 1 :(得分:0)
在R中,在您将文件作为数据框dat
读入之后,可能是这样的:
## create list of items split up and labeled by user_id
item_list <- split(dat$item_id, dat$user_id)
## create list of unique ID's
id_list <- as.character(unique(dat$user_id))
## find all combinations of 2 ID's
id_comb <- combn(id_list,2)
## iterate through all ID combinations, locate the item sets
## intersect and find the cardinality afterwards
result <- apply(id_comb, 2, function(x)
length(do.call(intersect, item_list[x]))