OSDN Git Service

ver1.1
[nysol/mining.git] / take / lib / traDB.rb
diff --git a/take/lib/traDB.rb b/take/lib/traDB.rb
new file mode 100644 (file)
index 0000000..5bc1b96
--- /dev/null
@@ -0,0 +1,235 @@
+#!/usr/bin/env ruby
+# encoding: utf-8
+
+require "rubygems"
+require "mcmd"
+
+require "items.rb"
+
+module TAKE
+
+#=トランザクションデータクラス
+# 頻出パターンマイニングで使われるトランザクションデータを扱うクラス。
+# トランザクションファイルは、トランザクションID項目とアイテム集合項目から構成される。
+# アイテム集合は、スペースで区切られた文字列集合として表現される。
+#
+#===利用例
+# 以下tra.csvの内容
+# ---
+# items
+# a b d
+# a d e
+# c e
+# a d
+# c d e
+# c e
+# a d e
+#
+# 以下taxo.csvの内容
+# ---
+# item,taxo
+# a,X1
+# b,X1
+# c,X2
+# d,X2
+# e,X2
+#
+# 以下rubyスクリプト
+# ---
+# require 'rubygems'
+# require 'mining'
+#
+# tra=TraDB.new("tra.csv",nil,"items")
+# puts tra.file       # => ./1252813069_2179/dat/1
+# puts tra.numTraFile # => nil
+# puts tra.idFN       # => tid
+# puts tra.itemsetFN  # => items
+# puts tra.recCnt     # => 7
+# p    tra.items      # => #<Items:0x16a39ec @iItemFN=["items"],...
+#
+# taxo=Taxonomy.new("taxo.csv","item","taxo")
+# tra.addTaxo(taxo)
+# tra.mkNumTra
+# puts tra.numTraFile #=> ./1252813069_2179/dat/6
+# p    tra.items      #=> #<Items:0x16a39ec @iItemFN=["items", "taxo"],..., @taxonomy=#<Taxonomy:0x168ba7c ...
+#
+#=====./1252813069_2179/dat/1 の内容
+# tid,items
+# 1,a b d
+# 2,a d e
+# 3,c e
+# 4,a d
+# 5,c d e
+# 6,c e
+# 7,a d e
+#
+#=====./1252813069_2179/dat/6 の内容
+# 1 2 3 4 5 6 7
+# 1 2 4 6 7
+# 1 4 5 6 7
+# 3 5 7
+# 1 4 6 7
+# 3 4 5 7
+# 3 5 7
+# 1 4 5 6 7
+#
+class TraDB
+       # トランザクションファイル名
+       attr_reader :file
+
+       # トランザクションID項目名(String)
+       attr_reader :idFN
+
+       # アイテム集合項目名(String)
+       attr_reader :itemFN
+
+       # レコード数(Num)
+       attr_reader :recCnt
+
+       # トランザクションサイズ(Num)
+       attr_reader :size
+
+       # Itemsクラス
+       attr_reader :items
+
+       attr_reader :taxonomy
+
+private
+
+       #=== TraDBクラスの初期化
+       #
+       #====引数
+       # iFile: transactionファイル名
+       # iItemsetFN: iFile上のアイテム集合項目名
+       # idFN: 新しく命名するトランザクションID項目名
+       # itemsetFN: 新しく命名するアイテム集合項目名
+       #
+       #====機能
+       #* トランザクションIDとアイテム集合の2項目から構成するトランザクションデータを新たに作成する。
+       #* ID項目が指定されていなければ、1から始まる連番によってID項目を新規に作成する。
+       #* トランザクション件数(iFileのレコード件数)を計算する。
+       #* アイテム集合項目からItemsオブジェクトを生成する。
+       def initialize(iFile,idFN,itemFN,t_iFile=nil)
+               @temp=MCMD::Mtemp.new
+
+               @iFile  = iFile                    # 入力ファイル
+               @iPath  = File.expand_path(@iFile) # フルパス
+               @idFN   = idFN                     # トランザクションID項目名
+               @itemFN = itemFN                   # 入力ファイル上のアイテム集合項目名
+               @file   = @temp.file                 # 出力ファイル名
+               @t_iFile= t_iFile                  # テストファイル
+
+               # 入力ファイルのidがnilの場合は連番を生成して新たなid項目を作成する。
+               f=""
+               f << "mcut   f=#{@idFN},#{@itemFN} i=#{@iFile} |"
+               f << "msortf f=#{@idFN},#{@itemFN} |"
+               f << "muniq  k=#{@idFN},#{@itemFN} o=#{@file}"
+               system(f)
+
+               # レコード数の計算
+               @recCnt = MCMD::mrecount("i=#{@file}")
+
+               # トランザクション数の計算
+               tf=MCMD::Mtemp.new
+               xx1=tf.file
+               f=""
+               f << "mcut   f=#{@idFN} i=#{@file} |"
+               f << "muniq  k=#{@idFN} |"
+               f << "mcount a=__cnt    o=#{xx1}"
+               system(f)
+    tbl=MCMD::Mtable.new("i=#{xx1}")
+               num=tbl.name2num()["__cnt"]
+    @size = tbl.cell(num,0).to_i
+
+               # トランザクションデータからアイテムオブジェクトを生成
+               @items=TAKE::Items.new(@file,@itemFN)
+
+       end
+
+public
+       def replaceFile(train)
+
+               @file   = train
+
+               # レコード数の計算
+               @recCnt = MCMD::mrecount("i=#{@file}")
+
+               # トランザクション数の計算
+               tf=MCMD::Mtemp.new
+               xx1=tf.file
+               f=""
+               f << "mcut   f=#{@idFN} i=#{@file} |"
+               f << "muniq  k=#{@idFN} |"
+               f << "mcount a=__cnt    o=#{xx1}"
+               sysmte(f)
+    tbl=MCMD::Mtable.new("i=#{xx1}")
+               num=tbl.name2num()["__cnt"]
+    @size = tbl.cell(num,0).to_i
+
+       end
+
+       #=== taxonomyをトランザクションに追加
+       # トランザクションデータのアイテム集合に、対応するtaxonomyを追加する。
+       #
+       #====引数
+       # taxonomy: Taxonomyオブジェクト。
+       #
+       #====機能
+       #* トランザクションデータのアイテム集合項目におけるアイテム全てについて、対応するtaxonomyをアイテム集合として追加する。
+       def addTaxo(taxonomy)
+
+               @taxonomy=taxonomy
+
+               @items.addTaxo(@taxonomy) # アイテムクラスにtaxonomyを追加する
+
+               tFile =taxonomy.file
+               itemFN=taxonomy.itemFN
+               taxoFN=taxonomy.taxoFN
+
+               tf=MCMD::Mtemp.new
+               xx1=tf.file
+               f=""
+               f << "msortf f=#{@itemFN}                                    i=#{@file} |"
+               f << "mnjoin k=#{@itemFN} K=#{itemFN} f=#{taxoFN} m=#{tFile} |"
+               f << "mcut   f=#{@idFN},#{taxoFN}:#{@itemFN}                 o=#{xx1}"
+               system(f)
+
+               xx2=tf.file
+               f=""
+               f << "mcat                         i=#{@file},#{xx1} |"
+               f << "msortf f=#{@idFN},#{@itemFN} |"
+               f << "muniq  k=#{@idFN},#{@itemFN} o=#{xx2}"
+               system(f)
+               @file = @temp.file
+
+               FileUtils.mv(xx2,@file)
+
+       end
+
+       def repTaxo(taxonomy)
+
+               #@taxonomy=taxonomy #replaceの場合はtaxonomyを登録しない
+
+               @items.repTaxo(taxonomy) # アイテムクラスをtaxonomyで置換する
+
+               tFile =taxonomy.file
+               itemFN=taxonomy.itemFN
+               taxoFN=taxonomy.taxoFN
+
+               tf=MCMD::Mtemp.new
+               xx1=tf.file
+               f=""
+               f << "msortf f=#{@itemFN}                                    i=#{@file} |"
+               f << "mjoin  k=#{@itemFN} K=#{itemFN} f=#{taxoFN} m=#{tFile} |"
+               f << "mcut   f=#{@idFN},#{taxoFN}:#{@itemFN}                 |"
+               f << "msortf f=#{@idFN},#{@itemFN}                           |"
+               f << "muniq  k=#{@idFN},#{@itemFN}                           o=#{xx1}"
+               system(f)
+
+               @file = @temp.file
+               FileUtils.mv(xx1,@file)
+
+       end
+end
+
+end # module