rubyfca 0.2.5.1 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/bin/rubyfca +4 -3
- data/lib/rubyfca.rb +50 -7
- data/rubyfca.gemspec +2 -2
- metadata +2 -2
data/README.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.6
|
data/bin/rubyfca
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
2
3
|
|
3
4
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
4
5
|
require 'trollop'
|
@@ -18,7 +19,7 @@ Usage:
|
|
18
19
|
|
19
20
|
where:
|
20
21
|
<source file>
|
21
|
-
".cxt"
|
22
|
+
".cxt", ".csv"
|
22
23
|
<output file>
|
23
24
|
."dot", ".png", ".jpg", or ".eps"
|
24
25
|
[options]:
|
@@ -51,7 +52,7 @@ if (input_type !~ /\A(cxt|csv)\z/ || output_type !~ /\A(dot|png|jpg|eps)\z/)
|
|
51
52
|
end
|
52
53
|
|
53
54
|
#
|
54
|
-
# input
|
55
|
+
# input data is kept as plain text
|
55
56
|
#
|
56
57
|
f = File.open(filename1, "r")
|
57
58
|
inputdata = f.read
|
@@ -72,7 +73,7 @@ end
|
|
72
73
|
# context data is converted to a hash table
|
73
74
|
#
|
74
75
|
begin
|
75
|
-
ctxt = FormalContext.new(inputdata, !opts[:full])
|
76
|
+
ctxt = FormalContext.new(inputdata, input_type, !opts[:full])
|
76
77
|
ctxt.calcurate
|
77
78
|
# rescue => e
|
78
79
|
# puts e
|
data/lib/rubyfca.rb
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
## Copyright:: Copyright 2009 Yoichiro Hasebe and Kow Kuroda
|
5
5
|
## License:: GNU GPL version 3
|
6
6
|
|
7
|
-
|
7
|
+
# -*- coding: utf-8 -*-
|
8
|
+
|
9
|
+
require 'csv'
|
8
10
|
require 'ruby_graphviz'
|
9
11
|
|
10
12
|
private
|
@@ -39,22 +41,63 @@ end
|
|
39
41
|
class FormalContext
|
40
42
|
|
41
43
|
## Converte cxt data to three basic structures of objects, attributes, and matrix
|
42
|
-
def initialize(input, label_contraction = false)
|
44
|
+
def initialize(input, mode, label_contraction = false)
|
43
45
|
if input.size == 0
|
44
46
|
showerror("File is empty", 1)
|
45
47
|
end
|
48
|
+
begin
|
49
|
+
case mode
|
50
|
+
when /cxt\z/
|
51
|
+
read_cxt(input)
|
52
|
+
when /csv\z/
|
53
|
+
read_csv(input)
|
54
|
+
end
|
55
|
+
rescue => e
|
56
|
+
showerror("Input data contains a syntax problem.", 1)
|
57
|
+
end
|
58
|
+
@label_contraction = label_contraction
|
59
|
+
end
|
60
|
+
|
61
|
+
## process cxt data
|
62
|
+
def read_cxt(input)
|
46
63
|
lines = input.split
|
47
64
|
t1 = 3
|
48
65
|
if (lines[0] !~ /B/i || (2 * lines[1].to_i + lines[2].to_i + t1) != lines.size)
|
49
66
|
showerror("Wrong cxt format!", 1)
|
50
67
|
end
|
51
|
-
|
52
|
-
@label_contraction = label_contraction
|
53
|
-
|
54
68
|
@objects = lines[t1..(lines[1].to_i + t1 - 1)]
|
55
69
|
@attributes = lines[(lines[1].to_i + t1) .. (lines[1].to_i + lines[2].to_i + t1 - 1)]
|
56
70
|
lines = lines[(lines[1].to_i + lines[2].to_i + t1) .. lines.size]
|
57
|
-
@matrix = changecrosssymbol("X", "\\.", lines)
|
71
|
+
@matrix = changecrosssymbol("X", "\\.", lines)
|
72
|
+
end
|
73
|
+
|
74
|
+
# process csv data using the standard csv library
|
75
|
+
def read_csv(input)
|
76
|
+
input = remove_blank(input)
|
77
|
+
data = CSV.parse(input)
|
78
|
+
@objects = trim_ary(data.transpose.first[1..-1])
|
79
|
+
@attributes = trim_ary(data.first[1..-1])
|
80
|
+
@matrix = []
|
81
|
+
data[1..-1].each do |line|
|
82
|
+
@matrix << line[1..-1].collect { |cell| /x/i =~ cell ? 1 : 0 }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def remove_blank(input)
|
87
|
+
blank_removed = ""
|
88
|
+
input.each do |line|
|
89
|
+
unless /^\s*$/ =~ line
|
90
|
+
blank_removed << line
|
91
|
+
end
|
92
|
+
end
|
93
|
+
blank_removed
|
94
|
+
end
|
95
|
+
|
96
|
+
def trim_ary(ary)
|
97
|
+
newary = ary.collect do |cell|
|
98
|
+
cell.strip
|
99
|
+
end
|
100
|
+
newary
|
58
101
|
end
|
59
102
|
|
60
103
|
## Apply a formal concept analysis on the matrix
|
@@ -345,7 +388,7 @@ class FormalContext
|
|
345
388
|
"<tr><td balign=\"left\" align=\"left\" bgcolor=\"#{obj_color}\">#{obj_str}</td></tr>" +
|
346
389
|
"</table>>"
|
347
390
|
|
348
|
-
if !attrfull.empty?
|
391
|
+
if !attrfull.empty? or !objfull.empty?
|
349
392
|
legend.node("cl#{concept_id}k", :label => concept_id, :style => "invis")
|
350
393
|
legend.node("cl#{concept_id}v", :label => leg, :fillcolor => "white")
|
351
394
|
legend.rank("cl#{concept_id}k", "cl#{concept_id}v", :style => "invis", :length => "0.0")
|
data/rubyfca.gemspec
CHANGED
@@ -5,8 +5,8 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rubyfca}
|
8
|
-
s.version = "0.2.
|
9
|
-
s.required_ruby_version = ">=1.8.
|
8
|
+
s.version = "0.2.6"
|
9
|
+
s.required_ruby_version = ">=1.8.6"
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Yoichiro Hasebe", "Kow Kuroda"]
|
12
12
|
s.date = %q{2009-09-14}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyfca
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoichiro Hasebe
|
@@ -60,7 +60,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
60
60
|
requirements:
|
61
61
|
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 1.8.
|
63
|
+
version: 1.8.6
|
64
64
|
version:
|
65
65
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|