Server IP : 66.29.132.122 / Your IP : 18.226.34.25 Web Server : LiteSpeed System : Linux business142.web-hosting.com 4.18.0-553.lve.el8.x86_64 #1 SMP Mon May 27 15:27:34 UTC 2024 x86_64 User : admazpex ( 531) PHP Version : 7.2.34 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /proc/self/root/proc/self/root/proc/thread-self/root/proc/thread-self/root/opt/puppetlabs/puppet/lib/ruby/vendor_gems/gems/text-1.3.1/lib/text/ |
Upload File : |
# encoding: utf-8 # Original author: Wilker LĂșcio <wilkerlucio@gmail.com> require "set" module Text # Ruby implementation of the string similarity described by Simon White # at: http://www.catalysoft.com/articles/StrikeAMatch.html # # 2 * |pairs(s1) INTERSECT pairs(s2)| # similarity(s1, s2) = ----------------------------------- # |pairs(s1)| + |pairs(s2)| # # e.g. # 2 * |{FR, NC}| # similarity(FRANCE, FRENCH) = --------------------------------------- # |{FR,RA,AN,NC,CE}| + |{FR,RE,EN,NC,CH}| # # = (2 * 2) / (5 + 5) # # = 0.4 # # WhiteSimilarity.new.similarity("FRANCE", "FRENCH") # class WhiteSimilarity def self.similarity(str1, str2) new.similarity(str1, str2) end def initialize @word_letter_pairs = {} end def similarity(str1, str2) pairs1 = word_letter_pairs(str1) pairs2 = word_letter_pairs(str2).dup union = pairs1.length + pairs2.length intersection = 0 pairs1.each do |pair1| if index = pairs2.index(pair1) intersection += 1 pairs2.delete_at(index) end end (2.0 * intersection) / union end private def word_letter_pairs(str) @word_letter_pairs[str] ||= str.upcase.split(/\s+/).map{ |word| (0 ... (word.length - 1)).map { |i| word[i, 2] } }.flatten.freeze end end end