bag-similarity是相似性的一种,比如有两个bags{a,a,a,b}和{a,a,b,b,c},它们的bag-similarity就是1/3,在交集中,a出现2次,b出现一次,所以它的大小是3。两个bags的并的大小为两个bags的大小的和,在这个例子中是9.
用r很容易的实现这个相似性的计算。
a<-c('a','a','a','b')
b<-c('a','a','b','b','c')
bb<-function(a,b){
g<-intersect(a,b)
g<-paste(g,sep="")
xx<-0
for (i in g){
xx=xx+min(table(a)[i],table(b)[i])
}
xx/(length(a)+length(b))
}
bb(a,b)
require 'set'
s1=%w{a a a b}
s2=%w{a a b b c}
def bag_sim(s1,s2)
g=s1.to_set & s2.to_set
m=0
g.each do |i|
a=s1.count(i)
b=s2.count(i)
m+=(a>b)?b:a
end
m/(s1.size+s2.size).to_f
end
puts bag_sim(a,b)