julia での文字列集合の取り扱いと、2つの集合の類似性の指標となる係数の計算
julia での文字列集合の取り扱いと、2つの集合の類似性の指標となる Jaccard 係数、Simpson 係数、Dice 係数の係数の計算について記載します。R をご使用の方は、集合の入力部分を "<- c()" にしたら、以下のコードは同じで、動くはずです。
果物屋さんの商品 X と、八百屋さんの商品 Y の2つの集合と、八百屋さんの特売品 (Y の部分集合) である Z の全部で3つ集合を例にとります。
X = ["りんご" "みかん" "ぶどう" "マンゴー" "バナナ" "メロン" "ドラゴンフルーツ" "すいか"]
Y = ["キャベツ" "ニンジン" "ゴボウ" "レンコン" "りんご" "バナナ" "みかん" "すいか"]
Z = ["ニンジン" "ゴボウ" "りんご"]
基本的な集合演算は、どちらでにもある積集合 intersect(), 異なる差集合 setdiff() (順列があります)、すべての要素和集合 union() と、計算できます。
julia> intersect(X,Y) # 八百屋さんでも果物屋さんでも売っているもの
4-element Array{String,1}:
"りんご"
"みかん"
"バナナ"
"すいか"
julia> setdiff(X,Y) # 果物屋さんでしか売っていないもの
4-element Array{String,1}:
"ぶどう"
"マンゴー"
"メロン"
"ドラゴンフルーツ"
julia> setdiff(Y,X) # 八百屋さんでしか売っていないもの
4-element Array{String,1}:
"キャベツ"
"ニンジン"
"ゴボウ"
"レンコン"
julia> union(X,Y) # 果物屋さんと八百屋さんをハシゴしたら手に入るもの
12-element Array{String,1}:
"りんご"
"みかん"
"ぶどう"
"マンゴー"
"バナナ"
"メロン"
"ドラゴンフルーツ"
"すいか"
"キャベツ"
"ニンジン"
"ゴボウ"
"レンコン"
julia では、intersect() と、union() は、3つの集合でも動きます。setdiff() は、2つの集合の関係しかも順列ありになります。Rでは2つまでだったと思います。
julia> intersect(X,Y,Z)
1-element Array{String,1}:
"りんご"
julia> union(X,Y,Z)
12-element Array{String,1}:
"りんご"
"みかん"
"ぶどう"
"マンゴー"
"バナナ"
"メロン"
"ドラゴンフルーツ"
"すいか"
"キャベツ"
"ニンジン"
"ゴボウ"
"レンコン"
それぞれに含まれる要素の数は、length() で求めることができます。
julia> length(X)
8
julia> length(union(X,Y))
12
julia> length(intersect(X,Y))
4
類似性の指標について
Jaccard 係数、Simpson 係数、Dice 係数について、求めてみましょう。Jaccard 係数
|X∩Y| / |X∪Y|
XとY の共通要素の数を、X にも Yにも含まれる要素の数で割ります。
julia> length(intersect(X,Y)) / length(union(X,Y))
0.3333333333333333
julia> length(intersect(Z,Y)) / length(union(Z,Y))
0.375
Simpson 係数
|X∩Y| / min(|X|, |Y|)
XとY の共通要素の数を、X または Y の要素数の少ない方で割ります。min() は、最小値を求める関数です。部分集合の関係にある時に 1 になります。オーバーラップ係数、overlap coefficient, Szymkiewicz-Simpson coefficient とも呼ばれるようです。
julia> length(intersect(X,Y)) / min(length(X),length(Y))
0.5
julia> length(intersect(Z,Y)) / min(length(Z),length(Y))
1.0
Dice 係数
2 * |X∩Y| / (|X| + |Y|)
julia> 2 * length(intersect(X,Y)) / (length(X) + length(Y))
0.5
julia> 2 * length(intersect(Z,Y)) / (length(Z) + length(Y))
0.5454545454545454
(length(X) + length(Y)) は、sum([length(X) length(Y)]) や +(length(X),length(Y)) とも記載できます。 0.25