2017-10-05 7 views
3

J'ai des ensembles de données. Le premier (A) est une liste d'équipement avec des noms sophistiqués. La seconde est une liste de catégories d'équipement plus larges (B) - à laquelle je dois regrouper la première liste en utilisant des comparaisons de chaînes. Je suis conscient que ce ne sera pas parfait.Comparaison de chaînes pour plusieurs valeurs python

Pour chaque entité de la liste A - Je souhaite établir la distance levenshtein pour chaque entité de la liste B. L'enregistrement de la liste B ayant le score le plus élevé sera le groupe auquel j'attribuerai ce point de données.

Je suis très rouillé en python - et je joue avec FuzzyWuzzy pour obtenir la distance entre deux valeurs de chaîne. Cependant, je n'arrive pas à comprendre comment parcourir chaque liste pour produire ce dont j'ai besoin.

Je supposais que je créerais simplement une liste pour chaque ensemble de données et écrirais une boucle assez simple pour chacun - mais comme je l'ai dit je suis un peu rouillé et ne pas avoir de chance.

Toute aide serait grandement appréciée! S'il y a un autre paquet qui me permettra de faire ceci (pas Fuzzy) - je suis heureux de prendre des suggestions.

+0

Regardez ceci, ça va aider beaucoup. Ned Batchelder - Loop comme un natif: tandis que, pour, itérateurs, générateurs https://www.youtube.com/watch?v=EnSu9hHGq5o – diek

Répondre

4

Il semble que la fonction process.extractOne soit ce que vous cherchez. Un cas simple d'utilisation est quelque chose comme

from fuzzywuzzy import process 
from collections import defaultdict 

complicated_names = ['leather couch', 'left-handed screwdriver', 'tomato peeler'] 
generic_names = ['couch', 'screwdriver', 'peeler'] 

group = defaultdict(list) 

for name in complicated_names: 
    group[process.extractOne(name, generic_names)[0]].append(name) 

defaultdict est un dictionnaire qui a des valeurs par défaut pour toutes les clés.

Nous bouclons sur tous les noms compliqués, utilisez fuzzywuzzy pour trouver la correspondance la plus proche, puis ajoutez le nom au list associé à cette correspondance.