使用cascalog将共现计数转换为共现概率

cyvaqqii  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(291)

我有一个存储在s3上的共现计数表(其中每一行是[key-a,key-b,count]),我想从中生成共现概率矩阵。
为此,我需要计算每个key-a的计数之和,然后将每行除以其key-a的和。
如果我是“手工”完成的话,我会对数据进行一次传递,生成一个从键到总计的哈希表(在leveldb或类似的东西中),然后对数据进行第二次传递以进行除法。这听起来不是一个很好的方法。
有没有什么方法可以让我得到一行的总数,通过做一个等价的自连接?

bnl4lu3b

bnl4lu3b1#

样本数据:

(def coocurrences
  [["foo" "bar" 3]
   ["bar" "foo" 3]
   ["foo" "quux" 6]
   ["quux" "foo" 6]
   ["bar" "quux" 2]
   ["quux" "bar" 2]])

查询:

(require '[cascalog.api :refer :all] '[cascalog.ops :as c])

(let [total (<- [?key-a ?sum]
              (coocurrences ?key-a _ ?c)
              (c/sum ?c :> ?sum))]
  (?<- (stdout) [?key-a ?key-b ?prob]
    (div ?c ?sum :> ?prob)
    (coocurrences ?key-a ?key-b ?c)
    (total ?key-a ?sum)))

输出:

RESULTS
-----------------------
bar     foo     0.6
bar     quux    0.4
foo     bar     0.3333333333333333
foo     quux    0.6666666666666666
quux    foo     0.75
quux    bar     0.25
-----------------------

相关问题