mini-levenshtein 0.1.1 → 0.1.2

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
  SHA256:
3
- metadata.gz: 72484523445a8c05ff3be19bf9043bec3e7e5a1ddcd98cafa6f7eea96517e5c3
4
- data.tar.gz: b52cdebc6caa82a3dba2152a7fef78e5509cb4b6a288bd1db7830d9f9192ced3
3
+ metadata.gz: 87d8dfd831b540e20d080df316abaf2195f371822d68e819e5c717fd2cbb637d
4
+ data.tar.gz: acd26d48b08feeaecea2ff7b9e4afe7f751e6590dafd54c87971fec244d79e28
5
5
  SHA512:
6
- metadata.gz: 27479145fb061c23d178b42215121fdbe1b05a701fdd8c832b7df3ac28af01a6973201bed2b8d5350549e1e768642c0ee6c45d5cf4301c6aa89db3c4c94667b1
7
- data.tar.gz: e2c95da36b1ec84593fe297360c9b8a029c1744d3c0a64b98eb19962e4b27b67113b04e525cbe60ad7fdfc3597f823ca81490d60af636baabc9716849789a1ac
6
+ metadata.gz: 4a380bcd7f95a4bc0ae68a871a40c0ec18beab58ef5af6bcc3313de38bd836f1e0e40538e491c9c0be46ba7882f25607b747cce8b579654d58cbac55303e67f1
7
+ data.tar.gz: f46268d96b7dfb651bb42db3d2f509bb5e2bdb908375832ee0a12a21ce388461cf52434156e042c8ba201c24041451dc03dd74d17b43cf3d2efec913089472e1
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mini-levenshtein (0.1.0)
4
+ mini-levenshtein (0.1.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -5,9 +5,9 @@ Simple, fast, levenshtein distance
5
5
  # Synopsis
6
6
 
7
7
  ```ruby
8
- MiniLevenshtein.distance("levenshtein", "levenstien") # => 3
8
+ MiniLevenshtein.edit_distance("levenshtein", "levenstien") # => 3
9
9
 
10
- MiniLevenshtein.ratio("levenshtein", "levenstien") # 0.857142...
10
+ MiniLevenshtein.similarity("levenshtein", "levenstien") # 0.857142...
11
11
  ```
12
12
 
13
13
  # Credits
@@ -7,4 +7,5 @@ require 'mkmf'
7
7
  dir_config('mini-levenshtein/mini_levenshtein')
8
8
 
9
9
  # Do the work
10
+ create_header
10
11
  create_makefile('mini-levenshtein/mini_levenshtein')
@@ -1,23 +1,20 @@
1
- #include <string.h>
2
- #include <math.h>
3
- #include <wchar.h>
4
- #include <stdlib.h>
1
+ #include <ruby.h>
2
+ #include "extconf.h"
5
3
 
6
- #include "ruby.h"
7
4
  #include "levenshtein.h"
8
5
 
9
- VALUE MiniLevenshteinInternal = Qnil;
6
+ VALUE MiniLevenshtein = Qnil;
10
7
 
11
- VALUE method_internal_distance(VALUE self, VALUE s1, VALUE s2, VALUE xcost);
8
+ VALUE rb_lev_edit_distance(VALUE self, VALUE s1, VALUE s2, VALUE xcost);
9
+ VALUE rb_edit_distance(VALUE self, VALUE s1, VALUE s2);
10
+ VALUE rb_similarity(VALUE self, VALUE s1, VALUE s2);
12
11
 
13
- void Init_mini_levenshtein()
14
- {
15
- MiniLevenshteinInternal = rb_define_module("MiniLevenshteinInternal");
16
- rb_define_method(MiniLevenshteinInternal, "internal_distance", method_internal_distance, 3);
17
- }
18
-
19
- VALUE method_internal_distance(VALUE self, VALUE s1, VALUE s2, VALUE xcost)
12
+ VALUE rb_lev_edit_distance(VALUE self, VALUE s1, VALUE s2, VALUE xcost)
20
13
  {
14
+ Check_Type(s1, T_STRING);
15
+ Check_Type(s2, T_STRING);
16
+ Check_Type(xcost, T_FIXNUM);
17
+
21
18
  size_t len1 = RSTRING_LEN(s1);
22
19
  size_t len2 = RSTRING_LEN(s2);
23
20
 
@@ -30,3 +27,83 @@ VALUE method_internal_distance(VALUE self, VALUE s1, VALUE s2, VALUE xcost)
30
27
 
31
28
  return INT2NUM(distance);
32
29
  }
30
+
31
+ /*
32
+ * Compute absolute Levenshtein distance of two strings.
33
+ *
34
+ * @example it's hard to spell Levenshtein correctly
35
+ * edit_distance('Levenshtein', 'Lenvinsten') # => 4
36
+ * edit_distance('Levenshtein', 'Levensthein') # => 2
37
+ * edit_distance('Levenshtein', 'Levenshten') # => 1
38
+ * edit_distance('Levenshtein', 'Levenshtein') # => 0
39
+ * "Yeah, we've managed it at last."
40
+ *
41
+ * @param string1 [String]
42
+ * @param string2 [String]
43
+ *
44
+ * @return [Integer]
45
+ */
46
+ VALUE rb_edit_distance(VALUE self, VALUE string1, VALUE string2)
47
+ {
48
+ Check_Type(string1, T_STRING);
49
+ Check_Type(string2, T_STRING);
50
+
51
+ size_t len1 = RSTRING_LEN(string1);
52
+ size_t len2 = RSTRING_LEN(string2);
53
+
54
+ const lev_byte *str1 = StringValuePtr(string1);
55
+ const lev_byte *str2 = StringValuePtr(string2);
56
+
57
+ long distance = lev_edit_distance(len1, str1, len2, str2, 0);
58
+
59
+ return INT2NUM(distance);
60
+ }
61
+
62
+ /*
63
+ * Compute similarity of two strings.
64
+ *
65
+ * The similarity is a number between 0 and 1.
66
+ *
67
+ * @example
68
+ * similarity('Hello World!', 'Holly grail!') # => 0.5833...
69
+ *
70
+ * @example
71
+ * similarity('Holmes', 'Jack') # => 0.0
72
+ *
73
+ * @param string1 [String]
74
+ * @param string2 [String]
75
+ *
76
+ * @return [Float]
77
+ */
78
+ VALUE rb_similarity(VALUE self, VALUE string1, VALUE string2)
79
+ {
80
+ Check_Type(string1, T_STRING);
81
+ Check_Type(string2, T_STRING);
82
+
83
+ size_t len1 = RSTRING_LEN(string1);
84
+ size_t len2 = RSTRING_LEN(string2);
85
+
86
+ const lev_byte *str1 = StringValuePtr(string1);
87
+ const lev_byte *str2 = StringValuePtr(string2);
88
+
89
+ size_t lensum = len1 + len2;
90
+ if (lensum == 0) {
91
+ return DBL2NUM(1.0);
92
+ }
93
+
94
+ long distance = lev_edit_distance(len1, str1, len2, str2, 0);
95
+ if (distance == 0) {
96
+ return DBL2NUM(1.0);
97
+ }
98
+
99
+ return DBL2NUM((lensum - distance) / (double)lensum);
100
+ }
101
+
102
+ void Init_mini_levenshtein()
103
+ {
104
+ MiniLevenshtein = rb_define_module("MiniLevenshtein");
105
+ rb_define_singleton_method(MiniLevenshtein, "lev_edit_distance", rb_lev_edit_distance, 3);
106
+ rb_define_singleton_method(MiniLevenshtein, "edit_distance", rb_edit_distance, 2);
107
+ rb_define_singleton_method(MiniLevenshtein, "similarity", rb_similarity, 2);
108
+ }
109
+
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniLevenshtein
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
@@ -1,62 +1,8 @@
1
1
  require 'mini-levenshtein/mini_levenshtein'
2
2
 
3
3
  module MiniLevenshtein
4
- extend MiniLevenshteinInternal
5
-
6
4
  class << self
7
- # Compute absolute Levenshtein distance of two strings.
8
- #
9
- # @example (it's hard to spell Levenshtein correctly):
10
- # distance('Levenshtein', 'Lenvinsten') # => 4
11
- # distance('Levenshtein', 'Levensthein') # => 2
12
- # distance('Levenshtein', 'Levenshten') # => 1
13
- # distance('Levenshtein', 'Levenshtein') # => 0
14
- # "Yeah, we've managed it at last."
15
- #
16
- # @param string1 [String]
17
- # @param string2 [String]
18
- #
19
- # @return [Integer]
20
- def edit_distance(string1, string2)
21
- validate_string!(string1)
22
- validate_string!(string2)
23
-
24
- internal_distance(string1, string2, 0)
25
- end
26
5
  alias distance edit_distance
27
-
28
- # Compute similarity of two strings.
29
- #
30
- # The similarity is a number between 0 and 1.
31
- #
32
- # @example
33
- # similarity('Hello World!', 'Holly grail!') # => 0.5833...
34
- #
35
- # @example
36
- # similarity('Holmes', 'Jack') # => 0.0
37
- #
38
- # @param string1 [String]
39
- # @param string2 [String]
40
- #
41
- # @return [Float]
42
- def similarity(string1, string2)
43
- validate_string!(string1)
44
- validate_string!(string2)
45
-
46
- lensum = string1.length + string2.length
47
- return 1.0 if lensum.zero?
48
-
49
- distance = internal_distance(string1, string2, 1)
50
- return 1.0 if distance.zero?
51
-
52
- (lensum - distance) / lensum.to_f
53
- end
54
6
  alias ratio similarity
55
-
56
- private
57
-
58
- def validate_string!(string)
59
- raise TypeError, "no implicit conversion of #{string.class} to String" unless string.is_a?(String)
60
- end
61
7
  end
62
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini-levenshtein
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delon Newman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-04 00:00:00.000000000 Z
11
+ date: 2022-05-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Simple, fast, levenshtein distance
14
14
  email: contact@delonnewman.name