S'il vous plaît aider à déchiffrer cet extrait de Lisp
-
28-09-2019 - |
Question
(let ((g (* 2 (or (gethash word good) 0)))
(b (or (gethash word bad) 0)))
(unless (< (+ g b) 5)
(max .01
(min .99 (float (/ (min 1 (/ b nbad))
(+ (min 1 (/ g ngood))
(min 1 (/ b nbad)))))))))
La solution
Quel est le problème? Il est l'anglais presque simple:
Soit g
à la valeur du word
dans la Hashtable good
(ou 0 sinon inexistante là-bas) fois 2
(let ((g (* 2 (or (gethash word good) 0)))
et b
la valeur de word
dans la Hashtable bad
(ou 0 sinon inexistante là-bas).
(b (or (gethash word bad) 0)))
Avec cela à l'esprit, et sous la présomption que la somme des g
et b
est pas inférieur à 5
(unless (< (+ g b) 5)
retourner le maximum soit de 0,01 ou
(max .01
soit le minimum de 0,99 ou
(min .99
b
/ nbad
divisé par la somme des b
/ nbad
et g
/ ngood
(comme une valeur en virgule flottante, et ces quotients individuels doit être au plus 1).
(float (/ (min 1 (/ b nbad))
(+ (min 1 (/ g ngood))
(min 1 (/ b nbad)))))))))
Autres conseils
On dirait qu'il essaie de calculer un score en fonction de la présence de word
dans les tables de hachage good
et bad
.
Si le mot n'existe pas dans une table de hachage, il est donné une valeur de 0, sinon si elle existe dans la bonne table, il est pondéré par 2 (doublé).
Si le score est inférieur à 5 calculer le score (partie ci-dessous unless
) comme suit:
score = min(1, b/nbad) / (min(1, g/ngood) + min(1, b/nbad))
max(0.01, min(0.99, score))
Je ne sais pas ce que ngood
et nbad
sont, mais alors n me indique qu'ils sont probablement compte. Il semble aussi que le code est conserve le score calculé ci-dessous 5. Il ressemble également dans le calcul du score le dénominateur sera maintenu à un maximum de 2 garder la limite inférieure du score à 0,5.
D'après les balises que vous avez utilisé, je suppose (et il est juste une supposition) qu'il tente de calculer une pondération pour mot basé sur une sorte de comptage de fréquence (?) Du mot en bon contre mauvais email.