fuzzy_match 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.document +5 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +94 -0
  6. data/Rakefile +21 -0
  7. data/THANKS-WILLIAM-JAMES.rb +37 -0
  8. data/benchmark/before-with-free.txt +283 -0
  9. data/benchmark/before-without-last-result.txt +257 -0
  10. data/benchmark/before.txt +304 -0
  11. data/benchmark/memory.rb +54 -0
  12. data/examples/bts_aircraft/5-2-A.htm +10305 -0
  13. data/examples/bts_aircraft/5-2-B.htm +9576 -0
  14. data/examples/bts_aircraft/5-2-D.htm +7094 -0
  15. data/examples/bts_aircraft/5-2-E.htm +2349 -0
  16. data/examples/bts_aircraft/5-2-G.htm +2922 -0
  17. data/examples/bts_aircraft/blockings.csv +1 -0
  18. data/examples/bts_aircraft/identities.csv +1 -0
  19. data/examples/bts_aircraft/negatives.csv +1 -0
  20. data/examples/bts_aircraft/number_260.csv +334 -0
  21. data/examples/bts_aircraft/positives.csv +1 -0
  22. data/examples/bts_aircraft/test_bts_aircraft.rb +118 -0
  23. data/examples/bts_aircraft/tighteners.csv +1 -0
  24. data/examples/first_name_matching.rb +15 -0
  25. data/examples/icao-bts.xls +0 -0
  26. data/fuzzy_match.gemspec +32 -0
  27. data/lib/fuzzy_match/blocking.rb +36 -0
  28. data/lib/fuzzy_match/cached_result.rb +74 -0
  29. data/lib/fuzzy_match/identity.rb +23 -0
  30. data/lib/fuzzy_match/result.rb +17 -0
  31. data/lib/fuzzy_match/score.rb +125 -0
  32. data/lib/fuzzy_match/similarity.rb +53 -0
  33. data/lib/fuzzy_match/stop_word.rb +19 -0
  34. data/lib/fuzzy_match/tightener.rb +28 -0
  35. data/lib/fuzzy_match/version.rb +3 -0
  36. data/lib/fuzzy_match/wrapper.rb +67 -0
  37. data/lib/fuzzy_match.rb +252 -0
  38. data/test/helper.rb +12 -0
  39. data/test/test_blocking.rb +23 -0
  40. data/test/test_cache.rb +130 -0
  41. data/test/test_fuzzy_match.rb +190 -0
  42. data/test/test_fuzzy_match_convoluted.rb.disabled +268 -0
  43. data/test/test_identity.rb +33 -0
  44. data/test/test_tightening.rb +10 -0
  45. metadata +197 -0
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in fuzzy_match.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2011 Brighter Planet, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,94 @@
1
+ = fuzzy_match
2
+
3
+ Find a needle in a haystack based on string similarity (using the Pair Distance algorithm and Levenshtein distance) and regular expressions.
4
+
5
+ Replaces [loose_tight_dictionary](https://github.com/seamusabshere/loose_tight_dictionary) because that was a confusing name.
6
+
7
+ == Quickstart
8
+
9
+ >> require 'fuzzy_match'
10
+ => true
11
+ >> FuzzyMatch.new(%w{seamus andy ben}).find('Shamus')
12
+ => "seamus"
13
+
14
+ == String similarity matching
15
+
16
+ Uses {Dice's Coefficient}[http://en.wikipedia.org/wiki/Dice's_coefficient] algorithm (aka Pair Distance).
17
+
18
+ If that judges two strings to be be equally similar to a third string, then Levenshtein distance is used. For example, pair distance considers "RATZ" and "CATZ" to be equally similar to "RITZ" so we invoke Levenshtein.
19
+
20
+ >> require 'amatch'
21
+ => true
22
+ >> 'RITZ'.pair_distance_similar 'RATZ'
23
+ => 0.3333333333333333
24
+ >> 'RITZ'.pair_distance_similar 'CATZ' # <-- pair distance can't tell the difference, so we fall back to levenshtein...
25
+ => 0.3333333333333333
26
+ >> 'RITZ'.levenshtein_similar 'RATZ'
27
+ => 0.75
28
+ >> 'RITZ'.levenshtein_similar 'CATZ' # <-- which properly shows that RATZ should win
29
+ => 0.5
30
+
31
+ == Production use
32
+
33
+ Over 2 years in {Brighter Planet's environmental impact API}[http://impact.brighterplanet.com] and {reference data service}[http://data.brighterplanet.com].
34
+
35
+ == Haystacks and how to read them
36
+
37
+ The (admittedly imperfect) metaphor is "look for a needle in a haystack"
38
+
39
+ * needle - the search term
40
+ * haystack - the records you are searching (<b>your result will be an object from here</b>)
41
+
42
+ So, what if your needle is a string like <tt>youruguay</tt> and your haystack is full of <tt>Country</tt> objects like <tt><Country name:"Uruguay"></tt>?
43
+
44
+ >> FuzzyMatch.new(countries, :read => :name).find('youruguay')
45
+ => <Country name:"Uruguay">
46
+
47
+ == Regular expressions
48
+
49
+ You can improve the default matchings with regular expressions.
50
+
51
+ * Emphasize important words using <b>blockings</b> and <b>tighteners</b>
52
+ * Filter out stop words with <b>tighteners</b>
53
+ * Prevent impossible matches with <b>blockings</b> and <b>identities</b>
54
+ * Ignore words with <b>stop words</b>
55
+
56
+ === Blockings
57
+
58
+ Setting a blocking of <tt>/Airbus/</tt> ensures that strings containing "Airbus" will only be scored against to other strings containing "Airbus". A better blocking in this case would probably be <tt>/airbus/i</tt>.
59
+
60
+ === Tighteners
61
+
62
+ Adding a tightener like <tt>/(boeing).*(7\d\d)/i</tt> will cause "BOEING COMPANY 747" and "boeing747" to be scored as if they were "BOEING 747" and "boeing 747", respectively. See also "Case sensitivity" below.
63
+
64
+ === Identities
65
+
66
+ Adding an identity like <tt>/(F)\-?(\d50)/</tt> ensures that "Ford F-150" and "Ford F-250" never match.
67
+
68
+ === Stop words
69
+
70
+ Adding a stop word like <tt>THE</tt> ensures that it is not taken into account when comparing "THE CAT", "THE DAT", and "THE CATT"
71
+
72
+ == Case sensitivity
73
+
74
+ Scoring is case-insensitive. Everything is downcased before scoring. This is a change from previous versions. Your regexps may still be case-sensitive, though.
75
+
76
+ == Examples
77
+
78
+ Check out the tests.
79
+
80
+ == Speed (and who to thank for the algorithms)
81
+
82
+ If you add the amatch[http://flori.github.com/amatch/] gem to your Gemfile, it will use that, which is much faster (but {segfaults have been seen in the wild}[https://github.com/flori/amatch/issues/3]). Thanks {Flori}[https://github.com/flori]!
83
+
84
+ Otherwise, pure ruby versions of the string similarity algorithms derived from the {answer to a StackOverflow question}[http://stackoverflow.com/questions/653157/a-better-similarity-ranking-algorithm-for-variable-length-strings] and {the text gem}[https://github.com/threedaymonk/text/blob/master/lib/text/levenshtein.rb] are used. Thanks {marzagao}[http://stackoverflow.com/users/10997/marzagao] and {threedaymonk}[https://github.com/threedaymonk]!
85
+
86
+ == Authors
87
+
88
+ * Seamus Abshere <seamus@abshere.net>
89
+ * Ian Hough <ijhough@gmail.com>
90
+ * Andy Rossmeissl <andy@rossmeissl.net>
91
+
92
+ == Copyright
93
+
94
+ Copyright 2011 Brighter Planet, Inc.
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
12
+
13
+ require 'rake/rdoctask'
14
+ Rake::RDocTask.new do |rdoc|
15
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
16
+
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = "fuzzy_match #{version}"
19
+ rdoc.rdoc_files.include('README*')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Thanks William James!
4
+ # http://www.ruby-forum.com/topic/95519#200484
5
+ def cart_prod(*args)
6
+ args.inject([[]]){|old,lst|
7
+ new = []
8
+ lst.each{|e| new += old.map{|c| c.dup << e }}
9
+ new
10
+ }
11
+ end
12
+
13
+ require 'benchmark'
14
+
15
+ a = [1,2,3]
16
+ b = [4,5]
17
+ Benchmark.bmbm do |x|
18
+ x.report("native") do
19
+ 500_000.times { a.product(b) }
20
+ end
21
+ x.report("william-james") do |x|
22
+ 500_000.times { cart_prod(a, b) }
23
+ end
24
+ end
25
+
26
+ # results:
27
+ # $ ruby foo.rb
28
+ # Rehearsal -------------------------------------------------
29
+ # native 0.720000 0.000000 0.720000 ( 0.729319)
30
+ # william-james 3.620000 0.010000 3.630000 ( 3.629198)
31
+ # ---------------------------------------- total: 4.350000sec
32
+ #
33
+ # user system total real
34
+ # native 0.710000 0.000000 0.710000 ( 0.708620)
35
+ # william-james 3.800000 0.000000 3.800000 ( 3.792538)
36
+
37
+ # thanks for all the fish!
@@ -0,0 +1,283 @@
1
+ 1962 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/object/blank.rb:68:String
2
+ 1957 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1632:String
3
+ 342 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:String
4
+ 326 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:Array
5
+ 325 benchmark/memory.rb:21:String
6
+ 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/hasher.rb:20:String
7
+ 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:22:ActiveSupport::OrderedHash
8
+ 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:65:String
9
+ 325 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/ordered_hash.rb:39:Array
10
+ 325 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:FuzzyMatch::Similarity
11
+ 325 ./benchmark/../lib/fuzzy_match/similarity.rb:57:Array
12
+ 325 ./benchmark/../lib/fuzzy_match/similarity.rb:25:FuzzyMatch::Score
13
+ 325 ./benchmark/../lib/fuzzy_match/score.rb:13:Float
14
+ 325 ./benchmark/../lib/fuzzy_match.rb:35:FuzzyMatch::Wrapper
15
+ 320 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/format/delimited.rb:28:String
16
+ 303 ./benchmark/../lib/fuzzy_match/similarity.rb:21:Float
17
+ 201 ./benchmark/../lib/fuzzy_match/tightener.rb:20:String
18
+ 184 ./benchmark/../lib/fuzzy_match/tightener.rb:14:String
19
+ 140 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:__node__
20
+ 41 ./benchmark/../lib/fuzzy_match/similarity.rb:49:__node__
21
+ 31 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:Regexp
22
+ 28 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:19:__node__
23
+ 22 ./benchmark/../lib/fuzzy_match/similarity.rb:57:__node__
24
+ 22 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:__node__
25
+ 21 ./benchmark/../lib/fuzzy_match.rb:199:FuzzyMatch::Blocking
26
+ 17 ./benchmark/../lib/fuzzy_match/similarity.rb:21:__node__
27
+ 16 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:Class
28
+ 14 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:__node__
29
+ 14 ./benchmark/../lib/fuzzy_match/similarity.rb:37:__node__
30
+ 13 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:__node__
31
+ 13 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:27:__node__
32
+ 12 ./benchmark/../lib/fuzzy_match/wrapper.rb:29:__node__
33
+ 12 ./benchmark/../lib/fuzzy_match/wrapper.rb:19:__node__
34
+ 11 ./benchmark/../lib/fuzzy_match/identity.rb:18:__node__
35
+ 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:__node__
36
+ 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:__node__
37
+ 11 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:__node__
38
+ 10 ./benchmark/../lib/fuzzy_match/similarity.rb:55:__node__
39
+ 10 ./benchmark/../lib/fuzzy_match/similarity.rb:39:__node__
40
+ 10 ./benchmark/../lib/fuzzy_match/similarity.rb:25:__node__
41
+ 10 ./benchmark/../lib/fuzzy_match.rb:193:FuzzyMatch::Identity
42
+ 9 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch.bundle:0:String
43
+ 9 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:__node__
44
+ 9 ./benchmark/../lib/fuzzy_match/similarity.rb:49:String
45
+ 9 ./benchmark/../lib/fuzzy_match/similarity.rb:42:__node__
46
+ 9 ./benchmark/../lib/fuzzy_match/similarity.rb:41:__node__
47
+ 8 ./benchmark/../lib/fuzzy_match/wrapper.rb:31:__node__
48
+ 8 ./benchmark/../lib/fuzzy_match/tightener.rb:27:__node__
49
+ 8 ./benchmark/../lib/fuzzy_match/tightener.rb:14:__node__
50
+ 8 ./benchmark/../lib/fuzzy_match/similarity.rb:38:__node__
51
+ 8 ./benchmark/../lib/fuzzy_match/score.rb:13:__node__
52
+ 8 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:__node__
53
+ 8 ./benchmark/../lib/fuzzy_match/blocking.rb:24:__node__
54
+ 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:7:__node__
55
+ 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:6:__node__
56
+ 7 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:5:__node__
57
+ 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:9:__node__
58
+ 7 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:__node__
59
+ 7 ./benchmark/../lib/fuzzy_match/similarity.rb:45:__node__
60
+ 7 ./benchmark/../lib/fuzzy_match/score.rb:17:__node__
61
+ 7 ./benchmark/../lib/fuzzy_match/identity.rb:19:__node__
62
+ 7 ./benchmark/../lib/fuzzy_match/blocking.rb:27:__node__
63
+ 7 ./benchmark/../lib/fuzzy_match.rb:209:String
64
+ 6 ./benchmark/../lib/fuzzy_match/wrapper.rb:8:__node__
65
+ 6 ./benchmark/../lib/fuzzy_match/similarity.rb:44:__node__
66
+ 6 ./benchmark/../lib/fuzzy_match/similarity.rb:15:__node__
67
+ 6 ./benchmark/../lib/fuzzy_match/similarity.rb:13:__node__
68
+ 6 ./benchmark/../lib/fuzzy_match/score.rb:25:__node__
69
+ 6 ./benchmark/../lib/fuzzy_match/score.rb:21:__node__
70
+ 6 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:__node__
71
+ 6 ./benchmark/../lib/fuzzy_match/blocking.rb:22:__node__
72
+ 5 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/fastercsv-1.5.4/lib/faster_csv.rb:1640:String
73
+ 5 ./benchmark/../lib/fuzzy_match/wrapper.rb:34:__node__
74
+ 5 ./benchmark/../lib/fuzzy_match/tightener.rb:9:__node__
75
+ 5 ./benchmark/../lib/fuzzy_match/tightener.rb:19:__node__
76
+ 5 ./benchmark/../lib/fuzzy_match/similarity.rb:8:__node__
77
+ 5 ./benchmark/../lib/fuzzy_match/similarity.rb:33:__node__
78
+ 5 ./benchmark/../lib/fuzzy_match/similarity.rb:29:__node__
79
+ 5 ./benchmark/../lib/fuzzy_match/similarity.rb:12:__node__
80
+ 5 ./benchmark/../lib/fuzzy_match/score.rb:9:__node__
81
+ 5 ./benchmark/../lib/fuzzy_match/result.rb:16:__node__
82
+ 5 ./benchmark/../lib/fuzzy_match/identity.rb:10:__node__
83
+ 5 ./benchmark/../lib/fuzzy_match/blocking.rb:26:__node__
84
+ 5 ./benchmark/../lib/fuzzy_match/blocking.rb:25:__node__
85
+ 5 ./benchmark/../lib/fuzzy_match/blocking.rb:15:__node__
86
+ 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:33:__node__
87
+ 4 ./benchmark/../lib/fuzzy_match/wrapper.rb:30:__node__
88
+ 4 ./benchmark/../lib/fuzzy_match/tightener.rb:20:__node__
89
+ 4 ./benchmark/../lib/fuzzy_match/similarity.rb:59:__node__
90
+ 4 ./benchmark/../lib/fuzzy_match/similarity.rb:54:__node__
91
+ 4 ./benchmark/../lib/fuzzy_match/score.rb:5:__node__
92
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:9:__node__
93
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:8:__node__
94
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:7:__node__
95
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:6:__node__
96
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:5:__node__
97
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:4:__node__
98
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:3:__node__
99
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:13:__node__
100
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:12:__node__
101
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:11:__node__
102
+ 4 ./benchmark/../lib/fuzzy_match/result.rb:10:__node__
103
+ 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:8:__node__
104
+ 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:22:__node__
105
+ 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:21:__node__
106
+ 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:20:String
107
+ 4 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:11:__node__
108
+ 3 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:8:__node__
109
+ 3 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:3:__node__
110
+ 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:28:__node__
111
+ 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:24:__node__
112
+ 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:18:__node__
113
+ 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:15:String
114
+ 3 ./benchmark/../lib/fuzzy_match/wrapper.rb:14:__node__
115
+ 3 ./benchmark/../lib/fuzzy_match/tightener.rb:8:__node__
116
+ 3 ./benchmark/../lib/fuzzy_match/tightener.rb:26:__node__
117
+ 3 ./benchmark/../lib/fuzzy_match/tightener.rb:18:__node__
118
+ 3 ./benchmark/../lib/fuzzy_match/tightener.rb:13:__node__
119
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:7:__node__
120
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:6:__node__
121
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:58:__node__
122
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:56:__node__
123
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:48:__node__
124
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:36:__node__
125
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:32:__node__
126
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:28:__node__
127
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:24:__node__
128
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:20:__node__
129
+ 3 ./benchmark/../lib/fuzzy_match/similarity.rb:11:__node__
130
+ 3 ./benchmark/../lib/fuzzy_match/score.rb:8:__node__
131
+ 3 ./benchmark/../lib/fuzzy_match/score.rb:7:__node__
132
+ 3 ./benchmark/../lib/fuzzy_match/score.rb:24:__node__
133
+ 3 ./benchmark/../lib/fuzzy_match/score.rb:20:__node__
134
+ 3 ./benchmark/../lib/fuzzy_match/score.rb:16:__node__
135
+ 3 ./benchmark/../lib/fuzzy_match/score.rb:12:__node__
136
+ 3 ./benchmark/../lib/fuzzy_match/result.rb:21:__node__
137
+ 3 ./benchmark/../lib/fuzzy_match/result.rb:19:__node__
138
+ 3 ./benchmark/../lib/fuzzy_match/result.rb:15:__node__
139
+ 3 ./benchmark/../lib/fuzzy_match/identity.rb:9:__node__
140
+ 3 ./benchmark/../lib/fuzzy_match/identity.rb:17:__node__
141
+ 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:3:__node__
142
+ 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:18:__node__
143
+ 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:16:String
144
+ 3 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:15:String
145
+ 3 ./benchmark/../lib/fuzzy_match/blocking.rb:33:__node__
146
+ 3 ./benchmark/../lib/fuzzy_match/blocking.rb:14:__node__
147
+ 3 ./benchmark/../lib/fuzzy_match.rb:77:Array
148
+ 2 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:387:String
149
+ 2 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:3:String
150
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:6:__node__
151
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:5:__node__
152
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:4:__node__
153
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:Class
154
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:35:__node__
155
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:32:__node__
156
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:26:__node__
157
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:22:__node__
158
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:20:__node__
159
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:16:__node__
160
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:12:__node__
161
+ 2 ./benchmark/../lib/fuzzy_match/wrapper.rb:11:__node__
162
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:6:__node__
163
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:3:Class
164
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:28:__node__
165
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:27:String
166
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:24:__node__
167
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:23:__node__
168
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:22:__node__
169
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:15:__node__
170
+ 2 ./benchmark/../lib/fuzzy_match/tightener.rb:10:__node__
171
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:60:__node__
172
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:50:__node__
173
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:4:__node__
174
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:46:__node__
175
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:3:__node__
176
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:34:__node__
177
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:30:__node__
178
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:2:Class
179
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:26:__node__
180
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:22:__node__
181
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:17:__node__
182
+ 2 ./benchmark/../lib/fuzzy_match/similarity.rb:16:__node__
183
+ 2 ./benchmark/../lib/fuzzy_match/score.rb:4:Class
184
+ 2 ./benchmark/../lib/fuzzy_match/score.rb:26:__node__
185
+ 2 ./benchmark/../lib/fuzzy_match/score.rb:22:__node__
186
+ 2 ./benchmark/../lib/fuzzy_match/score.rb:18:__node__
187
+ 2 ./benchmark/../lib/fuzzy_match/score.rb:17:String
188
+ 2 ./benchmark/../lib/fuzzy_match/score.rb:14:__node__
189
+ 2 ./benchmark/../lib/fuzzy_match/score.rb:13:String
190
+ 2 ./benchmark/../lib/fuzzy_match/result.rb:2:Class
191
+ 2 ./benchmark/../lib/fuzzy_match/result.rb:17:__node__
192
+ 2 ./benchmark/../lib/fuzzy_match/identity.rb:7:__node__
193
+ 2 ./benchmark/../lib/fuzzy_match/identity.rb:4:Class
194
+ 2 ./benchmark/../lib/fuzzy_match/identity.rb:23:__node__
195
+ 2 ./benchmark/../lib/fuzzy_match/identity.rb:22:__node__
196
+ 2 ./benchmark/../lib/fuzzy_match/identity.rb:21:__node__
197
+ 2 ./benchmark/../lib/fuzzy_match/identity.rb:11:__node__
198
+ 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:7:__node__
199
+ 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:6:__node__
200
+ 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:5:__node__
201
+ 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:String
202
+ 2 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:12:__node__
203
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:9:Class
204
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:34:__node__
205
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:32:__node__
206
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:30:__node__
207
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:29:__node__
208
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:23:__node__
209
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:16:__node__
210
+ 2 ./benchmark/../lib/fuzzy_match/blocking.rb:12:__node__
211
+ 2 ./benchmark/../lib/fuzzy_match.rb:86:Array
212
+ 1 benchmark/memory.rb:50:String
213
+ 1 benchmark/memory.rb:49:FuzzyMatch
214
+ 1 /Users/seamus/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/uri/common.rb:492:URI::Generic
215
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:19:Process::Status
216
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table/executor.rb:10:Bignum
217
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:63:Array
218
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:121:RemoteTable::Transformer
219
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:116:RemoteTable::Format::Delimited
220
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:111:RemoteTable::Properties
221
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/remote_table-1.1.6/lib/remote_table.rb:106:RemoteTable::LocalFile
222
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:Regexp
223
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:4:Array
224
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:__node__
225
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:String
226
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/amatch-0.2.5/lib/amatch/version.rb:1:Module
227
+ 1 /Users/seamus/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.5/lib/active_support/core_ext/hash/keys.rb:18:Hash
228
+ 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:__node__
229
+ 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:3:String
230
+ 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:25:String
231
+ 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:1:__node__
232
+ 1 ./benchmark/../lib/fuzzy_match/wrapper.rb:10:String
233
+ 1 ./benchmark/../lib/fuzzy_match/tightener.rb:4:String
234
+ 1 ./benchmark/../lib/fuzzy_match/tightener.rb:4:FuzzyMatch::ExtractRegexp
235
+ 1 ./benchmark/../lib/fuzzy_match/tightener.rb:3:__node__
236
+ 1 ./benchmark/../lib/fuzzy_match/tightener.rb:3:String
237
+ 1 ./benchmark/../lib/fuzzy_match/tightener.rb:1:__node__
238
+ 1 ./benchmark/../lib/fuzzy_match/similarity.rb:9:__node__
239
+ 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:__node__
240
+ 1 ./benchmark/../lib/fuzzy_match/similarity.rb:2:String
241
+ 1 ./benchmark/../lib/fuzzy_match/similarity.rb:25:String
242
+ 1 ./benchmark/../lib/fuzzy_match/similarity.rb:1:__node__
243
+ 1 ./benchmark/../lib/fuzzy_match/score.rb:4:__node__
244
+ 1 ./benchmark/../lib/fuzzy_match/score.rb:4:String
245
+ 1 ./benchmark/../lib/fuzzy_match/score.rb:3:__node__
246
+ 1 ./benchmark/../lib/fuzzy_match/score.rb:1:String
247
+ 1 ./benchmark/../lib/fuzzy_match/score.rb:13:Array
248
+ 1 ./benchmark/../lib/fuzzy_match/score.rb:10:__node__
249
+ 1 ./benchmark/../lib/fuzzy_match/result.rb:2:__node__
250
+ 1 ./benchmark/../lib/fuzzy_match/result.rb:2:String
251
+ 1 ./benchmark/../lib/fuzzy_match/result.rb:1:__node__
252
+ 1 ./benchmark/../lib/fuzzy_match/identity.rb:5:FuzzyMatch::ExtractRegexp
253
+ 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:__node__
254
+ 1 ./benchmark/../lib/fuzzy_match/identity.rb:4:String
255
+ 1 ./benchmark/../lib/fuzzy_match/identity.rb:1:__node__
256
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:4:__node__
257
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:__node__
258
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:String
259
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:2:Module
260
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:28:__node__
261
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:26:String
262
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:25:String
263
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:24:String
264
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:23:Regexp
265
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:1:__node__
266
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:17:Hash
267
+ 1 ./benchmark/../lib/fuzzy_match/extract_regexp.rb:10:String
268
+ 1 ./benchmark/../lib/fuzzy_match/blocking.rb:9:__node__
269
+ 1 ./benchmark/../lib/fuzzy_match/blocking.rb:9:String
270
+ 1 ./benchmark/../lib/fuzzy_match/blocking.rb:1:__node__
271
+ 1 ./benchmark/../lib/fuzzy_match/blocking.rb:10:FuzzyMatch::ExtractRegexp
272
+ 1 ./benchmark/../lib/fuzzy_match.rb:62:FuzzyMatch::Wrapper
273
+ 1 ./benchmark/../lib/fuzzy_match.rb:39:String
274
+ 1 ./benchmark/../lib/fuzzy_match.rb:39:FuzzyMatch::Result
275
+ 1 ./benchmark/../lib/fuzzy_match.rb:35:String
276
+ 1 ./benchmark/../lib/fuzzy_match.rb:209:Array
277
+ 1 ./benchmark/../lib/fuzzy_match.rb:199:String
278
+ 1 ./benchmark/../lib/fuzzy_match.rb:198:Array
279
+ 1 ./benchmark/../lib/fuzzy_match.rb:193:String
280
+ 1 ./benchmark/../lib/fuzzy_match.rb:192:Array
281
+ 1 ./benchmark/../lib/fuzzy_match.rb:187:String
282
+ 1 ./benchmark/../lib/fuzzy_match.rb:186:Array
283
+ 1 ./benchmark/../lib/fuzzy_match.rb:101:Array