jaro_winkler 1.3.1 → 1.3.2.beta

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: 77f956f70c8b182eae7e78f336c377bc1b4bfa8f
4
- data.tar.gz: 17bead21ccd72a4d1c6137cf4f612b1d1c036e26
3
+ metadata.gz: 9a90ee9e013479d3c47c7cd632646921f87af4fc
4
+ data.tar.gz: 30d065fc0728d3fda6db84af71584f7a60b038cb
5
5
  SHA512:
6
- metadata.gz: a4c0e7786621635addc80d7c0c18276ef720c1e9690c61f74b506cf5627368cb5862073e96447cef6739ab044d18aa159db492e3bdc182a483809bd273979fd3
7
- data.tar.gz: 83800c9061918d37f3be5a5b4f3137346425328a33f013dbd37dd58f3c818dd4e411605f372aabd0c6a5501a694ddf5928246e96d5e931af5e5468cc2d699777
6
+ metadata.gz: d29510e81e2ab5510a85360321e77444363531a2786c5f5dd6213514c0f5d97232ac5d19b25eb0fbd3bc9972dc255e326b7f600c2254cdb2fe6ed7be20cd76e9
7
+ data.tar.gz: 5cbb9e3167a42f86ecd6b93dfd9fe21aca7e599e7faf492e9c8f59b109958b157faff0601f1b8078ee6b3a0e92165eda9cab36d6d8eb9d7c5935f3828da18d74
data/README.md CHANGED
@@ -46,7 +46,7 @@ adj_table | boolean | false | The option is used to give partial credit for
46
46
 
47
47
  origin formula:
48
48
 
