wapiti 0.0.1

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.
Files changed (63) hide show
  1. data/.autotest +13 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE +30 -0
  6. data/README.md +153 -0
  7. data/Rakefile +33 -0
  8. data/ext/wapiti/bcd.c +392 -0
  9. data/ext/wapiti/decoder.c +535 -0
  10. data/ext/wapiti/decoder.h +46 -0
  11. data/ext/wapiti/extconf.rb +8 -0
  12. data/ext/wapiti/gradient.c +818 -0
  13. data/ext/wapiti/gradient.h +81 -0
  14. data/ext/wapiti/lbfgs.c +294 -0
  15. data/ext/wapiti/model.c +296 -0
  16. data/ext/wapiti/model.h +100 -0
  17. data/ext/wapiti/native.c +1238 -0
  18. data/ext/wapiti/native.h +15 -0
  19. data/ext/wapiti/options.c +278 -0
  20. data/ext/wapiti/options.h +91 -0
  21. data/ext/wapiti/pattern.c +395 -0
  22. data/ext/wapiti/pattern.h +56 -0
  23. data/ext/wapiti/progress.c +167 -0
  24. data/ext/wapiti/progress.h +43 -0
  25. data/ext/wapiti/quark.c +272 -0
  26. data/ext/wapiti/quark.h +46 -0
  27. data/ext/wapiti/reader.c +553 -0
  28. data/ext/wapiti/reader.h +73 -0
  29. data/ext/wapiti/rprop.c +191 -0
  30. data/ext/wapiti/sequence.h +148 -0
  31. data/ext/wapiti/sgdl1.c +218 -0
  32. data/ext/wapiti/thread.c +171 -0
  33. data/ext/wapiti/thread.h +42 -0
  34. data/ext/wapiti/tools.c +202 -0
  35. data/ext/wapiti/tools.h +54 -0
  36. data/ext/wapiti/trainers.h +39 -0
  37. data/ext/wapiti/vmath.c +372 -0
  38. data/ext/wapiti/vmath.h +51 -0
  39. data/ext/wapiti/wapiti.c +288 -0
  40. data/ext/wapiti/wapiti.h +45 -0
  41. data/lib/wapiti.rb +30 -0
  42. data/lib/wapiti/errors.rb +17 -0
  43. data/lib/wapiti/model.rb +49 -0
  44. data/lib/wapiti/options.rb +113 -0
  45. data/lib/wapiti/utility.rb +15 -0
  46. data/lib/wapiti/version.rb +3 -0
  47. data/spec/fixtures/ch.mod +18550 -0
  48. data/spec/fixtures/chpattern.txt +52 -0
  49. data/spec/fixtures/chtest.txt +1973 -0
  50. data/spec/fixtures/chtrain.txt +19995 -0
  51. data/spec/fixtures/nppattern.txt +52 -0
  52. data/spec/fixtures/nptest.txt +1973 -0
  53. data/spec/fixtures/nptrain.txt +19995 -0
  54. data/spec/fixtures/pattern.txt +14 -0
  55. data/spec/fixtures/test.txt +60000 -0
  56. data/spec/fixtures/train.txt +1200 -0
  57. data/spec/spec_helper.rb +21 -0
  58. data/spec/wapiti/model_spec.rb +173 -0
  59. data/spec/wapiti/native_spec.rb +12 -0
  60. data/spec/wapiti/options_spec.rb +175 -0
  61. data/spec/wapiti/utility_spec.rb +22 -0
  62. data/wapiti.gemspec +35 -0
  63. metadata +178 -0
