0

Je souhaite rechercher les permutations qui correspondent à un mot donné et organiser mes données en fonction de la position de la colonne.Rechercher une permutation similaire d'un mot dans une autre colonne

IE - J'ai créé un fichier CSV avec les données que je mis au rebut de plusieurs websites.Say il ressemble à ceci:

Name1  OtherVars Name2  More Vars 

Stanford 23451  Mamford  No 
MIT   yes  stanfor1d  12 
BeachBoys pie  Beatles  Sweeden 

Je veux (1) trouver des permutations de chaque mot de Name1 dans Nom2, puis (2) imprimer une table avec ce mot de Name1 + c'est mot correspondant dans OtherVars + la permutation de ce mot dans Name2 + c'est match dans MoreVars. (si aucune correspondance trouvée, il suffit de supprimer le mot).

Le résultat sera dans ce cas:

Name1  OtherVars  Name2  More Vars 

Stanford 23451  stanford  12 

Alors, comment puis-je:

  1. Trouver des permutations correspondant à un mot dans un autre colonne?

  2. Imprimer les 2 mots et les valeurs auxquels ils sont mappés dans d'autres colonnes?

PS - voici une question similaire; Cependant, c'est Java et c'est un pseudo code. How to find all permutations of a given word in a given text? difflib ne semble pas convenir à CSVs basé sur ce: How to find the most similar word in a list in python

PS2 - On m'a conseillé d'utiliser Fuzzymatch cependant, je pense que c'est un surpuissant dans ce cas.

+1

Est-ce que la deuxième entrée dans 'Name2' est supposée avoir un 1 dedans? – marisbest2

+0

Aussi, qu'est-ce qu'une "permutation" dans ce cas et comment définissez-vous "similaire"? – marisbest2

+0

Oui @ marisbest2 le 1 signifiait être là. Les permutations seraient définies comme assez similaires, ce qui pourrait utiliser la distance de Levenshtein, ou mieux, la fonction définie par l'utilisateur. – oba2311

Répondre

0

Si vous êtes à la recherche d'une fonction qui retourne la même sortie pour « Stanford » et « stanf1ord », vous pouvez:

  • utilisent des minuscules
  • ne garder que des lettres type
  • les lettres


import re 

def signature(word): 
    return sorted(re.findall('[a-z]', word.lower())) 

print(signature("Stanford")) 
# ['a', 'd', 'f', 'n', 'o', 'r', 's', 't'] 
print(signature("Stanford") == signature("stanfo1rd")) 
# True 

Vous pouvez créer un ensemble ou une dictée de signatures à partir de la 1ère colonne, et voir s'il y a une correspondance dans la seconde colonne.

+0

Merci, mais je crois que cette normalisation que vous suggérez n'est que le premier pas de beaucoup dans ce problème. Comment rechercher un bon match proche du mot, APRÈS la normalisation comme vous le suggérez. Suggérez-vous de normaliser toutes les données dans l'espace de recherche? – oba2311

+0

@ oba2311 Vous avez seulement mentionné les permutations dans votre question. Les permutations sont couvertes par mon code. Si vous avez besoin d'une logique plus floue, vous devez définir exactement le type de et montrer que vous avez essayé quelque chose. –

0

Vous semblez vouloir une correspondance floue, pas des "permutations". Il y a quelques bibliothèques de correspondance floue de python, mais je pense que les gens aiment fuzzywuzzy

Alternativement, vous pouvez rouler le vôtre. Quelque chose comme

def ismatch(s1,s2): 
    # implement logic 
    # return boolean if match 
    pass 

def group(): 
    pairs = [(n1, v1, n2, v2) for n1 in names1 for n2 in names2 if ismatch(n1,n2)] 
    return pairs