Je cherche à calculer la distance de Levenshtein sur le fichier rockyou je ne trouve pas de fonction qui marche cosine similarity aussi je suis désespéré j'ai récupéré des librairies et ça ne fonctionne pas aidez-moi au moins pour le cosine et la distance de Levenshtein ci-joint le fichier rockyou
s'il vous plait aidez-moi
Salut,
Regardez comment se calcule la distance de Levenshtein et essayez de le coder en Python...
- W
voici mon code et je ne vois comment le debuguer
voici l'erreur je ne vois comment faire merci pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import Levenshtein #first u have to open the file and seperate every line like below: #with open(r'C:\Users\User\Desktop\rockyou.txt', "r",encoding="ISO-8859-1") as f: # lines = f.readlines() df_result = pd.read_excel(r'Memoireid3125439.xlsx') documents=("K KAPOOR","L KAPOOR") tfidf_vectorizer=TfidfVectorizer() tfidf_matrix=tfidf_vectorizer.fit_transform(documents) def jaccard_similarity(list1, list2): intersection = len(list(set(list1).intersection(list2))) union = (len(list1) + len(list2)) - intersection return float(intersection) / union for i in df_result.index: result = cosine_similarity(tfidf_matrix[0:1],tfidf_matrix) Levensthein = distance(df_result["id"][i],df_result["password"][i]) jaccard = jaccard_similarity(df_result["id"][i],df_result["password"][i]) print(result) print(Levensthein)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 ImportError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_3096/876404934.py in <module> 2 from sklearn.feature_extraction.text import TfidfVectorizer 3 from sklearn.metrics.pairwise import cosine_similarity ----> 4 import Levenshtein 5 6 ~\Desktop\python-Levenshtein-0.12.0\Levenshtein\__init__.py in <module> ----> 1 from Levenshtein import _levenshtein 2 from Levenshtein._levenshtein import * 3 4 __doc__ = _levenshtein.__doc__ ImportError: cannot import name '_levenshtein' from partially initialized module 'Levenshtein' (most likely due to a circular import) (C:\Users\User\Desktop\python-Levenshtein-0.12.0\Levenshtein\__init__.py)
Une distance de Levenshtein est une distance qui sépare deux chaines. Je ne vois pas comment on peut l'appliquer sur un fichier. C'est exactement comme si tu avais dit "je cherche à calculer la distance en km sur la ville de Paris", ça ne veut rien dire du tout.
Moi je ne vois pas, dans ce code, de lien avec le fichier "rockyou"
Bis repetita: arrête de vouloir récupérer des trucs qui ne marchent pas et code toi un truc qui marche. Accessoirement Hominidé t'a demandé pourquoi tu avais besoin de "cosine similarity", la moindre des politesses eût été de lui répondre.
Tu sais que reproduire les mêmes actions en espérant un résultat différent est un signe de stupidité ? Je t'ai déjà expliqué le souci et comment le régler. Donc si tu reposes la même question, tu auras la même réponse (merci au ctrl-c+ctrl-v) : supprimer l'instruction. Tu fais ce qu'on appelle un "import circulaire". Un module A qui importe un module B, et un module B qui, soit directement, soit indirectement, importe le module A.
Il n'y a aucun moyen de régler le conflit. Il faut repenser le code, le réorganiser. Par exemple créer un programme principal qui importe le module A et le module B. Là le module A, même sans importer le module B, pourra quand-même utiliser des outils du module B (puisque c'est le programme principal qui s'est chargé des imports)
Voilà, il n'y a pas plus clair.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
salut hominde desole de ma reponse tardive je suis perturbe le cosine similarite est pour trouver d'eventuelle correlation
je ne sais pas resoudre l'import circulaire merci pour ton aide d'avance
Vérifiez d'abord que le module python-Levenshtein est correctement installé car l'erreur dit aussi qu'il ne trouve pas la DLL correspondante.
note: faire quelque chose (comme installer un module) et vérifier que c'est correct avant de partir à vouloir s'en servir... c'est juste un minimum de rigueur.
- W
Entre quoi et quoi???
Et c'est franchement pas compliqué à trouver !!!
Trouvé ici en 4 secondes https://stackoverflow.com/questions/...2-number-lists
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 >>> a=[3, 45, 7, 2] >>> b=[2, 54, 13, 15] >>> from numpy import dot >>> from numpy.linalg import norm >>> dot(a, b)/(norm(a)*norm(b)) 0.9722842517123499 >>> import math >>> sum(i*j for (i, j) in zip(a, b))/(math.sqrt(sum(i**2 for i in a))*math.sqrt(sum(i**2 for i in b))) 0.9722842517123499 >>>
Ben repars ailleurs. En 3 secondes j'ai trouvé ce code qui calcule une distance de Levenshtein: https://128mots.com/index.php/2021/0...shtein-python/
Voilà. Total 7 secondes. J'ai mis plus de temps à taper ce post...
PS: on remarquera entre temps que le souci du int.lower() semble avoir disparu...![]()
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Dans un sujet précédent, ici il a un csv de login et mots de passe et cherche une correlation entre id et pass.
Peut-être qu'il désire (plus tard) deviner une liste de mots de passe pour un login particulier/approchant ??? ps: me semble bien faux comme hypothèse mais comme exercice, pourquoi pas
Peut-être que la solution "cosine" a été piochée sur le web comme tous les autres bouts de code python ?
C'est une solution qui permet de mesurer la distance (sous forme d'un nombre dans [-1, 1]) entre 2 mots de passe (comme la distance de Levenshtein). Et donc d'avoir une mesure "objective" de la similarité entre différents mots de passe.
Après que peut on faire avec ça est un sujet de sécurité (informatique) et ce forum n'est pas le lieu pour en discuter (même s'il était fréquenté par les experts du domaine, ayant des choses intéressantes à raconter sur le sujet, ce n'est pas le lieu où leur prose pourrait profiter aux personnes qui s'intéressent à ces sujets).
Dans un forum de programmation Python, on ne s'intéresse pas trop aux motivations (au pourquoi du pourquoi on veut coder un machin qui...). Si je veux écrire un bout de code qui aille craquer un site internet et que j'ai des problèmes à le mettre au point, je créer un exemple "neutre" qui permet de reproduire le problème sans dire que la mise au point de ce bout est une des pièces maîtresse d'une machine de guerre.
Il y a longtemps, lorsqu'on faisait construire à des maçons des passages secrets, on les trucidait à la livraison (ainsi que leur proches) histoire que le secret soit bien gardé. Avec le temps, on a trouvé que se défaire ainsi d'expertises était dommageable et on a créé la franc-maçonnerie (des qui s'engageaient à ne rien divulguer sous peine de punitions par leurs confrères). Plus connu de nos jours est le secret défense... mais il est beaucoup plus subtil de bosser normalement pour des sous ensembles de projets dont on ignore la destination.
- W
Ce que je vois ici, c'est une "comparaison" id/pass et non entre mots de passe, ce qui me fait donc douter (de cosine).
Non, en fait je n'ai rien vu de mal dans ma supposition, oui le mot deviner est trop fort. Mais oui, il peut avoir des cas très intéressant pour la sécurité, par exemple:
pour un intranet(ou forum), en fonction du login/pass du nouvel utilisateur, le site va afficher un message
ps: message moins explicite sinon c'est un encouragement à cet utilisateur de tester "warrior05:123"Attention `warrior`, votre mot de passe est trop classique (20% des logins proches du votre ont un mot de passe du type "123")
Mais ici, il faut créer des "groupes" id et groupes "pass" (numerique,==id, complexe,...formule mathématique) et faire des relations entre groupes ? ce qui est loin du code présent
----------------
comparaison/liaison id/pass avec cosine, comme dit plus haut, je ne vois aucun rapport entre les 2 :
si j'ai paul{,07,line} qui utilisent "123" comme pass
Rien ne me dit que paul08 va lui pencher vers le même type de pass
si aucune "michelle" n'a encore utilisé "123", rien ne dit que michele09 ne va pas l'utiliser
La liaison id/pass est le hazard (sauf pour quelques uns comme root:root)
Le PO ne sait pas programmer donc il navigue a vue sans qu'on sache trop le pourquoi du comment...
Ceci dit, bien qu'on puisse être perplexe sur le problème qu'il cherche à résoudre, on ne peut que constater qu'il ne sait pas programmer => résoudre ses problèmes risque de le mener nulle part (un problème XY).
- W
Bonjour comment faire pour parcourir ligne par ligne le dataframe et calculer la distance de levensthein entre le login et le mot de passe j’ai fais une boucle mais ça n’affiche pas toutes les lignes
Merci d’avance
coucou au lieu de se moquer de moi que je ne sais pas programmer etes vous capable de m'expliquer pourquoi on arrive pas avec ce code
a calculer la quantite sur chaque ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 def levenshtein(chaine1, chaine2): taille_chaine1 = len(chaine1) + 1 taille_chaine2 = len(chaine2) + 1 levenshtein_matrix = np.zeros ((taille_chaine1, taille_chaine2)) for x in range(taille_chaine1): levenshtein_matrix [x, 0] = x for y in range(taille_chaine2): levenshtein_matrix [0, y] = y for x in range(1, taille_chaine1): for y in range(1, taille_chaine2): if chaine1[x-1] == chaine2[y-1]: levenshtein_matrix [x,y] = min( levenshtein_matrix[x-1, y] + 1, levenshtein_matrix[x-1, y-1], levenshtein_matrix[x, y-1] + 1 ) else: levenshtein_matrix [x,y] = min( levenshtein_matrix[x-1,y] + 1, levenshtein_matrix[x-1,y-1] + 1, levenshtein_matrix[x,y-1] + 1 ) return (levenshtein_matrix[taille_chaine1 - 1, taille_chaine2 - 1]) print("distance de levenshtein = " + str(levenshtein("Lorem ipsum dolor sit amet", "Laram zpsam dilir siy amot"))) def get_cosine(vec1, vec2): intersection = set(vec1.keys()) & set(vec2.keys()) numerator = sum([vec1[x] * vec2[x] for x in intersection]) sum1 = sum([vec1[x]**2 for x in vec1.keys()]) sum2 = sum([vec2[x]**2 for x in vec2.keys()]) denominator = math.sqrt(sum1) * math.sqrt(sum2) if not denominator: return 0.0 else: return float(numerator) / denominator def text_to_vector(text): word = re.compile(r'\w+') words = word.findall(text) return Counter(words) def get_result(content_a, content_b): text1 = content_a text2 = content_b vector1 = text_to_vector(text1) vector2 = text_to_vector(text2) cosine_result = get_cosine(vector1, vector2) return cosine_result je parcours les lignes pourtant a cet endroit for i in df_result.index: result = get_result(df_result["id"][i],df_result["password"][i]) Levensthein = levenshtein(df_result["id"][i],df_result["password"][i]) jaccard = jaccard_similarity(df_result["id"][i],df_result["password"][i]) print(result) print(Levensthein) print(jaccard) print(result)
le fichier est le fichier ci dessus rockyou le calcul se fait que pour une ligne pourtant je parcours par index la ligne du dataframe
merci d'avance
Euh... tu fais là une grave erreur. On ne se moque pas de toi parce que tu ne sais pas programmer, on se moque de toi parce que tu ne fais aucun effort pour apprendre à programmer. C'est là une nuance assez importante. Tu arrives avec tes codes piochés on ne sais où (enfin si ici je sais où tu l'as trouvé, tu l'as trouvé sur ce lien que je t'ai filé récemment) mais tu ne fais aucun effort pour essayer de comprendre ce qui est écrit. La preuve, le code donné finit sur un test print("distance de levenshtein = " + str(levenshtein("Lorem ipsum dolor sit amet", "Laram zpsam dilir siy amot"))) fait pour tester la fonction, t'as même pas eu l'idée de l'enlever pour ton programme (dans lequel ce test ne sert plus à rien). Donc on se moque de toi parce que tu es une honte pour la population de ceux qui veulent vraiment apprendre Python.
Voilà, même là on pige que dalle. La quantité de quoi??? De pommes de terres récoltées en Australie??? T'es même pas foutu de poser une question complète et intelligible.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
ok les amis je vais etre rigoureux et je vais montrer mon vraie visagelol
pouquoi je n'ai qu'une ligne d'afficher de rockyou pour le calcul de la distance de levenshtein et jaccard j'ai le resultat que pour la premiere ligne j'aurais du mettre un tableau result je pense
alors que je parcours toutes les lignes du dataframe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 je parcours les lignes pourtant a cet endroit for i in df_result.index: result = get_result(df_result["id"][i],df_result["password"][i]) Levensthein = levenshtein(df_result["id"][i],df_result["password"][i]) jaccard = jaccard_similarity(df_result["id"][i],df_result["password"][i]) print(result) print(Levensthein) print(jaccard) print(result)
Ca c'est toi qui le dit, et visiblement pour Python ce n'est pas le cas.
Déjà est-ce que vraiment for i in result.index signifie "je vais parcourir toutes les lignes" ??? Cela veut dire que "result.index" contiendrait donc la liste des lignes. Peut-être, peut-être pas (je ne sais pas ce qu'est "result.index" mais surtout tu ne montres pas comment tu as chargé "result"). Quoi qu'il en soit, un print(result.index) aurait permis de t'en assurer (et ça on te l'a déjà dit !!!).
A partir de là...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
En effet , du rigoureux
donc tu nous dis que tu codes in truc que tu n'aurrais pas du faire ? rigoureux en codage ! et pourquoi ne pas avoir des champs pour les résultats dans ta table ? (pas trouvé le code sur le web?)j'aurais du mettre un tableau result
Tu nous dis que ta boucle ne s'exécute qu'une fois ? (pas clair)j'ai le resultat que pour la premiere ligne
Donc rien à voir avec tes calculs. Tu as fait un bond en arrière de 15 jours ?
Mais puisque tu ne nous donne aucune sortie : on a aucune idée de ton véritable problème avec ton bout de code (même si il était complet)
-----------
Décompose ton code, essaye de tester une seule chose à la fois TON ERREUR avec un autre script de test le plus minimal possible (sur ta db ou tes calculs ???)
par exemple (pour calcul pas ta db)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 def levenshtein(login: str, mot_de_passe: str): return sum(ord(x) for x in login) % sum(ord(x) for x in mot_de_passe) # pas pour toi colnames = ['id', 'password', 'levensthein'] df = pd.DataFrame([ # a modifier selon ton véritable format ['pierre', '123', ''], ['paul', 'admin', ''], ['root', 'root', '']], columns = colnames) pd.set_option('display.max_rows', 6) print(df) for i in df.index: print(i, end=" ") # boucle est ok ? print(df["id"][i], end=" ") # une valeur dans table ? ou pas toujours la même valeur ? lev_result = levenshtein(df["id"][i], df["password"][i]) # df["levensthein"][i] = lev_result print("levensthein:", lev_result) if i>5: # si utilise plus tard la véritable db break print(df)
Partager