2017-01-28 4 views
0

Je suis passé par les gemmes PNL suivantes disponibles dans GitHub NLP mais pas en mesure de trouver la bonne solution.Grouper le texte en bloc comme dans le groupe basé sur le pourcentage de similarité donné

Y a-t-il une gemme ou une bibliothèque disponible pour grouper du texte en fonction d'un pourcentage similaire donné? Toutes les gemmes ci-dessus aident à trouver la similarité entre deux chaînes, mais en regroupant un ensemble de données en vrac prenant beaucoup de temps.

Répondre

1

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