@@ -0,0 +1,21 @@
1
+ require 'wapiti'
2
+
3
+ require 'fileutils'
4
+ require 'tempfile'
5
+
6
+ RSpec::Matchers.define :be_valid_model do
7
+ match do |model|
8
+ model.is_a?(Wapiti::Model) && model.nlbl > 0
9
+ end
10
+ end
11
+
12
+ RSpec::Matchers.define :be_valid_model_file do
13
+ match do |path|
14
+ File.exists?(path) && !File.open(path).read.empty?
15
+ end
16
+ end
17
+
18
+
19
+ RSpec.configuration do |c|
20
+ c.include(FileUtils)
21
+ end
@@ -0,0 +1,173 @@
1
+ module Wapiti
2
+ describe 'Model' do
3
+
4
+ describe '.train' do
5
+ context 'given sufficient options' do
6
+ let(:pattern) { File.expand_path('../../fixtures/pattern.txt', __FILE__) }
7
+ let(:input) { File.expand_path('../../fixtures/train.txt', __FILE__) }
8
+
9
+ it 'returns a valid model instance' do
10
+ Model.train(input, :pattern => pattern).labels.should == (1..6).map(&:to_s)
11
+ end
12
+
13
+ end
14
+ end
15
+
16
+ describe 'initialization' do
17
+
18
+ context 'when passed no arguments' do
19
+ it 'creates a new model with default options' do
20
+ m = Model.new
21
+ m.should_not be nil
22
+ m.options.should be_instance_of(Options)
23
+ m.nlbl.should == 0
24
+ m.nobs.should == 0
25
+ end
26
+ end
27
+
28
+ context 'when passed more than one argument' do
29
+ it 'should raise an error' do
30
+ expect { Model.new(1,2) }.to raise_error
31
+ end
32
+ end
33
+
34
+ context 'when passed a hash' do
35
+ let(:options) { { :threads => 42 } }
36
+
37
+ it 'should create the options from the hash' do
38
+ Model.new(options).options[:threads].should == 42
39
+ end
40
+ end
41
+
42
+ context 'when passed an options instance' do
43
+ let(:options) { Options.new(:threads => 42) }
44
+
45
+ it 'should create the options from the hash' do
46
+ Model.new(options).options[:threads].should == 42
47
+ end
48
+ end
49
+
50
+ context 'when passed something other than a hash or an options instance' do
51
+ it 'should raise an error' do
52
+ expect { Model.new(1) }.to raise_error
53
+ expect { Model.new(nil) }.to raise_error
54
+ expect { Model.new(true) }.to raise_error
55
+ expect { Model.new('foo') }.to raise_error
56
+ end
57
+ end
58
+
59
+ context 'when called with a block' do
60
+ it 'should pass the options instance to the block' do
61
+ Model.new(:threads => 42) { |o| o.threads = 23 }.options.threads.should == 23
62
+ end
63
+ end
64
+ end
65
+
66
+ describe '#options' do
67
+ it 'returns the options for training' do
68
+ Model.new.options.should be_instance_of(Options)
69
+ end
70
+ end
71
+
72
+ describe '#labels' do
73
+ it 'returns the number of labels (0 by default)' do
74
+ Model.new.nlbl.should == 0
75
+ end
76
+ end
77
+
78
+ describe '#observations' do
79
+ it 'returns the number of observations (0 by default)' do
80
+ Model.new.observations.should == 0
81
+ end
82
+ end
83
+
84
+ describe '#features' do
85
+ it 'returns the number of features (0 by default)' do
86
+ Model.new.features.should == 0
87
+ end
88
+ end
89
+
90
+ describe '#total' do
91
+ it 'returns the total training time (0.0 by default)' do
92
+ Model.new.total.should == 0.0
93
+ end
94
+ end
95
+
96
+ describe '#train' do
97
+ let(:model) { Model.new(:pattern => File.expand_path('../../fixtures/pattern.txt', __FILE__)) }
98
+ let(:data) { File.expand_path('../../fixtures/train.txt', __FILE__) }
99
+
100
+ it 'accepts a filename as input' do
101
+ model.train(data).nlbl.should == 6
102
+ end
103
+
104
+ it 'accepts a data array' do
105
+ # sequence = []
106
+ # File.open(data).each_line do |line|
107
+ #
108
+ # end
109
+ #
110
+ # model.train([]).nlbl.should == 6
111
+ end
112
+
113
+ end
114
+
115
+ describe '#label' do
116
+
117
+ context 'given an empty model' do
118
+
119
+ end
120
+
121
+ context 'given a trained model' do
122
+ let(:model) { Model.load(File.expand_path('../../fixtures/ch.mod', __FILE__)) }
123
+
124
+ context 'when passed an array of arrays' do
125
+ let(:input) { [['Hello NN B-VP', ', , O', 'world NN B-NP', '! ! O']] }
126
+
127
+ it 'returns an array of token-label pairs' do
128
+ labels = model.label(input)
129
+ labels[0].map(&:first).should == input[0]
130
+ labels[0].map(&:last).should == %w{ B-NP O B-NP O }
131
+ end
132
+
133
+ it 'yields each token/label pair to the supplied block' do
134
+ labels = model.label(input) do |token, label|
135
+ [token.downcase, label.downcase]
136
+ end
137
+ labels[0].map(&:last).should == %w{ b-np o b-np o }
138
+ end
139
+
140
+ end
141
+
142
+
143
+ context 'when passed a filename' do
144
+ let(:input) { File.expand_path('../../fixtures/chtest.txt', __FILE__) }
145
+
146
+ it 'returns an array of token-label pairs' do
147
+ labels = model.label(input)
148
+ labels.should have(77).elements
149
+ labels[0].take(5).map(&:last).should == %w{ B-NP B-PP B-NP I-NP B-VP }
150
+ end
151
+ end
152
+
153
+ end
154
+
155
+ end
156
+
157
+ describe '#labels' do
158
+ it 'returns an empty list by default' do
159
+ Model.new.labels.should be_empty
160
+ end
161
+
162
+ context 'given a trained model' do
163
+ let(:model) { Model.load(File.expand_path('../../fixtures/ch.mod', __FILE__)) }
164
+
165
+ it 'returns a list of all known labels' do
166
+ model.labels.should have(model.nlbl).elements
167
+ end
168
+ end
169
+ end
170
+
171
+
172
+ end
173
+ end
@@ -0,0 +1,12 @@
1
+ module Wapiti
2
+ describe 'Native Extension Module' do
3
+
4
+ it 'should define the wapiti version string' do
5
+ Native::VERSION.should match /^[\d\.]+$/
6
+ end
7
+
8
+ it { Native.should respond_to(:wapiti) }
9
+ it { Native.should respond_to(:label) }
10
+
11
+ end
12
+ end
@@ -0,0 +1,175 @@
1
+ module Wapiti
2
+ describe 'Options' do
3
+
4
+ let(:options) { Options.new }
5
+
6
+ it { Options.should be_an_instance_of(Class) }
7
+
8
+ it { options.should_not be nil }
9
+
10
+ describe '.defaults' do
11
+ it 'returns a hash with the default options' do
12
+ Options.defaults.keys.map(&:to_s).sort.should == Options.attribute_names.map(&:to_s)
13
+ end
14
+ end
15
+
16
+ describe '#initialize' do
17
+
18
+ it 'should fail if called with more than one parameter' do
19
+ expect { Options.new(1,2) }.to raise_error
20
+ end
21
+
22
+ it 'should fail if called with a parameter that is no hash' do
23
+ expect { Options.new([]) }.to raise_error
24
+ end
25
+
26
+ it 'should set defaults according to the supplied hash' do
27
+ Options.new(:compact => true).should be_compact
28
+ end
29
+
30
+ it 'should accept and execute a self-yielding block' do
31
+ opt = Options.new(:compact => true) { |o| o.sparse = true }
32
+ opt.should be_compact
33
+ opt.should be_sparse
34
+ end
35
+
36
+ end
37
+
38
+ describe '#update' do
39
+ it 'sets all option values according to the given hash' do
40
+ lambda { options.update( :threads => 2 ) }.should change { options.threads }.from(1).to(2)
41
+ end
42
+ end
43
+
44
+ describe '#threads' do
45
+ it 'returns 1 by default' do
46
+ options.threads.should == 1
47
+ end
48
+ end
49
+
50
+ describe '#threads=' do
51
+ it 'sets threads to the given value' do
52
+ lambda { options.threads = 2 }.should change { options.threads }.from(1).to(2)
53
+ end
54
+ end
55
+
56
+ describe '#jobsize' do
57
+ it 'returns 64 by default' do
58
+ options.jobsize.should == 64
59
+ end
60
+ end
61
+
62
+ describe '#jobsize=' do
63
+ it 'sets jobsize to the given value' do
64
+ lambda { options.jobsize = 128 }.should change { options.jobsize }.by(64)
65
+ end
66
+ end
67
+
68
+ describe '#maxiter' do
69
+ it 'returns a large number by default' do
70
+ options.maxiter.should > 0
71
+ end
72
+ end
73
+
74
+ describe '#maxiter=' do
75
+ it 'sets maxiter to the given value' do
76
+ lambda { options.maxiter = 20 }.should change { options.maxiter }.to(20)
77
+ end
78
+ end
79
+
80
+ describe '#stop_window' do
81
+ it 'returns 5 by default' do
82
+ options.stop_window.should == 5
83
+ end
84
+ end
85
+
86
+ describe '#stop_window=' do
87
+ it 'sets stop_window to the given value' do
88
+ lambda { options.stop_window = 20 }.should change { options.stop_window }.by(15)
89
+ end
90
+ end
91
+
92
+ describe '#convergence_window' do
93
+ it 'returns 5 by default' do
94
+ options.convergence_window.should == 5
95
+ end
96
+ end
97
+
98
+ describe '#convergence_window=' do
99
+ it 'sets convergence_window to the given value' do
100
+ lambda { options.convergence_window = 20 }.should change { options.convergence_window }.by(15)
101
+ end
102
+ end
103
+
104
+
105
+ describe '#stop_epsilon' do
106
+ it 'returns 0.02 by default' do
107
+ options.stop_epsilon.should == 0.02
108
+ end
109
+ end
110
+
111
+ describe '#stop_epsilon=' do
112
+ it 'sets stop_epsilon to the given value' do
113
+ lambda { options.stop_epsilon = 0.35 }.should change { options.stop_epsilon }
114
+ end
115
+ end
116
+
117
+ describe '#rho1' do
118
+ it 'returns 0.5 by default' do
119
+ options.rho1.should == 0.5
120
+ end
121
+ end
122
+
123
+ describe '#rho1=' do
124
+ it 'sets rho1 to the given value' do
125
+ lambda { options.rho1 = 2.5 }.should change { options.rho1 }.by(2)
126
+ end
127
+ end
128
+
129
+ describe '#rho2' do
130
+ it 'returns 0.0001 by default' do
131
+ options.rho2.should == 0.0001
132
+ end
133
+ end
134
+
135
+ describe '#rho2=' do
136
+ it 'sets rho2 to the given value' do
137
+ lambda { options.rho2 = 0.0002 }.should change { options.rho2 }.by(0.0001)
138
+ end
139
+ end
140
+
141
+
142
+ %w{ maxent compact sparse label check score posterior }.each do |m|
143
+ describe "##{m}" do
144
+ it 'returns false by default' do
145
+ options.send(m).should be false
146
+ end
147
+ end
148
+
149
+ describe "##{m}=" do
150
+ it "sets #{m} to the given value" do
151
+ lambda { options.send("#{m}=", true) }.should change { options.send(m) }.from(false).to(true)
152
+ lambda { options.send("#{m}=", false) }.should change { options.send(m) }.from(true).to(false)
153
+ lambda { options.send("#{m}=", 123) }.should change { options.send(m) }.from(false).to(true)
154
+ lambda { options.send("#{m}=", nil) }.should change { options.send(m) }.from(true).to(false)
155
+ end
156
+ end
157
+ end
158
+
159
+ %w{ pattern model algorithm devel }.each do |m|
160
+ describe "##{m}" do
161
+ it 'returns an empty string by default' do
162
+ options.send(m).should be_a(String)
163
+ end
164
+ end
165
+
166
+ describe "##{m}=" do
167
+ it 'sets the input string to the given value' do
168
+ lambda { options.send("#{m}=", 'foo') }.should change { options.send(m) }.to('foo')
169
+ end
170
+ end
171
+ end
172
+
173
+ end
174
+
175
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Utility Methods' do
4
+
5
+ let(:pattern) { File.expand_path('../../fixtures/chpattern.txt', __FILE__) }
6
+ let(:input) { File.expand_path('../../fixtures/chtrain.txt', __FILE__) }
7
+
8
+ describe 'train' do
9
+ it 'creates a new model according to the parameters given in the options hash' do
10
+ # Wapiti.train(input, :pattern => pattern).should be_valid_model
11
+ end
12
+
13
+ it 'creates a new model according to the options set in the block' do
14
+ # Wapiti.train { |c|
15
+ # c.pattern = pattern
16
+ # c.input = input
17
+ # }.should be_valid_model
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require 'wapiti/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'wapiti'
9
+ s.version = Wapiti::VERSION.dup
10
+ s.platform = Gem::Platform::RUBY
11
+ s.authors = ['Sylvester Keil']
12
+ s.email = ['http://sylvester.keil.or.at']
13
+ s.homepage = 'https://github.com/inukshuk/wapiti-ruby'
14
+ s.summary = 'Wicked fast Conditional Random Fields for Ruby.'
15
+ s.description = 'This gem provides a Ruby API for Conditional Random Fields (CRF). It is implemented as a C exstension and based on the wicked fast "wapiti" package.'
16
+ s.license = 'FreeBSD'
17
+
18
+ s.add_development_dependency('rake', '~>0.9')
19
+ s.add_development_dependency('rake-compiler', '~>0.7')
20
+ s.add_development_dependency('ZenTest', '~>4.6')
21
+ s.add_development_dependency('rspec', '~>2.6')
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ s.executables = []
26
+ s.require_path = 'lib'
27
+
28
+ s.extensions << 'ext/wapiti/extconf.rb'
29
+
30
+ s.rdoc_options = %w{--line-numbers --inline-source --title "Wapiti-Ruby" --main README.md --webcvs=http://github.com/inukshuk/wapiti-ruby/tree/master/}
31
+ s.extra_rdoc_files = %w{README.md LICENSE}
32
+
33
+ end
34
+
35
+ # vim: syntax=ruby
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wapiti
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sylvester Keil
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-30 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &2157117600 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.9'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2157117600
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake-compiler
27
+ requirement: &2157116700 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '0.7'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2157116700
36
+ - !ruby/object:Gem::Dependency
37
+ name: ZenTest
38
+ requirement: &2157078940 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '4.6'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2157078940
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &2157078120 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.6'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2157078120
58
+ description: This gem provides a Ruby API for Conditional Random Fields (CRF). It
59
+ is implemented as a C exstension and based on the wicked fast "wapiti" package.
60
+ email:
61
+ - http://sylvester.keil.or.at
62
+ executables: []
63
+ extensions:
64
+ - ext/wapiti/extconf.rb
65
+ extra_rdoc_files:
66
+ - README.md
67
+ - LICENSE
68
+ files:
69
+ - .autotest
70
+ - .gitignore
71
+ - .rspec
72
+ - Gemfile
73
+ - LICENSE
74
+ - README.md
75
+ - Rakefile
76
+ - ext/wapiti/bcd.c
77
+ - ext/wapiti/decoder.c
78
+ - ext/wapiti/decoder.h
79
+ - ext/wapiti/extconf.rb
80
+ - ext/wapiti/gradient.c
81
+ - ext/wapiti/gradient.h
82
+ - ext/wapiti/lbfgs.c
83
+ - ext/wapiti/model.c
84
+ - ext/wapiti/model.h
85
+ - ext/wapiti/native.c
86
+ - ext/wapiti/native.h
87
+ - ext/wapiti/options.c
88
+ - ext/wapiti/options.h
89
+ - ext/wapiti/pattern.c
90
+ - ext/wapiti/pattern.h
91
+ - ext/wapiti/progress.c
92
+ - ext/wapiti/progress.h
93
+ - ext/wapiti/quark.c
94
+ - ext/wapiti/quark.h
95
+ - ext/wapiti/reader.c
96
+ - ext/wapiti/reader.h
97
+ - ext/wapiti/rprop.c
98
+ - ext/wapiti/sequence.h
99
+ - ext/wapiti/sgdl1.c
100
+ - ext/wapiti/thread.c
101
+ - ext/wapiti/thread.h
102
+ - ext/wapiti/tools.c
103
+ - ext/wapiti/tools.h
104
+ - ext/wapiti/trainers.h
105
+ - ext/wapiti/vmath.c
106
+ - ext/wapiti/vmath.h
107
+ - ext/wapiti/wapiti.c
108
+ - ext/wapiti/wapiti.h
109
+ - lib/wapiti.rb
110
+ - lib/wapiti/errors.rb
111
+ - lib/wapiti/model.rb
112
+ - lib/wapiti/options.rb
113
+ - lib/wapiti/utility.rb
114
+ - lib/wapiti/version.rb
115
+ - spec/fixtures/ch.mod
116
+ - spec/fixtures/chpattern.txt
117
+ - spec/fixtures/chtest.txt
118
+ - spec/fixtures/chtrain.txt
119
+ - spec/fixtures/nppattern.txt
120
+ - spec/fixtures/nptest.txt
121
+ - spec/fixtures/nptrain.txt
122
+ - spec/fixtures/pattern.txt
123
+ - spec/fixtures/test.txt
124
+ - spec/fixtures/train.txt
125
+ - spec/spec_helper.rb
126
+ - spec/wapiti/model_spec.rb
127
+ - spec/wapiti/native_spec.rb
128
+ - spec/wapiti/options_spec.rb
129
+ - spec/wapiti/utility_spec.rb
130
+ - wapiti.gemspec
131
+ homepage: https://github.com/inukshuk/wapiti-ruby
132
+ licenses:
133
+ - FreeBSD
134
+ post_install_message:
135
+ rdoc_options:
136
+ - --line-numbers
137
+ - --inline-source
138
+ - --title
139
+ - ! '"Wapiti-Ruby"'
140
+ - --main
141
+ - README.md
142
+ - --webcvs=http://github.com/inukshuk/wapiti-ruby/tree/master/
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 1.8.10
160
+ signing_key:
161
+ specification_version: 3
162
+ summary: Wicked fast Conditional Random Fields for Ruby.
163
+ test_files:
164
+ - spec/fixtures/ch.mod
165
+ - spec/fixtures/chpattern.txt
166
+ - spec/fixtures/chtest.txt
167
+ - spec/fixtures/chtrain.txt
168
+ - spec/fixtures/nppattern.txt
169
+ - spec/fixtures/nptest.txt
170
+ - spec/fixtures/nptrain.txt
171
+ - spec/fixtures/pattern.txt
172
+ - spec/fixtures/test.txt
173
+ - spec/fixtures/train.txt
174
+ - spec/spec_helper.rb
175
+ - spec/wapiti/model_spec.rb
176
+ - spec/wapiti/native_spec.rb
177
+ - spec/wapiti/options_spec.rb
178
+ - spec/wapiti/utility_spec.rb