在大数据集中搜索

时间:2013-02-12 05:48:29

标签: python data-structures

我有一个用户列表:朋友(50,000)和活动参与者列表(25,000个活动和每个活动的与会者列表)。我想找到与用户一起参加活动的前k个朋友。这需要为每个用户完成。

我试过遍历列表,但计算上非常昂贵。我也试图通过创建加权图来做到这一点。(Python)

如果有其他方法,请告诉我。

4 个答案:

答案 0 :(得分:1)

Python的集合对象(字典,集合和集合.Counter)简化了这项任务:

from collections import Counter

def top_k_friends(friends, events, k=2):
    '''Given a dictionary users mapped to their set of friends
    and a dictionary of events mapped to a set of their attendees,
    find the top k friends with whom the user goes to the event.
    Do this for each user.

    '''
    for user, users_friends in friends.iteritems():
        c = Counter()
        for event, attendees in events.iteritems():
            if user in attendees:
                c.update(users_friends.intersection(attendees))
        print user, '-->', c.most_common(k)

if __name__ == '__main__':

    friends = {
        'robert' : {'mary', 'marty', 'maggie', 'john'},
        'paul' : {'marty', 'mary', 'amber', 'susan'}
    }

    events = {
        'derby': {'amber', 'mary', 'robert'},
        'pageant': {'maggie', 'paul', 'amber', 'marty', 'john'},
        'fireworks': {'susan', 'robert', 'marty', 'paul', 'robert'}
    }

    top_k_friends(friends, events)

答案 1 :(得分:0)

我建议您在数据库(例如sqlite)或纯python内存选项中执行此操作,请参阅norman。无论哪种方式都比试图用列表自己实现它快得多。

答案 2 :(得分:0)

你能做这样的事吗。

我假设用户的朋友相对较少,特定用户参加的活动也比活动总数少得多。

因此,为用户的每个朋友提供有人参与事件的布尔矢量。

点数产品和具有最大值的产品将成为最有可能与用户相似的朋友。

再次,。在你这样做之前......你必须过滤一些事件,以保持你的矢量大小可管理。

答案 3 :(得分:0)

如果我更好地理解你当前的数据结构是什么样的,我会给你一个代码示例,但这听起来像是一个pandas数据帧组的工作(如果你不想像其他人一样使用数据库)所建议的)。