Utilisation de la bibliothèque FuzzyWuzzy pour des comparaisons floues en Python. Levenshtein Distance (distance éditoriale)

Il n'était pas sûr d'avoir bien entendu. Cela en dépendait tellement! Mais ne redemande pas? c) Boris Akunin. Le monde entier est un théâtre.

En travaillant sur l'assistant vocal mentionné dans l' article précédent , j'ai réalisé que je ne pouvais pas m'empêcher de partager la belle bibliothèque FuzzyWuzzy avec vous .

Bref, grâce à elle, il est possible de faire une comparaison de cordes floues sans aucune souffrance.

Premiers pas


Pour commencer, vous devez effectuer deux étapes:

/ IMPORTANT! Python version 2.7 et supérieure /

Étape 1. Installation.

Ouvrez la ligne de commande et entrez:

pip install fuzzywuzzy

Appuyez sur Entrée.
Ensuite, installez python-Levenshtein de la même manière pour accélérer la correspondance des chaînes de 3 à 10 fois.

pip install python-Levenshtein

Une fois l'installation terminée, la bibliothèque est prête à être importée.

Étape 2. Importation dans le projet.

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

Fonctionnel


1. La comparaison la plus courante:

a = fuzz.ratio(' ', ' ')
print(a)
#  : 100

Si nous changeons quelques caractères, la sortie obtiendra un nombre différent.

a = fuzz.ratio(' ', ' ')
print(a)
#  : 84

2. Comparaison partielle.

Ce type de comparaison dans toute la deuxième ligne recherche une correspondance avec la première, par exemple:

a = fuzz.partial_ratio(' ', ' !')
print(a)
#  : 100

Ou

a = fuzz.partial_ratio(' ', ' ,  ')
print(a)
#  : 100

Mais vous devez vous souvenir du registre, car

a = fuzz.partial_ratio(' ', ' ,  ')
print(a) 

#  : 90


3. Comparaison des

jetons 1) Les

mots du rapport de tri des jetons sont comparés les uns aux autres, indépendamment de la casse ou de l'ordre

a = fuzz.token_sort_ratio('  ', '  ')
print(a)
#  : 100

a = fuzz.token_sort_ratio('  ', '   ')
print(a)
#  : 78

a = fuzz.token_sort_ratio('1 2   ', '1   2 ')
print(a)
#  : 100

2) Token Set Ratio
Cette comparaison, contrairement au passé, équivaut à des chaînes, si leur différence est la répétition de mots.

a = fuzz.token_set_ratio('  ', '     ')
print(a)
#  : 100

4. Comparaison régulière avancée

Dans de nombreux cas, il est plus approprié d'utiliser WRatio , car il est sensible à la casse et à la ponctuation (ne divise pas la chaîne)

a = fuzz.WRatio('  ', '!  !')
print(a)
#  : 100

a = fuzz.WRatio('  ', '!,  !')
print(a)
#  : 97

5. Travailler avec la liste

Pour comparer les lignes avec les lignes de la liste, le module de processus est utilisé

city = ["", "-", "", "", "", "", "", "", "", "", ""]
a = process.extract("", city, limit=2)
#  limit     5
print(a)
#  : [('', 100), ('', 62)]

Si seul le premier de la liste est nécessaire, il est préférable d'utiliser extractOne

city = ["", "-", "", "", "", "", "", "", "", "", ""]
a = process.extractOne("", city)
print(a)
#  : ('', 90)

Application


Comment et où appliquer tout ce qui précède dépend de vous, mais voici un exemple tiré de mon article à long terme :

#    
try:
    files = os.listdir('C:\\Users\\hartp\\Desktop\\')
    filestart = process.extractOne(namerec, files)
    if filestart[1] >= 80:
        os.startfile('C:\\Users\\hartp\\Desktop\\' + filestart[0])
    else:
        speak('  ')
except FileNotFoundError:
    speak('  ')

Passons en revue le code et comprenons ce qui est quoi. Avec la

commande os.listdir, nous obtenons une liste de tous les fichiers qui sont présents à la fin du chemin spécifié (dans notre cas, vers le bureau).

files = os.listdir('C:\\Users\\hartp\\Desktop\\')
print(files)
#  : 'Visual Studio 2019.lnk', 'Visual Studio Code.lnk', 'WarThunder.lnk', 'WpfApp14', 'Yandex.lnk', '.docx', '.txt', ' .txt'  ..

Ensuite, une comparaison des lignes de la liste des fichiers avec le nom du fichier que l'utilisateur a nommé (variable namerec ). J'espère que vous avez remarqué que le résultat de la fonction extractOne est un tuple de chaîne et de nombre (indice de similarité)

Exemple du dernier chapitre
city = ["", "-", "", "", "", "", "", "", "", "", ""]
a = process.extractOne("", city)
print(a)
#  : ('', 90)
.

Sur cette base, nous vérifions l'index de similitude filestart [1]> = 80 ([1], puisque le tuple est numéroté à partir de 0, comme dans un tableau) et, si la condition est vraie, puis exécutons la fonction os.startfile avec un fichier appelé filestart [0 ]. Sinon, si l'indice de similitude est inférieur à 80 ou si une erreur se produit que le fichier n'a pas été trouvé, nous informons l'utilisateur via la fonction Speak .

Toutes les routes mènent à Matan


Caché aux gens qui ont peur des mathématiques
, , (). , .

( , ) — , .
S1 i S2 j
S1=vrhk
S2=rhgr

3 :

  1. : r → v
  2. : -r
  3. : rVhgr

:



0 1? ( — «0»), r , r ( , — «1»). v .

rh h, r ( ), , :



v r ( ).

, — v.

1. ? r , v. r , v, rv. , v v.



v rh



— v h r .



.



vr r , , , , .





vrh r h ( vr r), 2





vr r vrh rh, , .



, vrh rhg , , , - ( ).

, , ( ) — vrhk rhgr.

Merci à tous pour votre attention! J'espère que cet article sera utile à quelqu'un.


All Articles