来自800万行数据的共现图


Co-occurrence graph from 8 million rows of data

我有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_id,它们之间的权重是它们共享的item_id的数量。因此,例如,1和2是连接的,因为它们共享2个item_id[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,但有许多连接),最有效的方法是什么?我用来从大约50000行中检索类似(但不完全相同)网络的SQL查询花费了很长时间,所以我正在寻找替代方案。我可以用R、php、sql或python来完成。

类似的东西

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

在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]))