julia での文字列集合の取り扱いと、2つの集合の類似性の指標となる係数の計算

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

B! LINE