measurable 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8e94547914fc6532f23f86d4d8118100aad64398
4
- data.tar.gz: f5eae04dfb5c5b2e041d59527921be80ba1b27bc
3
+ metadata.gz: aaf11caa585477217fa9724f7f8c8a794490194f
4
+ data.tar.gz: 2e802d508407c4b656501c9a18af5130ae488979
5
5
  SHA512:
6
- metadata.gz: 8992dfff181353a0feb8d893f90c4705572f2706e158e6ee51f6d398c31ddd0b39f8f1153c123252eb064213984c11ec6d98cf720814065973a3d5a59884ebe7
7
- data.tar.gz: 8643ac26d9471a6e1a78ca9b25c684196ad7fd61d7f930b0d2242b9d68d7b857ff7dd5c49da667517fd7a9ebf4593528947ebbb812ef9045026d381b5b76f978
6
+ metadata.gz: 971e40facf06a090f515d1cd450006ce370d6ff460c8a9af65c9791ced5fddba58defdaff70c51cd9ce202ce712c7e0074b387507155de2c93250725cd3547f0
7
+ data.tar.gz: 7f2714aeca034f418567b555c0fd5f99bcfce34d2ab73d595a2d4aa5d6cb5abdd620e2502182ce8537d0d7c1dccdba4285dabe4f9877e175a4973ae1ff155126
data/.gitignore CHANGED
@@ -1,4 +1,6 @@
1
1
  pkg
