Comment python-Levenshtein.le ratio est calculé
Selon la python-Levenshtein.ratio
source:
https://github.com/miohtama/python-Levenshtein/blob/master/Levenshtein.c#L722
c'est calculée comme (lensum - ldist) /lensum
. Cela fonctionne pour
distance('ab', 'a') = 1
ratio('ab', 'a') = 0.666666
Cependant, il semble rompre avec
distance('ab', 'ac') = 1
ratio('ab', 'ac') = 0.5
Je sens que je doit manquer quelque chose de très simple.. mais pourquoi ne pas 0.75
?
J'ai vérifié la bibliothèque (au lien que vous avez donné) je suis également une confusion pourquoi il est à l'aide de
sum
.Aussi (1-1/3) = .666..
ce correct d'après le code, mais aussi (1-1/4) = 0.75
Comment sa .5 ? pas très clair, même dans la documentation.... Mais La formule pour calculer la Distance de Levenshtein est dans ma réponse.OriginalL'auteur cjauvin | 2013-01-10
Vous devez vous connecter pour publier un commentaire.
Levenshtein pour
'ab'
et'ac'
comme ci-dessous:si l'alignement est:
Alignement longueur = 2
nombre de décalage = 1
Levenshtein Distance
est1
parce qu'un des substitutions est nécessaire pour le transfert deac
enab
(ou l'inverse)Rapport de Distance = (Levenshtein)/(Alignement de la longueur ) = 0.5
MODIFIER
vous écrivez
(lensum - ldist) /lensum
=(1 - ldist/lensum)
= 1 - 0.5 = 0.5.Mais c'est correspondant (pas à distance)
REFFRENCE, vous remarquerez peut-être de ses écrits
Matching %
Où
l
est lelevenshtein distance
etm
est lelength of the longest of the two
mots:(avis: un auteur d'utilisation plus longue des deux, j'ai utilisé l'alignement de la longueur)
Pourquoi certains auteurs divisent par l'alignement de la longueur,d'autres par la longueur maximum de l'un des deux?.., parce que Levenshtein ne considère pas l'écart. Distance = nombre de modifications (insertion + suppression + remplacement), Tandis que Needleman–Wunsch algorithme qui est la norme mondiale de l'alignement envisager d'écart. C'est (gap) de la différence entre Needleman–Wunsch et de Levenshtein, donc beaucoup de papier utilisation distance maximale entre deux séquences (MAIS C'EST MA PROPRE COMPRÉHENSION, ET IAM PAS SÛR à 100%)
Voici IEEE TRANSACTIONS on PAITERN ANALYSE : le Calcul Normalisé Distance d'Édition et Applications Dans ce papier Normalisé Distance d'Édition comme suit:
Avez-vous lu mon commentaire à votre question ...j'ai vérifié et j'ai la même impression que, selon la documentation, il doit être
.75
mais deux résultats dans votre exemple contredit.Oui j'ai vu ton commentaire, et c'est pourquoi, bien que la bonne et intéressante, je ne peux pas accepter votre réponse comme la solution, parce que ce que je suis vraiment après est la raison de la contradiction dans ce morceau de code. Je devrais peut-être demander à la PL responsable.
Par le changement, je suis en train de travailler pour vous ..je sens que je suis en train de regarder ce fichier(u aimé)..Si dans le cas que je trouve quelque chose je vous répondrai...donnez-moi un peu de temps...
ok merci pour vos efforts, de toute façon.
OriginalL'auteur Grijesh Chauhan
En regardant plus attentivement le code en C, j'ai trouvé que cette contradiction apparente est due au fait que
ratio
traite de la "remplacer" opération d'édition différemment que les autres opérations (c'est à dire avec un coût de 2), tandis quedistance
traite tous de la même manière avec un coût de 1.Ceci peut être vu dans les appels à l'intérieur
levenshtein_common
fonction faite dansratio_py
fonction:https://github.com/miohtama/python-Levenshtein/blob/master/Levenshtein.c#L727
et par
distance_py
fonction:https://github.com/miohtama/python-Levenshtein/blob/master/Levenshtein.c#L715
qui aboutit finalement à des coûts différents arguments envoyés à une autre fonction interne,
lev_edit_distance
, qui a la doc suivante extrait de:Code de lev_edit_distance():
[RÉPONDRE]
Donc, dans mon exemple,
ratio('ab', 'ac')
implique une opération de remplacement (coût de 2), sur le total de la longueur des cordes (4), d'où2/4 = 0.5
.Qui explique le "comment", je suppose que le seul aspect serait le "pourquoi", mais pour le moment je suis satisfait de cette compréhension.
OriginalL'auteur cjauvin
Bien qu'il n'y a pas d'absolu standard, normalisé Levensthein distance est le plus souvent définie
ldist /max(len(a), len(b))
. Que donnerait .5 pour les deux exemples.La
max
sens dans la mesure où il est le plus bas de la limite supérieure de la distance de Levenshtein: pour obtenira
deb
oùlen(a) > len(b)
, vous pouvez toujours remplacer la premièrelen(b)
éléments deb
correspondant à ceux dea
, puis insérez la partie manquantea[len(b):]
, pour un total delen(a)
les opérations d'édition.Cet argument s'étend dans le moyen le plus évident pour le cas où
len(a) <= len(b)
. Pour activer distance normalisée dans une mesure de similarité, de la soustraire:1 - ldist /max(len(a), len(b))
.most commonly defined ldist / max(len(a), len(b))
, envisager l'écart est Needleman–Wunsch algorithmeOriginalL'auteur Fred Foo
(lensum - ldist) /lensum
ldist n'est pas la distance, est la somme des coûts
Chaque numéro de la matrice qui n'est pas le match qui vient d'en haut, de gauche à droite ou en diagonale
Si le nombre vient de la gauche, il est d'une Insertion, il vient d'en haut, c'est une suppression, il s'agit de la diagonale, c'est un remplacement
L'insérer et de supprimer le coût de la 1, et la substitution d'un coût de 2.
Le coût de remplacement est de 2 parce que c'est un supprimer et insérer des
ab ac coût est de 2 parce que c'est un remplacement
Pour plus d'informations: python-Levenshtein de calcul du ratio de
Un autre exemple:
Le coût est 9, paragraphe 4, remplacer => 4*2=8 et 1 supprimer 1*1=1, 8+1=9)
distance = 5 (Selon le vecteur (7, 6) = 5 de la matrice)
ratio (13-9)/13 = 0.3076923076923077
OriginalL'auteur rafaelcb21