measurable 0.0.6 → 0.0.7

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.
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)