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