2
2
  tmp/*
3
3
  benchmarks/*
4
- lib/*.bundle
4
+ lib/*.bundle
5
+ html/
6
+ Gemfile.lock
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0
5
+ - 2.1
6
+ - rbx
7
+ # uncomment this line if your project needs to run something other than `rake`:
8
+ # script: bundle exec rspec spec
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
1
  # Gemfile
2
- source "http://rubygems.org"
2
+ source "https://rubygems.org"
3
+
3
4
  gemspec
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Measurable
2
2
 
3
+ [![Build Status](https://travis-ci.org/agarie/measurable.svg?branch=master)](https://travis-ci.org/agarie/measurable)
4
+ [![Code Climate](https://codeclimate.com/github/agarie/measurable.png)](https://codeclimate.com/github/agarie/measurable)
5
+
3
6
  A gem to test what metric is best for certain kinds of datasets in machine learning.
4
7
 
5
8
  Besides the `Array` class, I also want to support `NVector` (from [NMatrix](http://github.com/sciruby/nmatrix)).
@@ -30,6 +33,7 @@ The following are the similarity measures supported at the moment:
30
33
  - Minkowski (Cityblock or Manhattan) distance
31
34
  - Chebyshev distance
32
35
  - Hamming distance
36
+ - [Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance)
33
37
 
34
38
  These still need to be implemented:
35
39
 
@@ -49,8 +53,8 @@ The API I intend to support is something like this:
49
53
  ```ruby
50
54
  require "measurable"
51
55
 
52
- u = NVector.ones(2)
53
- v = NVector.zeros(2)
56
+ u = NMatrix.ones([2, 1])
57
+ v = NMatrix.zeros([2, 1])
54
58
  w = [1, 0]
55
59
  x = [2, 2]
56
60
 
@@ -68,11 +72,9 @@ Measurable.euclidean_squared([3, 4]) # => 25
68
72
  `RDoc` syntax is used to document the project. To build it locally, you'll need to install the [Fivefish generator](https://github.com/ged/rdoc-generator-fivefish) (`gem install rdoc-generator-fivefish`) and run the following command:
69
73
 
70
74
  ```bash
71
- rdoc -f fivefish -m README.md *.md LICENSE lib/
75
+ rake rdoc
72
76
  ```
73
77
 
74
- I want to be able to use a Rake task to generate the documentation, thus allowing me to forget the specific command. However, there's a bug in `RDoc::Task` in which [custom generators (like Fivefish) can't be used](https://github.com/rdoc/rdoc/issues/246).
75
-
76
78
  If there's something wrong with an explanation or if there's information missing, please open an issue or send a pull request.
77
79
 
78
80
  ## License
@@ -82,4 +84,4 @@ See LICENSE for details.
82
84
  The original `distance_measures` gem is copyrighted by [@reddavis][reddavis].
83
85
 
84
86
  [maxmin]: http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=05156398
85
- [reddavis]: (https://github.com/reddavis)
87
+ [reddavis]: (https://github.com/reddavis)
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rake'
2
2
  require 'bundler/gem_tasks'
3
3
  require "rspec/core/rake_task"
4
- # require 'rdoc/task' # See below.
4
+ require 'rdoc/task'
5
5
 
6
6
  # Setup the necessary gems, specified in the gemspec.
7
7
  require 'bundler'
@@ -13,20 +13,26 @@ rescue Bundler::BundlerError => e
13
13
  exit e.status_code
14
14
  end
15
15
 
16
+ task :default => [:spec]
17
+
16
18
  # Run all the specs.
17
19
  RSpec::Core::RakeTask.new(:spec)
18
20
 
19
- # RDoc task isn't working with custom generators, as can be seen in:
20
- # https://github.com/rdoc/rdoc/issues/246
21
- #
22
- # Whenever this issue is fixed, I'll resume using this task.
23
- #
24
- # RDoc::Task.new do |rdoc|
25
- # rdoc.main = "README.md"
26
- # rdoc.rdoc_files.include("README.md", "LICENSE", "lib")
27
- # rdoc.generator = "fivefish"
28
- # rdoc.external = true
29
- # end
21
+ RDoc::Task.new do |rdoc|
22
+ rdoc.main = "README.md"
23
+ rdoc.rdoc_files.include("README.md", "LICENSE", "lib")
24
+ rdoc.generator = "fivefish"
25
+ rdoc.external = true
26
+ end
27
+
28
+ desc "Open IRB with Measurable loaded."
29
+ task :console do
30
+ require 'irb'
31
+ require 'irb/completion'
32
+ require 'measurable'
33
+ ARGV.clear
34
+ IRB.start
35
+ end
30
36
 
31
37
  # Compile task.
32
38
  # Rake::ExtensionTask.new do |ext|
@@ -10,6 +10,7 @@ require 'measurable/chebyshev'
10
10
  require 'measurable/maxmin'
11
11
  require 'measurable/haversine'
12
12
  require 'measurable/hamming'
13
+ require 'measurable/levenshtein'
13
14
 
14
15
  module Measurable
15
16
  # PI / 180 degrees.
@@ -1,9 +1,9 @@
1
1
  module Measurable
2
2
 
3
3
  # call-seq:
4
- # cosine(u, v) -> Float
4
+ # cosine_similarity(u, v) -> Float
5
5
  #
6
- # Calculate the similarity between the orientation of two vectors.
6
+ # Calculate the cosine similarity between the orientation of two vectors.
7
7
  #
8
8
  # See: http://en.wikipedia.org/wiki/Cosine_similarity
9
9
  #
@@ -16,7 +16,7 @@ module Measurable
16
16
  # * *Raises* :
17
17
  # - +ArgumentError+ -> The sizes of +u+ and +v+ don't match.
18
18
  #
19
- def cosine(u, v)
19
+ def cosine_similarity(u, v)
20
20
  # TODO: Change this to a more specific, custom-made exception.
21
21
  raise ArgumentError if u.size != v.size
22
22
 
@@ -24,4 +24,27 @@ module Measurable
24
24
 
25
25
  dot_product / (euclidean(u) * euclidean(v))
26
26
  end
27
- end
27
+
28
+ # call-seq:
29
+ # cosine_distance(u, v) -> Float
30
+ #
31
+ # Calculate the cosine distance between the orientation of two vectors.
32
+ #
33
+ # See: http://en.wikipedia.org/wiki/Cosine_similarity
34
+ #
35
+ # * *Arguments* :
36
+ # - +u+ -> An array of Numeric objects.
37
+ # - +v+ -> An array of Numeric objects.
38
+ # * *Returns* :
39
+ # - The normalized dot product of +u+ and +v+, that is, the angle between
40
+ # them in the n-dimensional space.
41
+ # * *Raises* :
42
+ # - +ArgumentError+ -> The sizes of +u+ and +v+ don't match.
43
+ #
44
+ def cosine_distance(u, v)
45
+ # TODO: Change this to a more specific, custom-made exception.
46
+ raise ArgumentError if u.size != v.size
47
+
48
+ 1 - cosine_similarity(u, v)
49
+ end
50
+ end
@@ -3,9 +3,11 @@ module Measurable
3
3
  # call-seq:
4
4
  # hamming(s1, s2) -> Integer
5
5
  #
6
+ # Count the number of different characters between strings +s1+ and +s2+,
7
+ # that is, how many substitutions are necessary to change +s1+ into +s2+ and
8
+ # vice-versa.
6
9
  #
7
- #
8
- # See: http://en.wikipedia.org/wiki/Cosine_similarity
10
+ # See: http://en.wikipedia.org/wiki/Hamming_distance
9
11
  #
10
12
  # * *Arguments* :
11
13
  # - +s1+ -> A String.
@@ -10,15 +10,15 @@ module Measurable
10
10
  # cardinality of set x.
11
11
  #
12
12
  # For example:
13
- # jaccard_index([1, 0, 1], [1, 1, 1]) == 0.666...
13
+ # jaccard_index([1, 0, 1], [1, 1, 1]) == 0.5
14
14
  #
15
- # Because |intersection| = |(1, 0, 1)| = 2 and |union| = |(1, 1, 1)| = 3.
15
+ # Because |intersection| = |(1)| = 1 and |union| = |(0, 1)| = 2.
16
16
  #
17
17
  # See: http://en.wikipedia.org/wiki/Jaccard_coefficient
18
18
  #
19
19
  # * *Arguments* :
20
- # - +u+ -> Array of 1s and 0s.
21
- # - +v+ -> Array of 1s and 0s.
20
+ # - +u+ -> Array.
21
+ # - +v+ -> Array.
22
22
  # * *Returns* :
23
23
  # - Float value representing the Jaccard similarity coefficient between
24
24
  # +u+ and +v+.
@@ -29,17 +29,10 @@ module Measurable
29
29
  # TODO: Change this to a more specific, custom-made exception.
30
30
  raise ArgumentError if u.size != v.size
31
31
 
32
- intersection = u.zip(v).reduce(0) do |acc, elem|
33
- # Both u and v must have this element.
34
- elem[0] + elem[1] == 2 ? (acc + 1) : acc
35
- end
32
+ intersection = u & v
33
+ union = u | v
36
34
 
37
- union = u.zip(v).reduce(0) do |acc, elem|
38
- # One of u and v must have this element.
39
- elem[0] + elem[1] >= 1 ? (acc + 1) : acc
40
- end
41
-
42
- intersection.to_f / union
35
+ intersection.length.to_f / union.length
43
36
  end
44
37
 
45
38
  # call-seq:
@@ -56,8 +49,8 @@ module Measurable
56
49
  # - Triangular inequality: jaccard(u, v) <= jaccard(u, w) + jaccard(w, v)
57
50
  #
58
51
  # * *Arguments* :
59
- # - +u+ -> Array of 1s and 0s.
60
- # - +v+ -> Array of 1s and 0s.
52
+ # - +u+ -> Array.
53
+ # - +v+ -> Array.
61
54
  # * *Returns* :
62
55
  # - Float value representing the dissimilarity between +u+ and +v+.
63
56
  # * *Raises* :
@@ -66,4 +59,4 @@ module Measurable
66
59
  def jaccard(u, v)
67
60
  1 - jaccard_index(u, v)
68
61
  end
69
- end
62
+ end
@@ -0,0 +1,58 @@
1
+ module Measurable
2
+ module Levenshtein
3
+
4
+ # call-seq:
5
+ # levenshtein(u, v) -> Integer
6
+ #
7
+ # Give the edit distance between two binary sequences +u+ and +v+ where each
8
+ # edit (insertion, deletion, substitution) required to change on into the
9
+ # other increments the total distance.
10
+ #
11
+ # For example:
12
+ # levenshtein('kitten', 'sitting') == 3
13
+ #
14
+ # Because
15
+ # 1. kitten -> sitten (substitution "s" for "k")
16
+ # 2. sitten -> sittin (substitution "i" for "e")
17
+ # 3. sittin -> sitting (insertion of "g" at the end)
18
+ #
19
+ # See: http://en.wikipedia.org/wiki/Levenshtein_distance
20
+ #
21
+ # * *Arguments* :
22
+ # - +u+ -> Array or String.
23
+ # - +v+ -> Array or String.
24
+ # * *Returns* :
25
+ # - Integer value representing the Levenshtein distance between
26
+ # +u+ and +v+.
27
+ #
28
+ def levenshtein(u, v)
29
+ return 0 if u == v
30
+ return u.size if v.size == 0
31
+ return v.size if u.size == 0
32
+
33
+ matrix = Array.new(u.size+1) { (0..v.size).to_a }
34
+
35
+ if v.size < u.size
36
+ u, v = v, u
37
+ end
38
+
39
+ (1..u.size).each do |i|
40
+ (1..v.size).each do |j|
41
+ if u[i] == v[j]
42
+ matrix[i][j] = matrix[i-1][j-1]
43
+ else
44
+ matrix[i][j] = [
45
+ matrix[i-1][j] + 1, # deletion
46
+ matrix[i][j-1] + 1, # insertion
47
+ matrix[i-1][j-1] + 1, # substitution
48
+ ].min
49
+ end
50
+ end
51
+ end
52
+
53
+ matrix[u.size][v.size]
54
+ end
55
+ end
56
+
57
+ extend Measurable::Levenshtein
58
+ end
@@ -1,3 +1,3 @@
1
1
  module Measurable
2
- VERSION = "0.0.6" # :nodoc:
3
- end
2
+ VERSION = "0.0.7" # :nodoc:
3
+ end
@@ -24,6 +24,8 @@ Gem::Specification.new do |gem|
24
24
  gem.required_ruby_version = '>= 1.9.3'
25
25
 
26
26
  gem.add_development_dependency 'bundler'
27
- gem.add_development_dependency 'rake', '~> 0.9'
28
- gem.add_development_dependency 'rspec', '~> 2.9.0'
27
+ gem.add_development_dependency 'rake', '~> 10.1'
28
+ gem.add_development_dependency 'rdoc', '~> 4.1'
29
+ gem.add_development_dependency 'rspec', '~> 2.1'
30
+ gem.add_development_dependency 'rdoc-generator-fivefish'
29
31
  end
@@ -1,29 +1,61 @@
1
- describe "Cosine distance" do
1
+ describe "Cosine" do
2
2
 
3
- before :all do
4
- @u = [1, 2]
5
- @v = [2, 3]
6
- @w = [4, 5]
7
- end
3
+ context "Similarity" do
4
+ before :all do
5
+ @u = [1, 2]
6
+ @v = [2, 3]
7
+ @w = [4, 5]
8
+ end
8
9
 
9
- it "accepts two arguments" do
10
- expect { Measurable.cosine(@u, @v) }.to_not raise_error
11
- expect { Measurable.cosine(@u, @v, @w) }.to raise_error(ArgumentError)
12
- end
10
+ it "accepts two arguments" do
11
+ expect { Measurable.cosine_similarity(@u, @v) }.to_not raise_error
12
+ expect { Measurable.cosine_similarity(@u, @v, @w) }.to raise_error(ArgumentError)
13
+ end
13
14
 
14
- it "should be symmetric" do
15
- x = Measurable.cosine(@u, @v)
16
- y = Measurable.cosine(@v, @u)
15
+ it "should be symmetric" do
16
+ x = Measurable.cosine_similarity(@u, @v)
17
+ y = Measurable.cosine_similarity(@v, @u)
17
18
 
18
- x.should be_within(TOLERANCE).of(y)
19
- end
19
+ x.should be_within(TOLERANCE).of(y)
20
+ end
20
21
 
21
- it "should return the correct value" do
22
- x = Measurable.cosine(@u, @v)
23
- x.should be_within(TOLERANCE).of(0.992277877)
22
+ it "should return the correct value" do
23
+ x = Measurable.cosine_similarity(@u, @v)
24
+ x.should be_within(TOLERANCE).of(0.992277877)
25
+ end
26
+
27
+ it "shouldn't work with vectors of different length" do
28
+ expect { Measurable.cosine_similarity(@u, [1, 3, 5, 7]) }.to raise_error(ArgumentError)
29
+ end
24
30
  end
25
31
 
26
- it "shouldn't work with vectors of different length" do
27
- expect { Measurable.cosine(@u, [1, 3, 5, 7]) }.to raise_error(ArgumentError)
32
+ context "Distance" do
33
+ before :all do
34
+ @u = [1, 2]
35
+ @v = [2, 3]
36
+ @w = [4, 5]
37
+ end
38
+
39
+ it "accepts two arguments" do
40
+ expect { Measurable.cosine_distance(@u, @v) }.to_not raise_error
41
+ expect { Measurable.cosine_distance(@u, @v, @w) }.to raise_error(ArgumentError)
42
+ end
43
+
44
+ it "should be symmetric" do
45
+ x = Measurable.cosine_distance(@u, @v)
46
+ y = Measurable.cosine_distance(@v, @u)
47
+
48
+ x.should be_within(TOLERANCE).of(y)
49
+ end
50
+
51
+ it "should return the correct value" do
52
+ x = Measurable.cosine_distance(@u, @v)
53
+ # TODO: Use a real example.
54
+ x.should be_within(TOLERANCE).of(1.0 - 0.992277877)
55
+ end
56
+
57
+ it "shouldn't work with vectors of different length" do
58
+ expect { Measurable.cosine_distance(@u, [1, 3, 5, 7]) }.to raise_error(ArgumentError)
59
+ end
28
60
  end
29
- end
61
+ end
@@ -22,7 +22,7 @@ describe "Jaccard" do
22
22
  it "should return the correct value" do
23
23
  x = Measurable.jaccard_index(@u, @v)
24
24
 
25
- x.should be_within(TOLERANCE).of(2.0 / 3.0)
25
+ x.should be_within(TOLERANCE).of(1.0 / 2.0)
26
26
  end
27
27
 
28
28
  it "shouldn't work with vectors of different length" do
@@ -52,11 +52,11 @@ describe "Jaccard" do
52
52
  it "should return the correct value" do
53
53
  x = Measurable.jaccard(@u, @v)
54
54
 
55
- x.should be_within(TOLERANCE).of(1.0 / 3.0)
55
+ x.should be_within(TOLERANCE).of(1.0 / 2.0)
56
56
  end
57
57
 
58
58
  it "shouldn't work with vectors of different length" do
59
59
  expect { Measurable.jaccard(@u, [1, 2, 3, 4]) }.to raise_error(ArgumentError)
60
60
  end
61
61
  end
62
- end
62
+ end
@@ -0,0 +1,55 @@
1
+ describe Measurable::Levenshtein do
2
+
3
+ context "strings" do
4
+
5
+ it "handles empty" do
6
+ Measurable.levenshtein("", "").should == 0
7
+ Measurable.levenshtein("", "abcd").should == 4
8
+ Measurable.levenshtein("abcd", "").should == 4
9
+ end
10
+
11
+ it "should not count equality" do
12
+ Measurable.levenshtein("aa", "aa").should == 0
13
+ end
14
+
15
+ it "should count deletion" do
16
+ Measurable.levenshtein("ab", "a").should == 1
17
+ end
18
+
19
+ it "should count insertion" do
20
+ Measurable.levenshtein("ab", "abc").should == 1
21
+ end
22
+
23
+ it "should count substitution" do
24
+ Measurable.levenshtein("aa", "ab").should == 1
25
+ end
26
+
27
+ end
28
+
29
+ context "arrays" do
30
+
31
+ it "handles empty" do
32
+ Measurable.levenshtein([], []).should == 0
33
+ Measurable.levenshtein([], %w[ a b c d ]).should == 4
34
+ Measurable.levenshtein(%w[ a b c d ], []).should == 4
35
+ end
36
+
37
+ it "should not count equality" do
38
+ Measurable.levenshtein(%w[ a ], %w[ a ]).should == 0
39
+ end
40
+
41
+ it "should count deletion" do
42
+ Measurable.levenshtein(%w[ a b ], %w[ a ]).should == 1
43
+ end
44
+
45
+ it "should count insertion" do
46
+ Measurable.levenshtein(%w[ a b ], %w[ a b c ]).should == 1
47
+ end
48
+
49
+ it "should count substitution" do
50
+ Measurable.levenshtein(%w[ a a ], %w[ a b ]).should == 1
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -21,10 +21,10 @@ describe "Tanimoto distance" do
21
21
  it "should return the correct value" do
22
22
  x = Measurable.tanimoto(@u, @v)
23
23
 
24
- x.should be_within(TOLERANCE).of(-Math.log2(2.0 / 3.0))
24
+ x.should be_within(TOLERANCE).of(-Math.log2(1.0 / 2.0))
25
25
  end
26
26
 
27
27
  it "shouldn't work with vectors of different length" do
28
28
  expect { Measurable.tanimoto(@u, [1, 3, 5, 7]) }.to raise_error(ArgumentError)
29
29
  end
30
- end
30
+ end
metadata CHANGED
@@ -1,67 +1,95 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: measurable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos Agarie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-04 00:00:00.000000000 Z
11
+ date: 2014-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.9'
33
+ version: '10.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.9'
40
+ version: '10.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.1'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ~>
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rdoc-generator-fivefish
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
46
74
  - !ruby/object:Gem::Version
47
- version: 2.9.0
75
+ version: '0'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - ~>
80
+ - - ">="
53
81
  - !ruby/object:Gem::Version
54
- version: 2.9.0
82
+ version: '0'
55
83
  description: A Ruby gem with a lot of distance measures for your projects.
56
84
  email: carlos.agarie@gmail.com
57
85
  executables: []
58
86
  extensions: []
59
87
  extra_rdoc_files: []
60
88
  files:
61
- - .gitignore
62
- - .rspec
89
+ - ".gitignore"
90
+ - ".rspec"
91
+ - ".travis.yml"
63
92
  - Gemfile
64
- - Gemfile.lock
65
93
  - LICENSE
66
94
  - README.md
67
95
  - Rakefile
@@ -72,6 +100,7 @@ files:
72
100
  - lib/measurable/hamming.rb
73
101
  - lib/measurable/haversine.rb
74
102
  - lib/measurable/jaccard.rb
103
+ - lib/measurable/levenshtein.rb
75
104
  - lib/measurable/maxmin.rb
76
105
  - lib/measurable/minkowski.rb
77
106
  - lib/measurable/tanimoto.rb
@@ -83,6 +112,7 @@ files:
83
112
  - spec/hamming_spec.rb
84
113
  - spec/haversine_spec.rb
85
114
  - spec/jaccard_spec.rb
115
+ - spec/levenshtein_spec.rb
86
116
  - spec/maxmin_spec.rb
87
117
  - spec/minkowski_spec.rb
88
118
  - spec/spec_helper.rb
@@ -97,17 +127,17 @@ require_paths:
97
127
  - lib
98
128
  required_ruby_version: !ruby/object:Gem::Requirement
99
129
  requirements:
100
- - - '>='
130
+ - - ">="
101
131
  - !ruby/object:Gem::Version
102
132
  version: 1.9.3
103
133
  required_rubygems_version: !ruby/object:Gem::Requirement
104
134
  requirements:
105
- - - '>='
135
+ - - ">="
106
136
  - !ruby/object:Gem::Version
107
137
  version: '0'
108
138
  requirements: []
109
139
  rubyforge_project:
110
- rubygems_version: 2.0.6
140
+ rubygems_version: 2.2.2
111
141
  signing_key:
112
142
  specification_version: 4
113
143
  summary: A Ruby gem with a lot of distance measures for your projects.
@@ -118,6 +148,7 @@ test_files:
118
148
  - spec/hamming_spec.rb
119
149
  - spec/haversine_spec.rb
120
150
  - spec/jaccard_spec.rb
151
+ - spec/levenshtein_spec.rb
121
152
  - spec/maxmin_spec.rb
122
153
  - spec/minkowski_spec.rb
123
154
  - spec/spec_helper.rb
@@ -1,27 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- measurable (0.0.6)
5
-
6
- GEM
7
- remote: http://rubygems.org/
8
- specs:
9
- diff-lcs (1.1.3)
10
- rake (0.9.6)
11
- rspec (2.9.0)
12
- rspec-core (~> 2.9.0)
13
- rspec-expectations (~> 2.9.0)
14
- rspec-mocks (~> 2.9.0)
15
- rspec-core (2.9.0)
16
- rspec-expectations (2.9.1)
17
- diff-lcs (~> 1.1.3)
18
- rspec-mocks (2.9.0)
19
-
20
- PLATFORMS
21
- ruby
22
-
23
- DEPENDENCIES
24
- bundler
25
- measurable!
26
- rake (~> 0.9)
27
- rspec (~> 2.9.0)