Vous pouvez le faire en utilisant juste Ruby plus l'un des gemmes énumérés.
J'ai choisi parce que je fuzzy-string-match
aimé le nom
Voici comment utiliser la pierre précieuse:
require 'fuzzystringmatch'
# Create the matcher
jarow = FuzzyStringMatch::JaroWinkler.create(:native)
# Get the distance
jarow.getDistance( "jones", "johnson")
# => 0.8323809523809523
# Round it
jarow.getDistance( "jones", "johnson").round(2)
# => 0.83
Depuis que vous obtenez un flotteur, vous pouvez définir la précision que vous êtes à la recherche d'utilisation de la round
méthode. Maintenant, pour grouper des résultats similaires, vous pouvez utiliser les méthodes group_by
trouvées dans le module Enumerable
.
Vous passez un bloc et group_by
va itérer sur la collection. Pour chaque itération, vous renvoyez la valeur pour laquelle vous essayez de vous regrouper (dans ce cas, la distance) et il renvoie un hachage avec les distances en tant que clés et tableaux de chaînes correspondant à des valeurs différentes.
require 'fuzzystringmatch'
jarow = FuzzyStringMatch::JaroWinkler.create(:native)
target = "jones"
precision = 2
candidates = [ "Jessica Jones", "Jones", "Johnson", "thompson", "john", "thompsen" ]
distances = candidates.group_by { |candidate|
jarow.getDistance(target, candidate).round(precision)
}
distances
# => {0.52=>["Jessica Jones"],
# 0.87=>["Jones"],
# 0.68=>["Johnson"],
# 0.55=>["thompson", "thompsen"],
# 0.83=>["john"]}
J'espère que cette aide