获取互斥记录:由标签云分组,即使是共享关联

时间:2015-03-15 23:55:14

标签: python sql sqlite data-structures ipython

我有一个平坦的CSV文件,其数据如下:

tag1,pageA
tag2,pageA
tag3,pageA
tag1,pageB
tag4,pageB
tag5,pageC
tag5,pageD
tag4,pageE
tag6,pageE

我想以某种方式将pages细分为互斥组,具体取决于他们直接或通过关联共享的所有tags

换句话说,我想回答的问题是:

  1. 我有多少个独立的网页? (其中独立性定义为与其他组不共享共同标记。)
  2. 对于每个组,定义它的标签是什么?
  3. 对于每个组,它包含哪些页面?
  4. 例如,除非我计算错误,否则上述样本数据有两组:

    Group 1:
    (tag1,tag2,tag3,tag4,tag6) ==>
      (pageA,pageB,pageE)
    
    Group 2:
    (tag5) ==>
      (pageC,pageD)
    

    获得这些分组的合理方法是什么?我愿意使用Python,sqlite或两者兼而有之。

1 个答案:

答案 0 :(得分:0)

dic = {}

def add2dic(tag, page):
    try:
        dic[tag].append(page)
    except KeyError:
        dic[tag] = [page]

add2dic('tag1','pageA')
add2dic('tag2','pageA')
add2dic('tag3','pageA')
add2dic('tag1','pageB')
add2dic('tag4','pageB')
add2dic('tag5','pageC')
add2dic('tag5','pageD')
add2dic('tag4','pageE')
add2dic('tag6','pageE')

def query(iterable):
    aset = set()
    for tag in iterable:
        for page in dic[tag]:
            aset.add(page)
    return sorted(list(aset))

print(query(['tag1','tag2','tag3','tag4','tag6']))
print(query(['tag5']))

[' pageA',' pageB',' pageE']
[' pageC',' pageD']