nysol-take 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/mbiclique.rb +317 -0
- data/bin/mbipolish.rb +362 -0
- data/bin/mccomp.rb +235 -0
- data/bin/mclique.rb +295 -0
- data/bin/mclique2g.rb +105 -0
- data/bin/mcliqueInfo.rb +203 -0
- data/bin/mfriends.rb +202 -0
- data/bin/mgdiff.rb +252 -0
- data/bin/mhifriend.rb +456 -0
- data/bin/mhipolish.rb +465 -0
- data/bin/mitemset.rb +168 -0
- data/bin/mpal.rb +410 -0
- data/bin/mpolishing.rb +399 -0
- data/bin/msequence.rb +165 -0
- data/bin/mtra2g.rb +476 -0
- data/bin/mtra2gc.rb +360 -0
- data/ext/grhfilrun/extconf.rb +12 -0
- data/ext/grhfilrun/grhfilrun.c +85 -0
- data/ext/grhfilrun/src/_sspc.c +358 -0
- data/ext/grhfilrun/src/aheap.c +545 -0
- data/ext/grhfilrun/src/aheap.h +251 -0
- data/ext/grhfilrun/src/base.c +92 -0
- data/ext/grhfilrun/src/base.h +59 -0
- data/ext/grhfilrun/src/fstar.c +497 -0
- data/ext/grhfilrun/src/fstar.h +80 -0
- data/ext/grhfilrun/src/grhfil.c +214 -0
- data/ext/grhfilrun/src/itemset.c +713 -0
- data/ext/grhfilrun/src/itemset.h +170 -0
- data/ext/grhfilrun/src/problem.c +415 -0
- data/ext/grhfilrun/src/problem.h +179 -0
- data/ext/grhfilrun/src/queue.c +533 -0
- data/ext/grhfilrun/src/queue.h +182 -0
- data/ext/grhfilrun/src/sample.c +19 -0
- data/ext/grhfilrun/src/sspc.c +597 -0
- data/ext/grhfilrun/src/sspc2.c +491 -0
- data/ext/grhfilrun/src/stdlib2.c +1482 -0
- data/ext/grhfilrun/src/stdlib2.h +892 -0
- data/ext/grhfilrun/src/trsact.c +817 -0
- data/ext/grhfilrun/src/trsact.h +160 -0
- data/ext/grhfilrun/src/vec.c +745 -0
- data/ext/grhfilrun/src/vec.h +172 -0
- data/ext/lcmrun/extconf.rb +20 -0
- data/ext/lcmrun/lcmrun.cpp +99 -0
- data/ext/lcmrun/src/aheap.c +216 -0
- data/ext/lcmrun/src/aheap.h +111 -0
- data/ext/lcmrun/src/base.c +92 -0
- data/ext/lcmrun/src/base.h +59 -0
- data/ext/lcmrun/src/itemset.c +496 -0
- data/ext/lcmrun/src/itemset.h +157 -0
- data/ext/lcmrun/src/lcm.c +427 -0
- data/ext/lcmrun/src/problem.c +349 -0
- data/ext/lcmrun/src/problem.h +177 -0
- data/ext/lcmrun/src/queue.c +528 -0
- data/ext/lcmrun/src/queue.h +176 -0
- data/ext/lcmrun/src/sgraph.c +359 -0
- data/ext/lcmrun/src/sgraph.h +173 -0
- data/ext/lcmrun/src/stdlib2.c +1282 -0
- data/ext/lcmrun/src/stdlib2.h +823 -0
- data/ext/lcmrun/src/trsact.c +747 -0
- data/ext/lcmrun/src/trsact.h +159 -0
- data/ext/lcmrun/src/vec.c +731 -0
- data/ext/lcmrun/src/vec.h +171 -0
- data/ext/lcmseq0run/extconf.rb +20 -0
- data/ext/lcmseq0run/lcmseq0run.cpp +59 -0
- data/ext/lcmseq0run/src/aheap.c +216 -0
- data/ext/lcmseq0run/src/aheap.h +111 -0
- data/ext/lcmseq0run/src/base.c +92 -0
- data/ext/lcmseq0run/src/base.h +59 -0
- data/ext/lcmseq0run/src/itemset.c +518 -0
- data/ext/lcmseq0run/src/itemset.h +157 -0
- data/ext/lcmseq0run/src/itemset_zero.c +522 -0
- data/ext/lcmseq0run/src/lcm_seq.c +446 -0
- data/ext/lcmseq0run/src/lcm_seq_zero.c +446 -0
- data/ext/lcmseq0run/src/problem.c +439 -0
- data/ext/lcmseq0run/src/problem.h +179 -0
- data/ext/lcmseq0run/src/problem_zero.c +439 -0
- data/ext/lcmseq0run/src/queue.c +533 -0
- data/ext/lcmseq0run/src/queue.h +182 -0
- data/ext/lcmseq0run/src/stdlib2.c +1350 -0
- data/ext/lcmseq0run/src/stdlib2.h +864 -0
- data/ext/lcmseq0run/src/trsact.c +747 -0
- data/ext/lcmseq0run/src/trsact.h +159 -0
- data/ext/lcmseq0run/src/vec.c +779 -0
- data/ext/lcmseq0run/src/vec.h +172 -0
- data/ext/lcmseqrun/extconf.rb +20 -0
- data/ext/lcmseqrun/lcmseqrun.cpp +101 -0
- data/ext/lcmseqrun/src/aheap.c +216 -0
- data/ext/lcmseqrun/src/aheap.h +111 -0
- data/ext/lcmseqrun/src/base.c +92 -0
- data/ext/lcmseqrun/src/base.h +59 -0
- data/ext/lcmseqrun/src/itemset.c +518 -0
- data/ext/lcmseqrun/src/itemset.h +157 -0
- data/ext/lcmseqrun/src/itemset_zero.c +522 -0
- data/ext/lcmseqrun/src/lcm_seq.c +447 -0
- data/ext/lcmseqrun/src/lcm_seq_zero.c +446 -0
- data/ext/lcmseqrun/src/problem.c +439 -0
- data/ext/lcmseqrun/src/problem.h +179 -0
- data/ext/lcmseqrun/src/problem_zero.c +439 -0
- data/ext/lcmseqrun/src/queue.c +533 -0
- data/ext/lcmseqrun/src/queue.h +182 -0
- data/ext/lcmseqrun/src/stdlib2.c +1350 -0
- data/ext/lcmseqrun/src/stdlib2.h +864 -0
- data/ext/lcmseqrun/src/trsact.c +747 -0
- data/ext/lcmseqrun/src/trsact.h +159 -0
- data/ext/lcmseqrun/src/vec.c +779 -0
- data/ext/lcmseqrun/src/vec.h +172 -0
- data/ext/lcmtransrun/extconf.rb +18 -0
- data/ext/lcmtransrun/lcmtransrun.cpp +264 -0
- data/ext/macerun/extconf.rb +20 -0
- data/ext/macerun/macerun.cpp +57 -0
- data/ext/macerun/src/aheap.c +217 -0
- data/ext/macerun/src/aheap.h +112 -0
- data/ext/macerun/src/itemset.c +491 -0
- data/ext/macerun/src/itemset.h +158 -0
- data/ext/macerun/src/mace.c +503 -0
- data/ext/macerun/src/problem.c +346 -0
- data/ext/macerun/src/problem.h +174 -0
- data/ext/macerun/src/queue.c +529 -0
- data/ext/macerun/src/queue.h +177 -0
- data/ext/macerun/src/sgraph.c +360 -0
- data/ext/macerun/src/sgraph.h +174 -0
- data/ext/macerun/src/stdlib2.c +993 -0
- data/ext/macerun/src/stdlib2.h +811 -0
- data/ext/macerun/src/vec.c +634 -0
- data/ext/macerun/src/vec.h +170 -0
- data/ext/sspcrun/extconf.rb +20 -0
- data/ext/sspcrun/src/_sspc.c +358 -0
- data/ext/sspcrun/src/aheap.c +545 -0
- data/ext/sspcrun/src/aheap.h +251 -0
- data/ext/sspcrun/src/base.c +92 -0
- data/ext/sspcrun/src/base.h +59 -0
- data/ext/sspcrun/src/fstar.c +496 -0
- data/ext/sspcrun/src/fstar.h +80 -0
- data/ext/sspcrun/src/grhfil.c +213 -0
- data/ext/sspcrun/src/itemset.c +713 -0
- data/ext/sspcrun/src/itemset.h +170 -0
- data/ext/sspcrun/src/problem.c +415 -0
- data/ext/sspcrun/src/problem.h +179 -0
- data/ext/sspcrun/src/queue.c +533 -0
- data/ext/sspcrun/src/queue.h +182 -0
- data/ext/sspcrun/src/sample.c +19 -0
- data/ext/sspcrun/src/sspc.c +598 -0
- data/ext/sspcrun/src/sspc2.c +491 -0
- data/ext/sspcrun/src/stdlib2.c +1482 -0
- data/ext/sspcrun/src/stdlib2.h +892 -0
- data/ext/sspcrun/src/trsact.c +817 -0
- data/ext/sspcrun/src/trsact.h +160 -0
- data/ext/sspcrun/src/vec.c +745 -0
- data/ext/sspcrun/src/vec.h +172 -0
- data/ext/sspcrun/sspcrun.cpp +54 -0
- data/lib/nysol/enumLcmEp.rb +338 -0
- data/lib/nysol/enumLcmEsp.rb +284 -0
- data/lib/nysol/enumLcmIs.rb +275 -0
- data/lib/nysol/enumLcmSeq.rb +143 -0
- data/lib/nysol/items.rb +201 -0
- data/lib/nysol/seqDB.rb +256 -0
- data/lib/nysol/take.rb +39 -0
- data/lib/nysol/taxonomy.rb +113 -0
- data/lib/nysol/traDB.rb +257 -0
- metadata +239 -0
data/bin/mhipolish.rb
ADDED
@@ -0,0 +1,465 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require "nysol/mcmd"
|
6
|
+
|
7
|
+
# 1.0 initial development: 2016/12/27
|
8
|
+
$cmd=$0.sub(/.*\//,"")
|
9
|
+
$version="1.0"
|
10
|
+
|
11
|
+
def help
|
12
|
+
|
13
|
+
STDERR.puts <<EOF
|
14
|
+
----------------------------
|
15
|
+
#{$cmd} version #{$version}
|
16
|
+
----------------------------
|
17
|
+
概要) hierarchical polish: トランザクションデータにpolishを階層的に適用する。
|
18
|
+
|
19
|
+
書式) #{$cmd} i= tid= item= [class=] [no=] eo= s=|S= [sim=] [th=] [-node_support] [psim=] [pth=] [psup=] [-indirect] [iter=] [maxLevel=] [T=] [--help]
|
20
|
+
i= : トランザクションデータファイル【必須】
|
21
|
+
tid= : トランザクションID項目名【必須】
|
22
|
+
item= : アイテム項目名【必須】
|
23
|
+
no= : 出力ファイル(節点)
|
24
|
+
eo= : 出力ファイル(辺:節点ペア)
|
25
|
+
s= : 最小支持度(全トランザクション数に対する割合による指定): 0以上1以下の実数
|
26
|
+
S= : 最小支持度(トランザクション数による指定): 1以上の整数
|
27
|
+
sim= : 枝を張るために用いる類似度を指定する。
|
28
|
+
省略時は最小支持度条件を満たしているアイテム間全てに枝を張る
|
29
|
+
指定できる類似度は以下の3つのいずれか一つ。
|
30
|
+
J:jaccard, P:normalized PMI, C:confidence
|
31
|
+
th= : sim=で指定された類似度について、ここで指定された値以上のアイテム間に枝を張る。
|
32
|
+
-node_support : 節点にもs=,S=の条件を適用する。指定しなければ全てのitemを節点として出力する。
|
33
|
+
以上のパラメータ mtra2gc.rbのパラメータであり、詳細は同コマンドヘルプを参照のこと。
|
34
|
+
|
35
|
+
psim= : 枝の追加(削除)を判定するための類似度 (i,I,S,s,T,R,P,C) 省略時はR
|
36
|
+
pth= : psim=で指定された類似度について、ここで指定された値以上の節点間に枝を張る。
|
37
|
+
psup= : 類似度計算において、共通隣接接点数>=psupの条件を加える。省略時は0
|
38
|
+
-indirect : 隣接節点集合から直接の関係を除外する。
|
39
|
+
iter= : データ研磨の最大繰り返し数(デフォルト=1)
|
40
|
+
|
41
|
+
maxLevel= : 階層化の回数上限(デフォルト:0,収束するまで)
|
42
|
+
|
43
|
+
その他
|
44
|
+
T= : ワークディレクトリ(default:/tmp)
|
45
|
+
--help : ヘルプの表示
|
46
|
+
|
47
|
+
入力ファイル形式)
|
48
|
+
トランザクションIDとアイテムの2項目によるトランザクションデータ。
|
49
|
+
|
50
|
+
o=の出力形式)
|
51
|
+
枝ファイル: cluster,node,support,frequency,total
|
52
|
+
節点ファイル: cluster%0,node1%1,node2%2,support(sim=で指定した類似度)
|
53
|
+
|
54
|
+
例)
|
55
|
+
$ cat tra1.csv
|
56
|
+
id,item
|
57
|
+
1,a
|
58
|
+
1,b
|
59
|
+
1,d
|
60
|
+
1,e
|
61
|
+
2,a
|
62
|
+
2,b
|
63
|
+
2,e
|
64
|
+
3,a
|
65
|
+
3,d
|
66
|
+
3,e
|
67
|
+
6,b
|
68
|
+
6,d
|
69
|
+
7,d
|
70
|
+
7,e
|
71
|
+
4,c
|
72
|
+
4,f
|
73
|
+
4,b
|
74
|
+
5,c
|
75
|
+
5,f
|
76
|
+
5,e
|
77
|
+
8,g
|
78
|
+
8,h
|
79
|
+
9,g
|
80
|
+
9,h
|
81
|
+
0,i
|
82
|
+
a,j
|
83
|
+
a,c
|
84
|
+
a,a
|
85
|
+
|
86
|
+
$ #{$cmd} i=tra1.csv no=node1.csv eo=edge1.csv tid=id item=item S=2 sim=J th=0.2 psim=R pth=0.2
|
87
|
+
$ cat edge.csv
|
88
|
+
cluster%0,node1%1,node2%2,jaccard
|
89
|
+
#1_1,a,b,0.3333333333
|
90
|
+
#1_1,a,d,0.3333333333
|
91
|
+
#1_1,a,e,0.5
|
92
|
+
#1_1,b,d,0.3333333333
|
93
|
+
#1_1,b,e,0.2857142857
|
94
|
+
#1_1,d,e,0.5
|
95
|
+
#1_2,c,f,0.6666666667
|
96
|
+
#1_3,g,h,1
|
97
|
+
#2_1,#1_1,#1_2,0.375
|
98
|
+
|
99
|
+
$ cat node.csv
|
100
|
+
cluster%0,node%1,support,frequency,total
|
101
|
+
,i,0.09090909091,1,11
|
102
|
+
,j,0.09090909091,1,11
|
103
|
+
#1_1,a,0.3636363636,4,11
|
104
|
+
#1_1,b,0.3636363636,4,11
|
105
|
+
#1_1,d,0.3636363636,4,11
|
106
|
+
#1_1,e,0.4545454545,5,11
|
107
|
+
#1_2,c,0.2727272727,3,11
|
108
|
+
#1_2,f,0.1818181818,2,11
|
109
|
+
#1_3,g,0.1818181818,2,11
|
110
|
+
#1_3,h,0.1818181818,2,11
|
111
|
+
#2_1,#1_1,0.7272727273,8,11
|
112
|
+
#2_1,#1_2,0.2727272727,3,11
|
113
|
+
|
114
|
+
# Copyright(c) NYSOL 2012- All Rights Reserved.
|
115
|
+
EOF
|
116
|
+
exit
|
117
|
+
end
|
118
|
+
|
119
|
+
def ver()
|
120
|
+
STDERR.puts "version #{$version}"
|
121
|
+
exit
|
122
|
+
end
|
123
|
+
|
124
|
+
help() if ARGV.size <= 0 or ARGV[0]=="--help"
|
125
|
+
ver() if ARGV[0]=="--version"
|
126
|
+
|
127
|
+
args=MCMD::Margs.new(ARGV,"i=,tid=,item=,no=,eo=,s=,S=,sim=,th=,-node_support,psim=,pth=,psup=,-indirect,iter=,maxLevel=,-num,-verbose","i=,tid=,item=,eo=,no=")
|
128
|
+
|
129
|
+
# mcmdのメッセージは警告とエラーのみ
|
130
|
+
ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
|
131
|
+
|
132
|
+
#ワークファイルパス
|
133
|
+
if args.str("T=")!=nil then
|
134
|
+
ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
|
135
|
+
end
|
136
|
+
traFile= args.str("i=")
|
137
|
+
idFN = args.str("tid=")
|
138
|
+
itemFN = args.str("item=")
|
139
|
+
numtp = args.bool("-num")
|
140
|
+
|
141
|
+
onFile = args. file("no=", "w")
|
142
|
+
oeFile = args. file("eo=", "w")
|
143
|
+
|
144
|
+
# mtra2gc parameters
|
145
|
+
sp1 = args.str("s=")
|
146
|
+
sp2 = args.str("S=")
|
147
|
+
sim = args.str("sim=")
|
148
|
+
th = args.str("th=")
|
149
|
+
if sim==nil
|
150
|
+
simStr="support"
|
151
|
+
elsif sim=="J"
|
152
|
+
simStr="jaccard"
|
153
|
+
elsif sim=="P"
|
154
|
+
simStr="PMI"
|
155
|
+
elsif sim=="C"
|
156
|
+
simStr="confidence"
|
157
|
+
else
|
158
|
+
MCMD::errorLog("sim= takes J, P or C")
|
159
|
+
raise ArgumentError
|
160
|
+
end
|
161
|
+
node_support=args.bool("-node_support")
|
162
|
+
|
163
|
+
# polish parameters
|
164
|
+
psim = args.str("psim=")
|
165
|
+
pth = args.str("pth=")
|
166
|
+
psup = args.str("psup=")
|
167
|
+
indirect= args.bool("-indirect")
|
168
|
+
iter = args.int("iter=",1,1)
|
169
|
+
|
170
|
+
maxLevel = args.int("maxLevel=",0)
|
171
|
+
|
172
|
+
# traファイルから類似度グラフを作成
|
173
|
+
def runTra2gc(traFile,paramTra2gc,onFile,oeFile)
|
174
|
+
### mtra2gc.rb
|
175
|
+
system "mtra2gc.rb #{paramTra2gc} i=#{traFile} no=#{onFile} eo=#{oeFile}"
|
176
|
+
# node1%0,node2%1,support,frequency,frequency1,frequency2,total,lift,jaccard,PMI
|
177
|
+
# a,b,0.1818181818,2,4,4,11,1.375,0.3333333333,0.1868039815
|
178
|
+
# a,d,0.1818181818,2,4,4,11,1.375,0.3333333333,0.1868039815
|
179
|
+
# a,e,0.2727272727,3,4,5,11,1.65,0.5,0.385424341
|
180
|
+
# b,d,0.1818181818,2,4,4,11,1.375,0.3333333333,0.1868039815
|
181
|
+
# b,e,0.1818181818,2,4,5,11,1.1,0.2857142857,0.05590865902
|
182
|
+
# c,f,0.1818181818,2,3,2,11,3.6667,0.6666666667,0.7621554117
|
183
|
+
# d,e,0.2727272727,3,4,5,11,1.65,0.5,0.385424341
|
184
|
+
# g,h,0.1818181818,2,2,2,11,5.5,1,1
|
185
|
+
end
|
186
|
+
|
187
|
+
def runPolish(simgN,simgE,paramPolish,polishN,polishE)
|
188
|
+
## mpolishs.rb
|
189
|
+
system "mpolishing.rb ef=node1,node2 nf=node #{paramPolish} ni=#{simgN} ei=#{simgE} eo=#{polishE} no=#{polishN}"
|
190
|
+
# polishE
|
191
|
+
# node1%0,node2%1,jaccard
|
192
|
+
# a,b,0.3333333333
|
193
|
+
# a,d,0.3333333333
|
194
|
+
# a,e,0.5
|
195
|
+
# b,d,0.3333333333
|
196
|
+
# b,e,0.2857142857
|
197
|
+
# c,f,0.6666666667
|
198
|
+
# d,e,0.5
|
199
|
+
# g,h,1
|
200
|
+
end
|
201
|
+
|
202
|
+
def runClustering(niFile,eiFile,paramCluster,oFile)
|
203
|
+
### mccomp.rb
|
204
|
+
system "mccomp.rb nf=node ef=node1,node2 #{paramCluster} ni=#{niFile} ei=#{eiFile} o=#{oFile}"
|
205
|
+
# id%0,node,size
|
206
|
+
# 1,a,4
|
207
|
+
# 1,b,4
|
208
|
+
# 1,d,4
|
209
|
+
# 1,e,4
|
210
|
+
# 2,c,2
|
211
|
+
# 2,f,2
|
212
|
+
# 3,g,2
|
213
|
+
# 3,h,2
|
214
|
+
# 4,i,1
|
215
|
+
# 5,j,1
|
216
|
+
end
|
217
|
+
|
218
|
+
def runConvert(traFile,idFN,itemFN,level,clusterFile,mFile,oFile,maxNo)
|
219
|
+
temp=MCMD::Mtemp.new
|
220
|
+
xxfreq=temp.file
|
221
|
+
xxmf0 =temp.file
|
222
|
+
xxmf1 =temp.file
|
223
|
+
xxmf2 =temp.file
|
224
|
+
if maxNo then
|
225
|
+
# node-clusterマスター作成
|
226
|
+
# (1つのクラスタに1つのnodeはオリジナルアイテムをclusterに)
|
227
|
+
system "mcount k=id a=freq i=#{clusterFile} o=#{xxfreq}"
|
228
|
+
f=""
|
229
|
+
f << "mjoin k=id m=#{xxfreq} f=freq i=#{clusterFile} |"
|
230
|
+
f << "mselnum c='(1,]' f=freq u=#{xxmf0} |"
|
231
|
+
f << "mnumber k=id -B S=1 a=num |"
|
232
|
+
f << "mcal c='${num}+#{maxNo}' a=cluster o=#{xxmf1};"
|
233
|
+
f << "mcal c='$s{node}' a=cluster i=#{xxmf0} o=#{xxmf2};"
|
234
|
+
f << "mcat f=node,freq,cluster i=#{xxmf1},#{xxmf2} o=#{mFile}"
|
235
|
+
system(f)
|
236
|
+
f= ""
|
237
|
+
f << "mstats c=max f=cluster i=#{xxmf1}|"
|
238
|
+
f << "mcut f=cluster -nfno "
|
239
|
+
maxNo = `#{f}`.chomp.to_i
|
240
|
+
else
|
241
|
+
|
242
|
+
# node-clusterマスター作成
|
243
|
+
# (1つのクラスタに1つのnodeはオリジナルアイテムをclusterに)
|
244
|
+
system "mcount k=id a=freq i=#{clusterFile} o=#{xxfreq}"
|
245
|
+
f=""
|
246
|
+
f << "mjoin k=id m=#{xxfreq} f=freq i=#{clusterFile} |"
|
247
|
+
f << "mcal c='if(${freq}==1,$s{node},\"##{level}_\"+$s{id})' a=cluster o=#{mFile}"
|
248
|
+
system(f)
|
249
|
+
end
|
250
|
+
|
251
|
+
# トランザクションのitemをclusterに変換
|
252
|
+
f=""
|
253
|
+
f << "mjoin k=#{itemFN} K=node m=#{mFile} f=cluster i=#{traFile} -n |"
|
254
|
+
f << "mcal c='if(isnull($s{cluster}),$s{#{itemFN}},$s{cluster})' a=newItem |"
|
255
|
+
f << "mcut f=#{itemFN},cluster -r |"
|
256
|
+
f << "mfldname f=newItem:#{itemFN} |"
|
257
|
+
f << "muniq k=#{idFN},#{itemFN} o=#{oFile}"
|
258
|
+
system(f)
|
259
|
+
return maxNo
|
260
|
+
end
|
261
|
+
|
262
|
+
def runSaveNode(polishN,simgN,ncMap,oFile)
|
263
|
+
# save to his
|
264
|
+
# node情報
|
265
|
+
f=""
|
266
|
+
f << "mcut f=node i=#{polishN} |"
|
267
|
+
f << "mjoin k=node m=#{ncMap} f=cluster |"
|
268
|
+
f << "mjoin k=node m=#{simgN} f=support,frequency,total o=#{oFile}"
|
269
|
+
system(f)
|
270
|
+
end
|
271
|
+
|
272
|
+
def runSaveEdge(polishE,simgE,ncMap,simStr,oFile)
|
273
|
+
f=""
|
274
|
+
f << "mcut f=node1,node2 i=#{polishE} |"
|
275
|
+
f << "mjoin k=node1 K=node m=#{ncMap} f=cluster |"
|
276
|
+
f << "mjoin k=node1,node2 m=#{simgE} -n f=#{simStr} |"
|
277
|
+
f << "mcut f=node1,node2,cluster,#{simStr} o=#{oFile}"
|
278
|
+
system(f)
|
279
|
+
end
|
280
|
+
|
281
|
+
##########################################
|
282
|
+
# iFileのitemFN項目のitem番号最大値を取得
|
283
|
+
def getMaxNo(iFile,itemFN)
|
284
|
+
maxNo = 0;
|
285
|
+
f= ""
|
286
|
+
f << "mstats c=max f=#{itemFN} i=#{iFile} |"
|
287
|
+
f << "mcut f=#{itemFN} -nfno "
|
288
|
+
maxNo = `#{f}`.chomp.to_i
|
289
|
+
return maxNo
|
290
|
+
end
|
291
|
+
|
292
|
+
def outputNode(iPath,lastItemNo,oFile)
|
293
|
+
temp=MCMD::Mtemp.new
|
294
|
+
xxwk1=temp.file
|
295
|
+
xxwk2=temp.file
|
296
|
+
# ノードファイルの出力
|
297
|
+
# いずれのレベルにおいても孤立ノードのクラスタ行は削除する
|
298
|
+
# 条件: node==cluster and (nodeが他の行のnodeとして出現していない or nodeはクラスタ)
|
299
|
+
# node%0,support,frequency,total,cluster
|
300
|
+
# #1_1,0.7272727273,8,11,#2_1
|
301
|
+
# #1_2,0.2727272727,3,11,#2_1
|
302
|
+
# #1_3,0.1818181818,2,11,#1_3
|
303
|
+
# i,0.09090909091,1,11,i
|
304
|
+
# j,0.09090909091,1,11,j
|
305
|
+
f=""
|
306
|
+
f << "mcat i=#{iPath}/node* |"
|
307
|
+
f << "muniq k=cluster,node o=#{xxwk1}"
|
308
|
+
system(f)
|
309
|
+
system "mcut f=node i=#{xxwk1} | mcount k=node a=freq o=#{xxwk2}"
|
310
|
+
f=""
|
311
|
+
f << "mjoin k=node m=#{xxwk2} i=#{xxwk1} |"
|
312
|
+
if lastItemNo then
|
313
|
+
f << "msel c='$s{node}==$s{cluster} && (${freq}>1 || ${node}>#{lastItemNo})' -r |"
|
314
|
+
else
|
315
|
+
f << "msel c='$s{node}==$s{cluster} && (${freq}>1 || left($s{node},1)==\"#\")' -r |"
|
316
|
+
end
|
317
|
+
f << "mcal c='if($s{node}==$s{cluster},\"\",$s{cluster})' a=newClust|"
|
318
|
+
f << "mcut f=newClust:cluster,node,support,frequency,total |"
|
319
|
+
f << "msortf f=cluster,node o=#{oFile}"
|
320
|
+
system(f)
|
321
|
+
end
|
322
|
+
|
323
|
+
def outputEdge(iPath,simStr,oFile)
|
324
|
+
# エッジファイルの出力
|
325
|
+
# node1%0,node2%1,jaccard,cluster
|
326
|
+
# a,b,0.3333333333,#1_1
|
327
|
+
# a,d,0.3333333333,#1_1
|
328
|
+
# a,e,0.5,#1_1
|
329
|
+
f=""
|
330
|
+
f << "mcat i=#{iPath}/edge* |"
|
331
|
+
f << "mcut f=cluster,node1,node2,#{simStr} |"
|
332
|
+
f << "msortf f=cluster,node1,node2 o=#{oFile}"
|
333
|
+
system(f)
|
334
|
+
end
|
335
|
+
|
336
|
+
def hiPolish(traFile,idFN,itemFN,simStr,paramTra2gc,paramPolish,paramCluster,maxLevel,oPath,maxNo)
|
337
|
+
temp=MCMD::Mtemp.new
|
338
|
+
xxtra =temp.file
|
339
|
+
xxtra2 =temp.file
|
340
|
+
xxsimgN=temp.file
|
341
|
+
xxsimgE=temp.file
|
342
|
+
xxpolishN=temp.file
|
343
|
+
xxpolishE=temp.file
|
344
|
+
xxcluster=temp.file
|
345
|
+
xxncMap=temp.file
|
346
|
+
|
347
|
+
system "cp #{traFile} #{xxtra}"
|
348
|
+
counter=1
|
349
|
+
while true
|
350
|
+
# 繰り返し上限の判定
|
351
|
+
break if maxLevel!=0 and counter>maxLevel
|
352
|
+
|
353
|
+
# 類似度グラフの作成
|
354
|
+
runTra2gc(xxtra,paramTra2gc,xxsimgN,xxsimgE)
|
355
|
+
# system "head #{xxsimgE}"
|
356
|
+
# system "cat #{xxsimgE}"
|
357
|
+
# node1%0,node2%1,frequency,frequency1,frequency2,total,support,confidence,lift,jaccard,PMI
|
358
|
+
# a,b,2,4,4,11,0.1818181818,0.5,1.375,0.3333333333,0.1868039815
|
359
|
+
# a,d,2,4,4,11,0.1818181818,0.5,1.375,0.3333333333,0.1868039815
|
360
|
+
|
361
|
+
# polish実行
|
362
|
+
runPolish(xxsimgN,xxsimgE,paramPolish,xxpolishN,xxpolishE)
|
363
|
+
# system "cat #{xxpolishE}"
|
364
|
+
# node1%0,node2%1,support
|
365
|
+
# a,b,0.1818181818
|
366
|
+
# a,d,0.1818181818
|
367
|
+
# a,e,0.2727272727
|
368
|
+
|
369
|
+
# stop条件
|
370
|
+
size=MCMD::mrecount("i=#{xxpolishE}")
|
371
|
+
break if size==0
|
372
|
+
|
373
|
+
# クラスタリング(連結成分など)
|
374
|
+
runClustering(xxpolishN,xxpolishE,paramCluster,xxcluster)
|
375
|
+
# system "head #{xxcluster}"
|
376
|
+
# id%0,node,size
|
377
|
+
# 1,a,4
|
378
|
+
# 1,b,4
|
379
|
+
# 1,d,4
|
380
|
+
# 1,e,4
|
381
|
+
# 2,c,2
|
382
|
+
# 2,f,2
|
383
|
+
|
384
|
+
# traのitemをクラスタitemに変換
|
385
|
+
maxNo=runConvert(xxtra,idFN,itemFN,counter,xxcluster,xxncMap,xxtra2,maxNo)
|
386
|
+
# system "head #{xxncMap}"
|
387
|
+
# id%0,node,size,freq,cluster
|
388
|
+
# 1,a,4,4,#1_1
|
389
|
+
# 1,b,4,4,#1_1
|
390
|
+
# 1,d,4,4,#1_1
|
391
|
+
# 1,e,4,4,#1_1
|
392
|
+
# 2,c,2,2,#1_2
|
393
|
+
# 2,f,2,2,#1_2
|
394
|
+
# system "head #{xxtra2}"
|
395
|
+
# system "cat #{xxtra2}"
|
396
|
+
# id%0,item%1
|
397
|
+
# 0,i
|
398
|
+
# 1,#1_1
|
399
|
+
# 2,#1_1
|
400
|
+
# 3,#1_1
|
401
|
+
#
|
402
|
+
|
403
|
+
# node,edgeの保存
|
404
|
+
runSaveNode(xxpolishN,xxsimgN,xxncMap ,"#{oPath}/node_#{counter}")
|
405
|
+
runSaveEdge(xxpolishE,xxsimgE,xxncMap,simStr,"#{oPath}/edge_#{counter}")
|
406
|
+
# system "head #{oPath}/node_#{counter}"
|
407
|
+
# node%0,cluster,support,frequency,total
|
408
|
+
# a,#1_1,0.3636363636,4,11
|
409
|
+
# b,#1_1,0.3636363636,4,11
|
410
|
+
# system "head #{oPath}/edge_#{counter}"
|
411
|
+
# node1%0,node2%1,cluster,support
|
412
|
+
# a,b,#1_1,0.1818181818
|
413
|
+
# a,d,#1_1,0.1818181818
|
414
|
+
|
415
|
+
#system "cp #{xxtra} #{oPath}/tra_#{counter}"
|
416
|
+
# break if counter==3
|
417
|
+
counter+=1
|
418
|
+
system "cp #{xxtra2} #{xxtra}"
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
### mtra2gc用パラメータ
|
423
|
+
paramTra2gc=""
|
424
|
+
paramTra2gc << " tid=#{idFN}" if idFN
|
425
|
+
paramTra2gc << " item=#{itemFN}" if itemFN
|
426
|
+
paramTra2gc << " s=#{sp1}" if sp1
|
427
|
+
paramTra2gc << " S=#{sp2}" if sp2
|
428
|
+
paramTra2gc << " sim=#{sim}" if sim
|
429
|
+
paramTra2gc << " th=#{th}" if th
|
430
|
+
paramTra2gc << " -node_support" if node_support
|
431
|
+
paramTra2gc << " -num" if numtp
|
432
|
+
|
433
|
+
### polish用パラメータ
|
434
|
+
paramPolish=""
|
435
|
+
paramPolish << " sim=#{psim}" if psim
|
436
|
+
paramPolish << " th=#{pth}" if pth
|
437
|
+
paramPolish << " sup=#{psup}" if psup
|
438
|
+
paramPolish << " iter=#{iter}" if iter
|
439
|
+
paramPolish << " -indirect" if indirect
|
440
|
+
|
441
|
+
### クラスタリング用パラメータ
|
442
|
+
paramCluster=""
|
443
|
+
|
444
|
+
temp=MCMD::Mtemp.new
|
445
|
+
xxhis=temp.file
|
446
|
+
MCMD::mkDir(xxhis,true) # 併合過程の履歴dir
|
447
|
+
|
448
|
+
# numtpの場合、数値item最大値を取得しておく
|
449
|
+
maxNo=nil # hiPolishで更新され、最終的に最後のcluster item番号となる
|
450
|
+
lastItemNo=nil # オリジナルのtra上のitem番号の最大値
|
451
|
+
if numtp then
|
452
|
+
maxNo=getMaxNo(traFile,itemFN)
|
453
|
+
lastItemNo=maxNo
|
454
|
+
end
|
455
|
+
|
456
|
+
# 階層化研磨(hierarchical polishing)実行
|
457
|
+
hiPolish(traFile,idFN,itemFN,simStr,paramTra2gc,paramPolish,paramCluster,maxLevel,xxhis,maxNo)
|
458
|
+
|
459
|
+
# node,edgeの最終出力
|
460
|
+
outputNode(xxhis,lastItemNo,onFile)
|
461
|
+
outputEdge(xxhis,simStr,oeFile)
|
462
|
+
|
463
|
+
# end message
|
464
|
+
MCMD::endLog(args.cmdline)
|
465
|
+
|
data/bin/mitemset.rb
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "fileutils"
|
5
|
+
require "rubygems"
|
6
|
+
require "nysol/traDB.rb"
|
7
|
+
require "nysol/taxonomy.rb"
|
8
|
+
require "nysol/enumLcmEp"
|
9
|
+
require "nysol/enumLcmIs"
|
10
|
+
|
11
|
+
# ver="1.1" # コマンド版対応
|
12
|
+
# ver="1.2" # ヘルプ修正 2016/9/25
|
13
|
+
# ver="1.3" # maxSupにまつわるバグ修正 2017/1/14
|
14
|
+
$cmd=$0.sub(/.*\//,"")
|
15
|
+
$version="1.3"
|
16
|
+
|
17
|
+
def help
|
18
|
+
STDERR.puts <<EOF
|
19
|
+
----------------------------
|
20
|
+
#{$cmd} version #{$version}
|
21
|
+
----------------------------
|
22
|
+
概要) LCMにより多頻度アイテム集合を列挙する
|
23
|
+
特徴) 1) 分類階層を扱うことが可能
|
24
|
+
2) 頻出パターン, 飽和頻出パターン, 極大頻出パターンの3種類のパターンを列挙可能
|
25
|
+
3) クラスを指定することで、上記3パターンに関する顕在パターン(emerging patterns)を列挙可能
|
26
|
+
書式) #{$cmd} i= [x=] [O=] [tid=] [item=] [taxo=] [class=] [type=] [s=|S=] [sx=|Sx=] [l=] [u=] [p=] [top=] [-replaceTaxo] [T=] [--help]
|
27
|
+
|
28
|
+
例) #{$cmd} i=basket.csv tid=traID item=商品
|
29
|
+
|
30
|
+
ファイル名指定
|
31
|
+
i= : アイテム集合データベースファイル名【必須】
|
32
|
+
x= : taxonomyファイル名【オブション】*1
|
33
|
+
O= : 出力ディレクトリ名【オプション:default:./take_現在日付時刻】
|
34
|
+
|
35
|
+
項目名指定
|
36
|
+
tid= : トランザクションID項目名(i=上の項目名)【オプション:default="tid"】
|
37
|
+
item= : アイテム項目名(i=,t=上の項目名)【オプション:default="item"】
|
38
|
+
class= : クラス項目名(i=上の項目名)【オプション:default="class"】
|
39
|
+
taxo= : 分類項目名を指定する(x=上の項目名)【条件付き必須:x=】
|
40
|
+
|
41
|
+
列挙パラメータ
|
42
|
+
type= : 抽出するパターンの型【オプション:default:F, F:頻出集合, C:飽和集合, M:極大集合】
|
43
|
+
s= : 最小支持度(全トランザクション数に対する割合による指定)【オプション:default:0.05, 0以上1以下の実数】
|
44
|
+
S= : 最小支持度(件数による指定)【オプション】
|
45
|
+
sx= : 最大支持度(support)【オプション:default:1.0, 0以上1以下の実数】
|
46
|
+
Sx= : 最大支持件数【オプション】
|
47
|
+
l= : パターンサイズの下限(1以上20以下の整数)【オプション:default:制限なし】
|
48
|
+
u= : パターンサイズの上限(1以上20以下の整数)【オプション:default:制限なし】
|
49
|
+
p= : 最小事後確率【オプション:default:0.5】
|
50
|
+
g= : 最小増加率【オプション】
|
51
|
+
top= : 列挙するパターン数の上限【オプション:default:制限なし】*2
|
52
|
+
|
53
|
+
その他
|
54
|
+
-replaceTaxo : taxonomyを置換する
|
55
|
+
T= : ワークディレクトリ(default:/tmp)
|
56
|
+
--help : ヘルプの表示
|
57
|
+
|
58
|
+
注釈
|
59
|
+
*1 x=が指定されたとき、itemに対応するtaxonomyをトランザクションに追加して実行する。例えば、アイテムa,bのtaxonomyをX、c,dのtaxonomyをYとすると、あるトランザクションabdはabdXYとなる。
|
60
|
+
ただし-replaceTaxoが指定されると、taxonomyは追加ではなく置換して実行する。前例ではトランザクションabdはXYに置換される。
|
61
|
+
*2 top=が指定された時の動作: 例えばtop=10と指定すると、支持度が10番目高いパターンの支持度を最小支持度として頻出パターンを列挙する。よって、同じ支持度のパターンが複数個ある場合は10個以上のパターンが列挙されるかもしれない。
|
62
|
+
|
63
|
+
# より詳しい情報源 http://www.nysol.jp
|
64
|
+
# LCMの詳しい情報源 http://research.nii.ac.jp/~uno/codes-j.htm
|
65
|
+
# Copyright(c) NYSOL 2012- All Rights Reserved.
|
66
|
+
EOF
|
67
|
+
exit
|
68
|
+
end
|
69
|
+
|
70
|
+
def ver()
|
71
|
+
STDERR.puts "version #{$version}"
|
72
|
+
exit
|
73
|
+
end
|
74
|
+
|
75
|
+
help() if ARGV.size <= 0 or ARGV[0]=="--help"
|
76
|
+
ver() if ARGV[0]=="--version"
|
77
|
+
|
78
|
+
args=MCMD::Margs.new(ARGV,"i=,x=,O=,tid=,item=,class=,taxo=,type=,s=,S=,sx=,Sx=,g=,p=,-uniform,l=,u=,top=,T=,-replaceTaxo")
|
79
|
+
|
80
|
+
# コマンド実行可能確認
|
81
|
+
#exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD , "executable"))
|
82
|
+
#exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD_ZERO , "executable"))
|
83
|
+
#exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD_TRANS, "-v", "lcm_trans 1.0"))
|
84
|
+
|
85
|
+
# mcmdのメッセージは警告とエラーのみ
|
86
|
+
ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
|
87
|
+
|
88
|
+
#ワークファイルパス
|
89
|
+
if args.str("T=")!=nil then
|
90
|
+
ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
|
91
|
+
end
|
92
|
+
|
93
|
+
iFile = args.file("i=","r")
|
94
|
+
xFile = args.file("x=","r")
|
95
|
+
|
96
|
+
t=Time.now
|
97
|
+
outPath = args.file("O=", "w", "./take_#{sprintf('%d%02d%02d%02d%02d%02d',t.year,t.month,t.day,t.hour,t.min,t.sec)}")
|
98
|
+
|
99
|
+
idFN = args.field("tid=", iFile, "tid" )
|
100
|
+
itemFN = args.field("item=", iFile, "item" )
|
101
|
+
clsFN = args.field("class=",iFile, nil )
|
102
|
+
taxoFN = args.field("taxo=", xFile, "taxo" )
|
103
|
+
idFN = idFN["names"].join(",") if idFN
|
104
|
+
itemFN = itemFN["names"].join(",") if itemFN
|
105
|
+
clsFN = clsFN["names"].join(",") if clsFN
|
106
|
+
taxoFN = taxoFN["names"].join(",") if taxoFN
|
107
|
+
|
108
|
+
eArgs=Hash.new
|
109
|
+
eArgs["type" ] = args. str("type=","F" )
|
110
|
+
eArgs["minSup" ] = args.float("s=" ,0.05 ,0 ,1 ) # 最小サポート
|
111
|
+
eArgs["minCnt" ] = args. int("S=" ,nil ,1 ,nil ) # 最小サポート件数
|
112
|
+
eArgs["maxSup" ] = args.float("sx=" ,nil ,0 ,1 ) # 最小サポート
|
113
|
+
eArgs["maxCnt" ] = args. int("Sx=" ,nil ,1 ,nil ) # 最小サポート件数
|
114
|
+
eArgs["minProb"] = args.float("p=" ,0.5 ,0.5,1 ) # 最小事後確率
|
115
|
+
eArgs["minGR" ] = args.float("g=" ,nil ,1.0,nil ) # 最小GR
|
116
|
+
eArgs["uniform"] = args. bool("-uniform") # クラス事前確率を一様と考えるかどうか
|
117
|
+
eArgs["minLen" ] = args. int("l=" ,nil ,1 ,nil )
|
118
|
+
eArgs["maxLen" ] = args. int("u=" ,nil ,1 ,nil )
|
119
|
+
eArgs["top" ] = args. int("top=" ,nil,0)
|
120
|
+
|
121
|
+
eArgs["nomodel"] = true
|
122
|
+
|
123
|
+
if ["F","C","M"].index(eArgs["type"]) == nil then
|
124
|
+
raise "type= takes one of values: 'F', 'C', 'M'"
|
125
|
+
end
|
126
|
+
|
127
|
+
if eArgs["minLen"] and eArgs["maxLen"]
|
128
|
+
if eArgs["minLen"] > eArgs["maxLen"] then
|
129
|
+
raise "u= must be greater than or equal to l="
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
if eArgs["type"]=="M" then
|
134
|
+
eArgs["top"]=0
|
135
|
+
end
|
136
|
+
|
137
|
+
# V型DBの読み込み
|
138
|
+
db=TAKE::TraDB.new(iFile,idFN,itemFN,clsFN)
|
139
|
+
|
140
|
+
# taxonomyのセット
|
141
|
+
taxo=nil
|
142
|
+
if xFile!=nil then
|
143
|
+
taxo=TAKE::Taxonomy.new(xFile,itemFN,taxoFN)
|
144
|
+
if args.bool("-replaceTaxo") then
|
145
|
+
db.repTaxo(taxo) # taxonomyの置換
|
146
|
+
else
|
147
|
+
db.addTaxo(taxo) # taxonomyの追加
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# パターン列挙
|
152
|
+
lcm=nil
|
153
|
+
if clsFN then
|
154
|
+
lcm=TAKE::LcmEp.new(db);
|
155
|
+
lcm.enumerate(eArgs)
|
156
|
+
else
|
157
|
+
lcm=TAKE::LcmIs.new(db);
|
158
|
+
lcm.enumerate(eArgs)
|
159
|
+
end
|
160
|
+
|
161
|
+
# 出力
|
162
|
+
system("mkdir -p #{outPath}")
|
163
|
+
lcm.output(outPath)
|
164
|
+
|
165
|
+
MCMD::msgLog("The final results are in the directory `#{outPath}'")
|
166
|
+
|
167
|
+
# 終了メッセージ
|
168
|
+
MCMD::endLog(args.cmdline)
|