nysol-take 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +7 -0
  2. data/bin/mbiclique.rb +317 -0
  3. data/bin/mbipolish.rb +362 -0
  4. data/bin/mccomp.rb +235 -0
  5. data/bin/mclique.rb +295 -0
  6. data/bin/mclique2g.rb +105 -0
  7. data/bin/mcliqueInfo.rb +203 -0
  8. data/bin/mfriends.rb +202 -0
  9. data/bin/mgdiff.rb +252 -0
  10. data/bin/mhifriend.rb +456 -0
  11. data/bin/mhipolish.rb +465 -0
  12. data/bin/mitemset.rb +168 -0
  13. data/bin/mpal.rb +410 -0
  14. data/bin/mpolishing.rb +399 -0
  15. data/bin/msequence.rb +165 -0
  16. data/bin/mtra2g.rb +476 -0
  17. data/bin/mtra2gc.rb +360 -0
  18. data/ext/grhfilrun/extconf.rb +12 -0
  19. data/ext/grhfilrun/grhfilrun.c +85 -0
  20. data/ext/grhfilrun/src/_sspc.c +358 -0
  21. data/ext/grhfilrun/src/aheap.c +545 -0
  22. data/ext/grhfilrun/src/aheap.h +251 -0
  23. data/ext/grhfilrun/src/base.c +92 -0
  24. data/ext/grhfilrun/src/base.h +59 -0
  25. data/ext/grhfilrun/src/fstar.c +497 -0
  26. data/ext/grhfilrun/src/fstar.h +80 -0
  27. data/ext/grhfilrun/src/grhfil.c +214 -0
  28. data/ext/grhfilrun/src/itemset.c +713 -0
  29. data/ext/grhfilrun/src/itemset.h +170 -0
  30. data/ext/grhfilrun/src/problem.c +415 -0
  31. data/ext/grhfilrun/src/problem.h +179 -0
  32. data/ext/grhfilrun/src/queue.c +533 -0
  33. data/ext/grhfilrun/src/queue.h +182 -0
  34. data/ext/grhfilrun/src/sample.c +19 -0
  35. data/ext/grhfilrun/src/sspc.c +597 -0
  36. data/ext/grhfilrun/src/sspc2.c +491 -0
  37. data/ext/grhfilrun/src/stdlib2.c +1482 -0
  38. data/ext/grhfilrun/src/stdlib2.h +892 -0
  39. data/ext/grhfilrun/src/trsact.c +817 -0
  40. data/ext/grhfilrun/src/trsact.h +160 -0
  41. data/ext/grhfilrun/src/vec.c +745 -0
  42. data/ext/grhfilrun/src/vec.h +172 -0
  43. data/ext/lcmrun/extconf.rb +20 -0
  44. data/ext/lcmrun/lcmrun.cpp +99 -0
  45. data/ext/lcmrun/src/aheap.c +216 -0
  46. data/ext/lcmrun/src/aheap.h +111 -0
  47. data/ext/lcmrun/src/base.c +92 -0
  48. data/ext/lcmrun/src/base.h +59 -0
  49. data/ext/lcmrun/src/itemset.c +496 -0
  50. data/ext/lcmrun/src/itemset.h +157 -0
  51. data/ext/lcmrun/src/lcm.c +427 -0
  52. data/ext/lcmrun/src/problem.c +349 -0
  53. data/ext/lcmrun/src/problem.h +177 -0
  54. data/ext/lcmrun/src/queue.c +528 -0
  55. data/ext/lcmrun/src/queue.h +176 -0
  56. data/ext/lcmrun/src/sgraph.c +359 -0
  57. data/ext/lcmrun/src/sgraph.h +173 -0
  58. data/ext/lcmrun/src/stdlib2.c +1282 -0
  59. data/ext/lcmrun/src/stdlib2.h +823 -0
  60. data/ext/lcmrun/src/trsact.c +747 -0
  61. data/ext/lcmrun/src/trsact.h +159 -0
  62. data/ext/lcmrun/src/vec.c +731 -0
  63. data/ext/lcmrun/src/vec.h +171 -0
  64. data/ext/lcmseq0run/extconf.rb +20 -0
  65. data/ext/lcmseq0run/lcmseq0run.cpp +59 -0
  66. data/ext/lcmseq0run/src/aheap.c +216 -0
  67. data/ext/lcmseq0run/src/aheap.h +111 -0
  68. data/ext/lcmseq0run/src/base.c +92 -0
  69. data/ext/lcmseq0run/src/base.h +59 -0
  70. data/ext/lcmseq0run/src/itemset.c +518 -0
  71. data/ext/lcmseq0run/src/itemset.h +157 -0
  72. data/ext/lcmseq0run/src/itemset_zero.c +522 -0
  73. data/ext/lcmseq0run/src/lcm_seq.c +446 -0
  74. data/ext/lcmseq0run/src/lcm_seq_zero.c +446 -0
  75. data/ext/lcmseq0run/src/problem.c +439 -0
  76. data/ext/lcmseq0run/src/problem.h +179 -0
  77. data/ext/lcmseq0run/src/problem_zero.c +439 -0
  78. data/ext/lcmseq0run/src/queue.c +533 -0
  79. data/ext/lcmseq0run/src/queue.h +182 -0
  80. data/ext/lcmseq0run/src/stdlib2.c +1350 -0
  81. data/ext/lcmseq0run/src/stdlib2.h +864 -0
  82. data/ext/lcmseq0run/src/trsact.c +747 -0
  83. data/ext/lcmseq0run/src/trsact.h +159 -0
  84. data/ext/lcmseq0run/src/vec.c +779 -0
  85. data/ext/lcmseq0run/src/vec.h +172 -0
  86. data/ext/lcmseqrun/extconf.rb +20 -0
  87. data/ext/lcmseqrun/lcmseqrun.cpp +101 -0
  88. data/ext/lcmseqrun/src/aheap.c +216 -0
  89. data/ext/lcmseqrun/src/aheap.h +111 -0
  90. data/ext/lcmseqrun/src/base.c +92 -0
  91. data/ext/lcmseqrun/src/base.h +59 -0
  92. data/ext/lcmseqrun/src/itemset.c +518 -0
  93. data/ext/lcmseqrun/src/itemset.h +157 -0
  94. data/ext/lcmseqrun/src/itemset_zero.c +522 -0
  95. data/ext/lcmseqrun/src/lcm_seq.c +447 -0
  96. data/ext/lcmseqrun/src/lcm_seq_zero.c +446 -0
  97. data/ext/lcmseqrun/src/problem.c +439 -0
  98. data/ext/lcmseqrun/src/problem.h +179 -0
  99. data/ext/lcmseqrun/src/problem_zero.c +439 -0
  100. data/ext/lcmseqrun/src/queue.c +533 -0
  101. data/ext/lcmseqrun/src/queue.h +182 -0
  102. data/ext/lcmseqrun/src/stdlib2.c +1350 -0
  103. data/ext/lcmseqrun/src/stdlib2.h +864 -0
  104. data/ext/lcmseqrun/src/trsact.c +747 -0
  105. data/ext/lcmseqrun/src/trsact.h +159 -0
  106. data/ext/lcmseqrun/src/vec.c +779 -0
  107. data/ext/lcmseqrun/src/vec.h +172 -0
  108. data/ext/lcmtransrun/extconf.rb +18 -0
  109. data/ext/lcmtransrun/lcmtransrun.cpp +264 -0
  110. data/ext/macerun/extconf.rb +20 -0
  111. data/ext/macerun/macerun.cpp +57 -0
  112. data/ext/macerun/src/aheap.c +217 -0
  113. data/ext/macerun/src/aheap.h +112 -0
  114. data/ext/macerun/src/itemset.c +491 -0
  115. data/ext/macerun/src/itemset.h +158 -0
  116. data/ext/macerun/src/mace.c +503 -0
  117. data/ext/macerun/src/problem.c +346 -0
  118. data/ext/macerun/src/problem.h +174 -0
  119. data/ext/macerun/src/queue.c +529 -0
  120. data/ext/macerun/src/queue.h +177 -0
  121. data/ext/macerun/src/sgraph.c +360 -0
  122. data/ext/macerun/src/sgraph.h +174 -0
  123. data/ext/macerun/src/stdlib2.c +993 -0
  124. data/ext/macerun/src/stdlib2.h +811 -0
  125. data/ext/macerun/src/vec.c +634 -0
  126. data/ext/macerun/src/vec.h +170 -0
  127. data/ext/sspcrun/extconf.rb +20 -0
  128. data/ext/sspcrun/src/_sspc.c +358 -0
  129. data/ext/sspcrun/src/aheap.c +545 -0
  130. data/ext/sspcrun/src/aheap.h +251 -0
  131. data/ext/sspcrun/src/base.c +92 -0
  132. data/ext/sspcrun/src/base.h +59 -0
  133. data/ext/sspcrun/src/fstar.c +496 -0
  134. data/ext/sspcrun/src/fstar.h +80 -0
  135. data/ext/sspcrun/src/grhfil.c +213 -0
  136. data/ext/sspcrun/src/itemset.c +713 -0
  137. data/ext/sspcrun/src/itemset.h +170 -0
  138. data/ext/sspcrun/src/problem.c +415 -0
  139. data/ext/sspcrun/src/problem.h +179 -0
  140. data/ext/sspcrun/src/queue.c +533 -0
  141. data/ext/sspcrun/src/queue.h +182 -0
  142. data/ext/sspcrun/src/sample.c +19 -0
  143. data/ext/sspcrun/src/sspc.c +598 -0
  144. data/ext/sspcrun/src/sspc2.c +491 -0
  145. data/ext/sspcrun/src/stdlib2.c +1482 -0
  146. data/ext/sspcrun/src/stdlib2.h +892 -0
  147. data/ext/sspcrun/src/trsact.c +817 -0
  148. data/ext/sspcrun/src/trsact.h +160 -0
  149. data/ext/sspcrun/src/vec.c +745 -0
  150. data/ext/sspcrun/src/vec.h +172 -0
  151. data/ext/sspcrun/sspcrun.cpp +54 -0
  152. data/lib/nysol/enumLcmEp.rb +338 -0
  153. data/lib/nysol/enumLcmEsp.rb +284 -0
  154. data/lib/nysol/enumLcmIs.rb +275 -0
  155. data/lib/nysol/enumLcmSeq.rb +143 -0
  156. data/lib/nysol/items.rb +201 -0
  157. data/lib/nysol/seqDB.rb +256 -0
  158. data/lib/nysol/take.rb +39 -0
  159. data/lib/nysol/taxonomy.rb +113 -0
  160. data/lib/nysol/traDB.rb +257 -0
  161. 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)