por favor ajude a decifrar este extrato lisp
-
28-09-2019 - |
Pergunta
(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)))))))))
Solução
Qual é o problema? É quase inglês quase claro:
Deixar g
ser o valor de word
na hashtable good
(ou 0 se não existir lá) vezes 2
(let ((g (* 2 (or (gethash word good) 0)))
e b
o valor de word
na hashtable bad
(ou 0 se não existir lá).
(b (or (gethash word bad) 0)))
Com isso em mente, e sob a presunção de que a soma de g
e b
não é menor que 5
(unless (< (+ g b) 5)
Retorne o máximo de 0,01 ou
(max .01
o mínimo de 0,99 ou
(min .99
b
/nbad
dividido pela soma de b
/nbad
e g
/ngood
(como valor de flutuação, e esses quocientes individuais devem ser no máximo 1).
(float (/ (min 1 (/ b nbad))
(+ (min 1 (/ g ngood))
(min 1 (/ b nbad)))))))))
Outras dicas
Parece que está tentando calcular uma pontuação com base na presença de word
nas mesas de hash good
e bad
.
Se a palavra não existir em uma tabela de hash, ela receberá um valor 0, caso contrário, se existir na tabela boa, será ponderada por 2 (dobrado).
Se a pontuação for menor que 5, calcule a pontuação (parte abaixo unless
) do seguinte modo:
score = min(1, b/nbad) / (min(1, g/ngood) + min(1, b/nbad))
max(0.01, min(0.99, score))
Não tenho certeza do que ngood
e nbad
são mas n indica para mim que provavelmente são contagens. Também parece que o código é mantém a pontuação calculada abaixo de 5. Também parece no cálculo da pontuação que o denominador será mantido no máximo 2, mantenha o limite inferior da pontuação para 0,5.
Com base nas tags que você usou, eu acho (e é apenas um palpite) que está tentando calcular uma ponderação para o Word com base em algum tipo de frequência (?) Contagem da palavra em e -mail bom versus ruim.