来自800万行数据的共现图

时间:2013-11-25 18:09:02

标签: php python mysql r

我有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来做。

2 个答案:

答案 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]))