svmredlight 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +35 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +44 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/examples/example1/example.rb +76 -0
- data/examples/example1/test.dat +601 -0
- data/examples/example1/train.dat +2001 -0
- data/examples/example1/words +9947 -0
- data/ext/extconf.rb +6 -0
- data/ext/svmredlight.c +762 -0
- data/lib/svmredlight/document.rb +23 -0
- data/lib/svmredlight/model.rb +22 -0
- data/lib/svmredlight.rb +4 -0
- data/svmredlight.gemspec +73 -0
- data/test/assets/model +3888 -0
- data/test/helper.rb +19 -0
- data/test/test_document.rb +55 -0
- data/test/test_model.rb +114 -0
- metadata +134 -0
data/test/helper.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'bundler'
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
Bundler.setup(:default, :development)
|
|
6
|
+
rescue Bundler::BundlerError => e
|
|
7
|
+
$stderr.puts e.message
|
|
8
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
|
9
|
+
exit e.status_code
|
|
10
|
+
end
|
|
11
|
+
require 'test/unit'
|
|
12
|
+
require 'shoulda'
|
|
13
|
+
require './lib/svmredlight'
|
|
14
|
+
|
|
15
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
16
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
17
|
+
|
|
18
|
+
class Test::Unit::TestCase
|
|
19
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require './test/helper'
|
|
2
|
+
include SVMLight
|
|
3
|
+
|
|
4
|
+
class TestDocument < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_create
|
|
7
|
+
d = Document.create(0, 0.5, 1, 0, [[1, 1.0 ], [4, 0.0] , [10, 0.0] ,[ 11, 0.5 ]])
|
|
8
|
+
assert_kind_of Document, d
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_create_should_accept_integer_as_feature_weight
|
|
12
|
+
d = Document.create(0, 0.5, 1, 0, [[1, 0 ], [4, 0.0] , [10, 0.0] ,[ 11, 0.5 ]])
|
|
13
|
+
assert_kind_of Document, d
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_create_using_new
|
|
17
|
+
d = Document.new({1 => 566.0, 4 => 133.0}, {docnum: 10, slackid: 1, queryid: 2, costfactor: 0.5})
|
|
18
|
+
|
|
19
|
+
assert_equal 10, d.docnum
|
|
20
|
+
assert_equal 1, d.slackid
|
|
21
|
+
assert_equal 2, d.queryid
|
|
22
|
+
assert_equal 0.5, d.costfactor
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_should_be_able_to_access_properties
|
|
26
|
+
d1 = Document.create(0, 0.5, 1, 0, [[1, 1.0 ], [10, 0.0 ], [20, 0.0], [21, 0.1 ]])
|
|
27
|
+
d2 = Document.create(1, 0.6, 2, 1, [[1, 1.0 ], [30, 0.0 ], [40, 0.0], [41, 0.1 ]])
|
|
28
|
+
|
|
29
|
+
assert_equal 0, d1.docnum
|
|
30
|
+
assert_equal 1, d2.docnum
|
|
31
|
+
|
|
32
|
+
assert_equal 1, d1.slackid
|
|
33
|
+
assert_equal 2, d2.slackid
|
|
34
|
+
|
|
35
|
+
assert_equal 0, d1.queryid
|
|
36
|
+
assert_equal 1, d2.queryid
|
|
37
|
+
|
|
38
|
+
assert_equal 0.5, d1.costfactor
|
|
39
|
+
assert_equal 0.6, d2.costfactor
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_all_word_numbers_should_be_greater_than_zero
|
|
43
|
+
assert_raise(ArgumentError){ Document.create(0, 0.5, 1, 0, [[0, 1.0 ], [10, 0.0 ], [20, 0.0], [21, 0.1 ]]) }
|
|
44
|
+
assert_raise(ArgumentError){ Document.create(1, 0.5, 1, 0, [[-1, 1.0 ], [30, 0.0 ], [40, 0.0], [41, 0.1 ]])}
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_create_with_no_array
|
|
48
|
+
assert_raise(TypeError) { Document.create(-1, 0, 1, 0, {}) }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_create_with_empty_array
|
|
52
|
+
assert_raise(ArgumentError) { Document.create(-1, 0, 1, 0 [])}
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
data/test/test_model.rb
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require './test/helper'
|
|
2
|
+
include SVMLight
|
|
3
|
+
|
|
4
|
+
class TestModel < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@features ||= [
|
|
8
|
+
[ [1,0.6], [11, 0.0], [34, 0.1] ],
|
|
9
|
+
[ [5,0.4], [15, 0.0], [30, 0.1] ],
|
|
10
|
+
[ [1,0.1], [13, 0.0], [31, 0.1] ],
|
|
11
|
+
[ [7,0.7], [15, 0.0], [35, 0.1] ],
|
|
12
|
+
[ [5,0.6], [19, 0.0], [44, 0.1] ],
|
|
13
|
+
]
|
|
14
|
+
@docs_and_labels ||= @features.each_with_index.map{|f,i| [ Document.create(i + 1, 1, 0, 0, f), i%2 * -1]}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_learn_classification_with_alpha
|
|
18
|
+
m = Model.new(:classification, @docs_and_labels, {}, {}, [1, 0.0] * 50)
|
|
19
|
+
assert_kind_of Model, m
|
|
20
|
+
|
|
21
|
+
@docs_and_labels.each_with_index do |item, i|
|
|
22
|
+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_learn_classification
|
|
27
|
+
m = Model.new(:classification, @docs_and_labels, {}, {}, nil)
|
|
28
|
+
assert_kind_of Model, m
|
|
29
|
+
assert_equal 44, m.total_words
|
|
30
|
+
assert_equal 5, m.totdoc
|
|
31
|
+
|
|
32
|
+
@docs_and_labels.each_with_index do |item, i|
|
|
33
|
+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_learn_classification_with_learn_params
|
|
39
|
+
|
|
40
|
+
learn_params = {
|
|
41
|
+
"predfile" => "custom_file",
|
|
42
|
+
"alphafile" => "alpha",
|
|
43
|
+
"biased_hyperplane" => false,
|
|
44
|
+
"sharedslack" => false,
|
|
45
|
+
"remove_inconsistent" => true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
m = Model.new(:classification, @docs_and_labels, learn_params, {}, nil)
|
|
49
|
+
assert_kind_of Model, m
|
|
50
|
+
|
|
51
|
+
@docs_and_labels.each_with_index do |item, i|
|
|
52
|
+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_learn_classification_with_invalid_learn_params
|
|
57
|
+
learn_params = {"svm_c" => -1}
|
|
58
|
+
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, learn_params, {}, nil)}
|
|
59
|
+
learn_params = {"svm_iter_to_shrink" => -1}
|
|
60
|
+
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, learn_params, {}, nil)}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_learn_classification_with_kernel_params
|
|
64
|
+
|
|
65
|
+
kernel_params = {
|
|
66
|
+
"poly_degree" => 3,
|
|
67
|
+
"rbf_gamma" => 0.5,
|
|
68
|
+
"coef_lin" => 0.4,
|
|
69
|
+
"coef_const" => 0.56
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
m = Model.new(:classification, @docs_and_labels, {}, kernel_params, nil)
|
|
73
|
+
assert_kind_of Model, m
|
|
74
|
+
|
|
75
|
+
@docs_and_labels.each_with_index do |item, i|
|
|
76
|
+
assert_kind_of Numeric, m.classify(item.first), "failed in item # #{i}"
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_learn_classification_with_learn_params_when_predfile_is_not_string
|
|
81
|
+
|
|
82
|
+
learn_params = { "predfile" => {}}
|
|
83
|
+
|
|
84
|
+
assert_raise(ArgumentError) do
|
|
85
|
+
Model.new(:classification, @docs_and_labels, learn_params, {}, [1, 0.0, 1])
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_learn_classification_fails_when_element_is_not_array
|
|
91
|
+
@docs_and_labels << []
|
|
92
|
+
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, {}, {}, nil)}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_learn_classification_fails_when_element_is_arry_with_the_wrong_types
|
|
96
|
+
assert_raises(ArgumentError){Model.new(:classification, @docs_and_labels, {}, {}, [1, {}] )}
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_read
|
|
100
|
+
assert m = Model.read_from_file('test/assets/model')
|
|
101
|
+
assert_equal 3877, m.support_vectors_count
|
|
102
|
+
assert_equal 39118, m.total_words
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_classify
|
|
106
|
+
m = Model.read_from_file('test/assets/model')
|
|
107
|
+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1.0, 0, 0, 0, 0.5 ].each_with_index.map{|v, i| [i + 1 ,v.to_f]} ) )
|
|
108
|
+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1.0, 0, 0, 0, 0.5 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
|
|
109
|
+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1, 0, 0, 0, 0.8, 0, 0 , 0 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
|
|
110
|
+
assert_kind_of Numeric, m.classify( Document.create(-1, 1, 0, 0,[1, 0.5, 0, 0, 0, 0 , 0 ].each_with_index.map{|v, i| [i + 1,v.to_f]}) )
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
metadata
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: svmredlight
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease:
|
|
5
|
+
version: 0.1.0
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Camilo Lopez
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
|
|
13
|
+
date: 2011-09-11 00:00:00 -04:00
|
|
14
|
+
default_executable:
|
|
15
|
+
dependencies:
|
|
16
|
+
- !ruby/object:Gem::Dependency
|
|
17
|
+
name: shoulda
|
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
19
|
+
none: false
|
|
20
|
+
requirements:
|
|
21
|
+
- - ">="
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: "0"
|
|
24
|
+
type: :development
|
|
25
|
+
prerelease: false
|
|
26
|
+
version_requirements: *id001
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: bundler
|
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
30
|
+
none: false
|
|
31
|
+
requirements:
|
|
32
|
+
- - ~>
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: 1.0.0
|
|
35
|
+
type: :development
|
|
36
|
+
prerelease: false
|
|
37
|
+
version_requirements: *id002
|
|
38
|
+
- !ruby/object:Gem::Dependency
|
|
39
|
+
name: jeweler
|
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ~>
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: 1.6.0
|
|
46
|
+
type: :development
|
|
47
|
+
prerelease: false
|
|
48
|
+
version_requirements: *id003
|
|
49
|
+
- !ruby/object:Gem::Dependency
|
|
50
|
+
name: ZenTest
|
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
52
|
+
none: false
|
|
53
|
+
requirements:
|
|
54
|
+
- - ">="
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: "0"
|
|
57
|
+
type: :development
|
|
58
|
+
prerelease: false
|
|
59
|
+
version_requirements: *id004
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: ruby-debug19
|
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
63
|
+
none: false
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: "0"
|
|
68
|
+
type: :development
|
|
69
|
+
prerelease: false
|
|
70
|
+
version_requirements: *id005
|
|
71
|
+
description: Ruby interface to SVMLight
|
|
72
|
+
email: camilo@camilolopez.com
|
|
73
|
+
executables: []
|
|
74
|
+
|
|
75
|
+
extensions:
|
|
76
|
+
- ext/extconf.rb
|
|
77
|
+
extra_rdoc_files:
|
|
78
|
+
- LICENSE.txt
|
|
79
|
+
- README.rdoc
|
|
80
|
+
files:
|
|
81
|
+
- .document
|
|
82
|
+
- Gemfile
|
|
83
|
+
- Gemfile.lock
|
|
84
|
+
- LICENSE.txt
|
|
85
|
+
- README.rdoc
|
|
86
|
+
- Rakefile
|
|
87
|
+
- VERSION
|
|
88
|
+
- examples/example1/example.rb
|
|
89
|
+
- examples/example1/test.dat
|
|
90
|
+
- examples/example1/train.dat
|
|
91
|
+
- examples/example1/words
|
|
92
|
+
- ext/extconf.rb
|
|
93
|
+
- ext/svmredlight.c
|
|
94
|
+
- lib/svmredlight.rb
|
|
95
|
+
- lib/svmredlight/document.rb
|
|
96
|
+
- lib/svmredlight/model.rb
|
|
97
|
+
- svmredlight.gemspec
|
|
98
|
+
- test/assets/model
|
|
99
|
+
- test/helper.rb
|
|
100
|
+
- test/test_document.rb
|
|
101
|
+
- test/test_model.rb
|
|
102
|
+
has_rdoc: true
|
|
103
|
+
homepage: http://github.com/camilo/svmredlight
|
|
104
|
+
licenses:
|
|
105
|
+
- MIT
|
|
106
|
+
post_install_message:
|
|
107
|
+
rdoc_options: []
|
|
108
|
+
|
|
109
|
+
require_paths:
|
|
110
|
+
- lib
|
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
|
+
none: false
|
|
113
|
+
requirements:
|
|
114
|
+
- - ">="
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
hash: 2455726499843414946
|
|
117
|
+
segments:
|
|
118
|
+
- 0
|
|
119
|
+
version: "0"
|
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
|
+
none: false
|
|
122
|
+
requirements:
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: "0"
|
|
126
|
+
requirements: []
|
|
127
|
+
|
|
128
|
+
rubyforge_project:
|
|
129
|
+
rubygems_version: 1.5.0
|
|
130
|
+
signing_key:
|
|
131
|
+
specification_version: 3
|
|
132
|
+
summary: Ruby interface to SVMLight
|
|
133
|
+
test_files: []
|
|
134
|
+
|