49
- ![origin](https://chart.googleapis.com/chart?cht=tx&chl=%5Cbegin%7Bcases%7D%200%20%26%20m%3D0%20%5C%5C%20%5Cfrac%20%7B%201%20%7D%7B%203%20%7D%20(%5Cfrac%20%7B%20m%20%7D%7B%20%5Cleft%7C%20s1%20%5Cright%7C%20%20%7D%20%2B%5Cfrac%20%7B%20m%20%7D%7B%20%5Cleft%7C%20s2%20%5Cright%7C%20%20%7D%20%2B%5Cfrac%20%7B%20m-t%20%7D%7B%20m%20%7D%20)%20%26%20others%20%5Cend%7Bcases%7D)
49
+ ![origin](https://chart.googleapis.com/chart?cht=tx&chs&chl=%5Cbegin%7Bcases%7D0%26%7B%5Ctext%7Bif%20%7Dm%3D0%7D%5C%5C%5Cfrac%7B1%7D%7B3%7D(%5Cfrac%7Bm%7D%7B%5Cleft%7Cs1%5Cright%7C%7D%2B%5Cfrac%7Bm%7D%7B%5Cleft%7Cs2%5Cright%7C%7D%2B%5Cfrac%7Bm-t%7D%7Bm%7D)%26%5Ctext%7Bothers%7D%5Cend%7Bcases%7D)
50
50
 
51
51
  where
52
52
 
@@ -55,7 +55,7 @@ where
55
55
 
56
56
  with adjusting table:
57
57
 
58
- ![adj](https://chart.googleapis.com/chart?cht=tx&chl=%5Cbegin%7Bcases%7D%200%20%26%20m%3D0%20%5C%5C%20%5Cfrac%20%7B%201%20%7D%7B%203%20%7D%20(%5Cfrac%20%7B%20%5Cfrac%20%7B%20s%20%7D%7B%2010%20%7D%20%2Bm%20%7D%7B%20%5Cleft%7C%20s1%20%5Cright%7C%20%20%7D%20%2B%5Cfrac%20%7B%20%5Cfrac%20%7B%20s%20%7D%7B%2010%20%7D%20%2Bm%20%7D%7B%20%5Cleft%7C%20s2%20%5Cright%7C%20%20%7D%20%2B%5Cfrac%20%7B%20m-t%20%7D%7B%20m%20%7D%20)%20%26%20others%20%5Cend%7Bcases%7D)
58
+ ![adj](https://chart.googleapis.com/chart?cht=tx&chs&chl=%5Cbegin%7Bcases%7D0%26%5Ctext%7Bif%20%7Dm%3D0%5C%5C%5Cfrac%7B1%7D%7B3%7D(%5Cfrac%7B%5Cfrac%7Bs%7D%7B10%7D%2Bm%7D%7B%5Cleft%7Cs1%5Cright%7C%7D%2B%5Cfrac%7B%5Cfrac%7Bs%7D%7B10%7D%2Bm%7D%7B%5Cleft%7Cs2%5Cright%7C%7D%2B%5Cfrac%7Bm-t%7D%7Bm%7D)%26%5Ctext%7Bothers%7D%5Cend%7Bcases%7D)
59
59
 
60
60
  where
61
61
 
@@ -76,7 +76,7 @@ Windows Support | **Yes** | | No | **Yes**
76
76
  Adjusting Table | **Yes** | No | No | No
77
77
  Native | **Yes** | **Yes** | **Yes** | **Yes**
78
78
  Pure Ruby | **Yes** | **Yes** | No | No
79
- Speed | Medium | Fast | Medium | Slow
79
+ Speed | Medium | **Fast** | Medium | Slow
80
80
  Bug Found | **Not Yet** | Yes | **Not Yet** | Yes
81
81
 
82
82
  For `Bug Found`, I made a rake task to build the table below, the source code is in `Rakefile`:
@@ -99,30 +99,28 @@ str_1 | str_2 | origin | jaro_winkler | fuzzystringmatch | hotwater |
99
99
 
100
100
  ### Pure Ruby
101
101
 
102
- | user | system | total | real
103
- ---------------- | --------- | -------- | --------- | ------------
104
- jaro_winkler | 12.750000 | 0.030000 | 12.780000 | ( 12.782842)
105
- fuzzystringmatch | 16.240000 | 0.030000 | 16.270000 | ( 16.287380)
102
+ | user | system | total | real
103
+ ---------------- | -------- | -------- | -------- | ------------
104
+ jaro_winkler | 1.300000 | 0.000000 | 1.300000 | ( 1.299802)
105
+ fuzzystringmatch | 1.510000 | 0.000000 | 1.510000 | ( 1.510136)
106
106
 
107
- - jaro_winkler (1.2.3)
107
+ - jaro_winkler (1.3.1)
108
108
  - fuzzy-string-match (0.9.6)
109
109
 
110
110
  ### Native
111
111
 
112
112
  | user | system | total | real
113
113
  ---------------- | -------- | -------- | -------- | ------------
114
- jaro_winkler | 0.390000 | 0.000000 | 0.390000 | ( 0.392408)
115
- fuzzystringmatch | 0.150000 | 0.000000 | 0.150000 | ( 0.151552)
116
- hotwater | 0.320000 | 0.000000 | 0.320000 | ( 0.317740)
117
- amatch | 0.960000 | 0.010000 | 0.970000 | ( 0.964803)
114
+ jaro_winkler | 0.350000 | 0.010000 | 0.360000 | ( 0.345293)
115
+ fuzzystringmatch | 0.140000 | 0.000000 | 0.140000 | ( 0.138711)
116
+ hotwater | 0.310000 | 0.000000 | 0.310000 | ( 0.306498)
117
+ amatch | 0.960000 | 0.000000 | 0.960000 | ( 0.961509)
118
118
 
119
- - jaro_winkler (1.2.3)
119
+ - jaro_winkler (1.3.1)
120
120
  - fuzzy-string-match (0.9.6)
121
121
  - hotwater (0.1.2)
122
122
  - amatch (0.3.0)
123
123
 
124
124
  # Todo
125
125
 
126
- - Custom adjusting word table.
127
- - If the adjusting table is ASCII encoded, use dense matrix instread of sparse matrix to speed up.
128
- - Call by reference instead of call by value to enhance performance.
126
+ - Custom adjusting word table.
data/benchmark/pure.rb CHANGED
@@ -3,7 +3,7 @@ require 'jaro_winkler'
3
3
  require 'fuzzystringmatch'
4
4
  ary = [['al', 'al'], ['martha', 'marhta'], ['jones', 'johnson'], ['abcvwxyz', 'cabvwxyz'], ['dwayne', 'duane'], ['dixon', 'dicksonx'], ['fvie', 'ten']]
5
5
 
6
- n = 100000
6
+ n = 10000
7
7
  Benchmark.bmbm do |x|
8
8
  x.report 'jaro_winkler' do
9
9
  n.times{ ary.each{ |str1, str2| JaroWinkler.r_distance(str1, str2) } }
data/benchmark/pure.txt CHANGED
@@ -1,8 +1,8 @@
1
1
  Rehearsal ----------------------------------------------------
2
- jaro_winkler 12.690000 0.020000 12.710000 ( 12.726929)
3
- fuzzystringmatch 15.230000 0.020000 15.250000 ( 15.255146)
4
- ------------------------------------------ total: 27.960000sec
2
+ jaro_winkler 1.300000 0.000000 1.300000 ( 1.300723)
3
+ fuzzystringmatch 1.500000 0.010000 1.510000 ( 1.497842)
4
+ ------------------------------------------- total: 2.810000sec
5
5
 
6
6
  user system total real
7
- jaro_winkler 12.290000 0.020000 12.310000 ( 12.308876)
8
- fuzzystringmatch 15.460000 0.020000 15.480000 ( 15.493061)
7
+ jaro_winkler 1.300000 0.000000 1.300000 ( 1.299802)
8
+ fuzzystringmatch 1.510000 0.000000 1.510000 ( 1.510136)
@@ -0,0 +1,62 @@
1
+ #include <stdlib.h>
2
+ #include "adj_matrix.h"
3
+
4
+ extern unsigned int MurmurHash2(const void * key, int len, unsigned int seed);
5
+ static void node_free(Node *head);
6
+
7
+ AdjMatrix* adj_matrix_new(unsigned int length){
8
+ AdjMatrix *matrix = malloc(sizeof(AdjMatrix));
9
+ matrix->length = length == 0 ? ADJ_MATRIX_DEFAULT_LENGTH : length;
10
+ matrix->table = malloc(matrix->length * sizeof(Node**));
11
+ for(int i = 0; i < matrix->length; i++){
12
+ matrix->table[i] = malloc(matrix->length * sizeof(Node*));
13
+ for (int j = 0; j < matrix->length; j++)
14
+ matrix->table[i][j] = NULL;
15
+ }
16
+ return matrix;
17
+ }
18
+
19
+ void adj_matrix_add(AdjMatrix *matrix, unsigned long long x, unsigned long long y){
20
+ unsigned int h1 = MurmurHash2(&x, sizeof(long long), ADJ_MATRIX_SEED) % ADJ_MATRIX_DEFAULT_LENGTH,
21
+ h2 = MurmurHash2(&y, sizeof(long long), ADJ_MATRIX_SEED) % ADJ_MATRIX_DEFAULT_LENGTH;
22
+ Node *new_node = malloc(sizeof(Node)); new_node->x = h1; new_node->y = h2; new_node->next = NULL;
23
+ if(matrix->table[h1][h2] == NULL){
24
+ matrix->table[h1][h2] = matrix->table[h2][h1] = new_node;
25
+ }
26
+ else{
27
+ Node *previous = NULL;
28
+ for(Node *i = matrix->table[h1][h2]; i != NULL; i = i->next) previous = i;
29
+ previous->next = new_node;
30
+ }
31
+ }
32
+
33
+ char adj_matrix_find(AdjMatrix *matrix, unsigned long long x, unsigned long long y){
34
+ unsigned int h1 = MurmurHash2(&x, sizeof(long long), ADJ_MATRIX_SEED) % ADJ_MATRIX_DEFAULT_LENGTH,
35
+ h2 = MurmurHash2(&y, sizeof(long long), ADJ_MATRIX_SEED) % ADJ_MATRIX_DEFAULT_LENGTH;
36
+ Node *node = matrix->table[h1][h2];
37
+ if(node == NULL) return 0;
38
+ else{
39
+ for(Node *i = node; i != NULL; i = i->next)
40
+ if((i->x == h1 && i->y == h2) || (i->x == h2 && i->y == h1)) return 1;
41
+ return 0;
42
+ }
43
+ }
44
+
45
+ static void node_free(Node *head){
46
+ if(head == NULL) return;
47
+ node_free(head->next);
48
+ free(head);
49
+ }
50
+
51
+ void adj_matrix_free(AdjMatrix *matrix){
52
+ for(int i = 0; i < matrix->length; i++){
53
+ for(int j = 0; j < matrix->length; j++)
54
+ if(matrix->table[i][j] != NULL){
55
+ node_free(matrix->table[i][j]);
56
+ matrix->table[i][j] = matrix->table[j][i] = NULL;
57
+ }
58
+ free(matrix->table[i]);
59
+ }
60
+ free(matrix->table);
61
+ free(matrix);
62
+ }
@@ -0,0 +1,21 @@
1
+ #ifndef ADJ_MATRIX_H
2
+ #define ADJ_MATRIX_H 1
3
+ #define ADJ_MATRIX_DEFAULT_LENGTH 958
4
+ #define ADJ_MATRIX_SEED 9527
5
+
6
+ typedef struct _node{
7
+ struct _node *next;
8
+ unsigned long long x, y;
9
+ } Node;
10
+
11
+ typedef struct{
12
+ Node ***table;
13
+ unsigned int length;
14
+ } AdjMatrix;
15
+
16
+ AdjMatrix* adj_matrix_new(unsigned int length);
17
+ void adj_matrix_add(AdjMatrix *matrix, unsigned long long x, unsigned long long y);
18
+ char adj_matrix_find(AdjMatrix *matrix, unsigned long long x, unsigned long long y);
19
+ void adj_matrix_free(AdjMatrix *matrix);
20
+
21
+ #endif /* ADJ_MATRIX_H */
@@ -2,6 +2,7 @@
2
2
  #include <stdlib.h>
3
3
  #include <ctype.h>
4
4
  #include "distance.h"
5
+ #include "adj_matrix.h"
5
6
 
6
7
  typedef struct{
7
8
  unsigned long long code;
@@ -13,27 +14,16 @@ typedef struct{
13
14
  int length;
14
15
  } Codepoints;
15
16
 
16
- typedef struct{
17
- unsigned long long x, y;
18
- } Coord;
19
-
20
- typedef struct{
21
- Coord *coords;
22
- int length;
23
- } Matrix;
24
-
25
- static const char *DEFAULT_ADJ_TABLE[] = {
17
+ const char *DEFAULT_ADJ_TABLE[] = {
26
18
  "A","E", "A","I", "A","O", "A","U", "B","V", "E","I", "E","O", "E","U", "I","O", "I","U", "O","U",
27
19
  "I","Y", "E","Y", "C","G", "E","F", "W","U", "W","V", "X","K", "S","Z", "X","S", "Q","C", "U","V",
28
20
  "M","N", "L","I", "Q","O", "P","R", "I","J", "2","Z", "5","S", "8","B", "1","I", "1","L", "0","O",
29
21
  "0","Q", "C","K", "G","J", "E"," ", "Y"," ", "S"," "
30
22
  };
31
- static Matrix DEFAULT_MATRIX;
32
23
 
33
24
  static UnicodeHash unicode_hash_new(const char *str);
34
25
  static Codepoints codepoints_new(const char *str, int byte_len);
35
- static Matrix matrix_new(const char **adj_table, int length);
36
- static char matrix_find(Matrix matrix, unsigned long long code_1, unsigned long long code_2);
26
+ static AdjMatrix* adj_matrix_default();
37
27
 
38
28
  Option option_new(){
39
29
  Option opt;
@@ -61,13 +51,6 @@ double c_distance(char *s1, int s1_byte_len, char *s2, int s2_byte_len, Option o
61
51
  int tmp2 = code_ary_1.length; code_ary_1.length = code_ary_2.length; code_ary_2.length = tmp2;
62
52
  }
63
53
 
64
- // Adjusting table
65
- static char first_time = 1;
66
- if(opt.adj_table){
67
- if(first_time) DEFAULT_MATRIX = matrix_new(DEFAULT_ADJ_TABLE, sizeof(DEFAULT_ADJ_TABLE) / 8);
68
- first_time = 0;
69
- }
70
-
71
54
  // Compute jaro distance
72
55
  int window_size = code_ary_2.length / 2 - 1;
73
56
  if(window_size < 0) window_size = 0;
@@ -91,7 +74,7 @@ double c_distance(char *s1, int s1_byte_len, char *s2, int s2_byte_len, Option o
91
74
  previous_index = j;
92
75
  found = 1;
93
76
  }
94
- }else if(opt.adj_table && matrix_find(DEFAULT_MATRIX, code_ary_1.ary[i], code_ary_2.ary[j])) sim_matched = 1;
77
+ }else if(opt.adj_table && adj_matrix_find(adj_matrix_default(), code_ary_1.ary[i], code_ary_2.ary[j])) sim_matched = 1;
95
78
  } // for(int j = left; j <= right; j++){
96
79
  if(matched){
97
80
  matches++;
@@ -130,7 +113,7 @@ static UnicodeHash unicode_hash_new(const char *str){
130
113
  }
131
114
 
132
115
  static Codepoints codepoints_new(const char *str, int byte_len){
133
- Codepoints ret = {0};
116
+ Codepoints ret = {};
134
117
  ret.ary = calloc(byte_len, sizeof(long long));
135
118
  int count = 0;
136
119
  for(int i = 0; i < byte_len;){
@@ -143,21 +126,16 @@ static Codepoints codepoints_new(const char *str, int byte_len){
143
126
  return ret;
144
127
  }
145
128
 
146
- static Matrix matrix_new(const char **adj_table, int length){
147
- Matrix ret;
148
- ret.coords = calloc(length, sizeof(Coord));
149
- ret.length = length;
150
- for(int i = 0; i < length; i += 2){
151
- UnicodeHash h1 = unicode_hash_new(adj_table[i]);
152
- UnicodeHash h2 = unicode_hash_new(adj_table[i+1]);
153
- ret.coords[i].x = ret.coords[i+1].y = h1.code;
154
- ret.coords[i].y = ret.coords[i+1].x = h2.code;
129
+ static AdjMatrix* adj_matrix_default(){
130
+ static char first_time = 1;
131
+ static AdjMatrix *ret_matrix;
132
+ if(first_time){
133
+ ret_matrix = adj_matrix_new(ADJ_MATRIX_DEFAULT_LENGTH);
134
+ for(int i = 0; i < 78; i += 2){
135
+ UnicodeHash h1 = unicode_hash_new(DEFAULT_ADJ_TABLE[i]), h2 = unicode_hash_new(DEFAULT_ADJ_TABLE[i + 1]);
136
+ adj_matrix_add(ret_matrix, h1.code, h2.code);
137
+ }
138
+ first_time = 0;
155
139
  }
156
- return ret;
157
- }
158
-
159
- static char matrix_find(Matrix matrix, unsigned long long code_1, unsigned long long code_2){
160
- for (int i = 0; i < matrix.length; i++)
161
- if(matrix.coords[i].x == code_1 && matrix.coords[i].y == code_2) return 1;
162
- return 0;
140
+ return ret_matrix;
163
141
  }
@@ -6,7 +6,7 @@ typedef struct{
6
6
  char ignore_case, adj_table;
7
7
  } Option;
8
8
 
9
- double c_distance(char *s1, int s1_byte_len, char *s2, int s2_byte_len, Option opt);
10
- Option option_new();
9
+ double c_distance(char *s1, int s1_byte_len, char *s2, int s2_byte_len, Option opt);
10
+ Option option_new();
11
11
 
12
12
  #endif /* DISTANCE_H */
@@ -21,8 +21,7 @@ VALUE rb_distance(int argc, VALUE *argv, VALUE self){
21
21
  if(c_opt.weight > 0.25) rb_raise(rb_eRuntimeError, "Scaling factor should not exceed 0.25, otherwise the distance can become larger than 1.");
22
22
  if(!NIL_P(threshold)) c_opt.threshold = NUM2DBL(threshold);
23
23
  if(!NIL_P(ignore_case)) c_opt.ignore_case = (TYPE(ignore_case) == T_FALSE || NIL_P(ignore_case)) ? 0 : 1;
24
- if(!NIL_P(adj_table)) c_opt.adj_table = (TYPE(adj_table) == T_FALSE || NIL_P(adj_table)) ? 0 : 1;
24
+ if(!NIL_P(adj_table)) c_opt.adj_table = (TYPE(adj_table) == T_FALSE || NIL_P(adj_table)) ? 0 : 1;
25
25
  }
26
- VALUE ret = rb_float_new(c_distance(StringValuePtr(s1), RSTRING_LEN(s1), StringValuePtr(s2), RSTRING_LEN(s2), c_opt));
27
- return ret;
26
+ return rb_float_new(c_distance(StringValuePtr(s1), RSTRING_LEN(s1), StringValuePtr(s2), RSTRING_LEN(s2), c_opt));
28
27
  }
@@ -0,0 +1,64 @@
1
+ //-----------------------------------------------------------------------------
2
+ // MurmurHash2, by Austin Appleby
3
+
4
+ // Note - This code makes a few assumptions about how your machine behaves -
5
+
6
+ // 1. We can read a 4-byte value from any address without crashing
7
+ // 2. sizeof(int) == 4
8
+
9
+ // And it has a few limitations -
10
+
11
+ // 1. It will not work incrementally.
12
+ // 2. It will not produce the same results on little-endian and big-endian
13
+ // machines.
14
+
15
+ unsigned int MurmurHash2 ( const void * key, int len, unsigned int seed )
16
+ {
17
+ // 'm' and 'r' are mixing constants generated offline.
18
+ // They're not really 'magic', they just happen to work well.
19
+
20
+ const unsigned int m = 0x5bd1e995;
21
+ const int r = 24;
22
+
23
+ // Initialize the hash to a 'random' value
24
+
25
+ unsigned int h = seed ^ len;
26
+
27
+ // Mix 4 bytes at a time into the hash
28
+
29
+ const unsigned char * data = (const unsigned char *)key;
30
+
31
+ while(len >= 4)
32
+ {
33
+ unsigned int k = *(unsigned int *)data;
34
+
35
+ k *= m;
36
+ k ^= k >> r;
37
+ k *= m;
38
+
39
+ h *= m;
40
+ h ^= k;
41
+
42
+ data += 4;
43
+ len -= 4;
44
+ }
45
+
46
+ // Handle the last few bytes of the input array
47
+
48
+ switch(len)
49
+ {
50
+ case 3: h ^= data[2] << 16;
51
+ case 2: h ^= data[1] << 8;
52
+ case 1: h ^= data[0];
53
+ h *= m;
54
+ };
55
+
56
+ // Do a few final mixes of the hash to ensure the last few
57
+ // bytes are well-incorporated.
58
+
59
+ h ^= h >> 13;
60
+ h *= m;
61
+ h ^= h >> 15;
62
+
63
+ return h;
64
+ }
data/lib/jaro_winkler.rb CHANGED
@@ -4,7 +4,7 @@ require 'jaro_winkler/jaro_winkler.so' unless JaroWinkler.fallback?
4
4
  module JaroWinkler
5
5
  module_function
6
6
  def jaro_distance s1, s2, options = {}
7
- options = {adj_table: false}.merge options
7
+ options[:adj_table]
8
8
  length1, length2 = s1.length, s2.length
9
9
  # Guarantee the length order
10
10
  if s1.length > s2.length
@@ -52,7 +52,7 @@ module JaroWinkler
52
52
  end
53
53
 
54
54
  def r_distance s1, s2, options = {}
55
- options = {weight: 0.1, threshold: 0.7, ignore_case: false}.merge options
55
+ options = {weight: 0.1, threshold: 0.7, ignore_case: false, adj_table: false}.merge options
56
56
  weight, threshold, ignore_case = options[:weight], options[:threshold], options[:ignore_case]
57
57
  raise 'Scaling factor should not exceed 0.25, otherwise the distance can become larger than 1' if weight > 0.25
58
58
  s1, s2 = s1.upcase, s2.upcase if ignore_case
@@ -1,3 +1,3 @@
1
1
  module JaroWinkler
2
- VERSION = "1.3.1"
2
+ VERSION = "1.3.2.beta"
3
3
  end
@@ -55,7 +55,7 @@ shared_examples 'common' do |strategy|
55
55
  it 'works with adjusting table' do
56
56
  ary = [
57
57
  ['HENKA' , 'HENKAN' , 0.9667] , # m=5, t=0, s=0
58
- ['AL' , 'AL' , 1.0 ], # m=2, t=0, s=0
58
+ ['AL' , 'AL' , 1.0 ] , # m=2, t=0, s=0
59
59
  ['MARTHA' , 'MARHTA' , 0.9611] , # m=6, t=1, s=0
60
60
  ['JONES' , 'JOHNSON' , 0.8598] , # m=4, t=0, s=3
61
61
  ['ABCVWXYZ' , 'CABVWXYZ' , 0.9583] , # m=8, t=1, s=0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jaro_winkler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jian Weihang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-10 00:00:00.000000000 Z
11
+ date: 2014-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,11 +72,14 @@ files:
72
72
  - benchmark/native.txt
73
73
  - benchmark/pure.rb
74
74
  - benchmark/pure.txt
75
+ - ext/jaro_winkler/adj_matrix.c
76
+ - ext/jaro_winkler/adj_matrix.h
75
77
  - ext/jaro_winkler/distance.c
76
78
  - ext/jaro_winkler/distance.h
77
79
  - ext/jaro_winkler/extconf.rb
78
80
  - ext/jaro_winkler/jaro_winkler.c
79
81
  - ext/jaro_winkler/jaro_winkler.h
82
+ - ext/jaro_winkler/murmur_hash2.c
80
83
  - jaro_winkler.gemspec
81
84
  - lib/jaro_winkler.rb
82
85
  - lib/jaro_winkler/adjusting_table.rb
@@ -99,9 +102,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
102
  version: '0'
100
103
  required_rubygems_version: !ruby/object:Gem::Requirement
101
104
  requirements:
102
- - - ">="
105
+ - - ">"
103
106
  - !ruby/object:Gem::Version
104
- version: '0'
107
+ version: 1.3.1
105
108
  requirements: []
106
109
  rubyforge_project:
107
110
  rubygems_version: 2.4.1