Bonjour,
Je travaille sur la classification de documents avec la méthode de Bernoulli. J’utilise Python 3.5 et numpy pour faire mes calculs :
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 | """ Un document est de la forme : { 'class': 0, 'words': { 0:5, 3:6, # word:count si count > 0 } } """ def classes_distrib(data): distrib = np.zeros(N_CLASSES) for doc in data: distrib[doc['class']] += 1 return distrib def has_word(doc, word): return word in doc['words'] def bernoulli_training(data, voc_size): N = classes_distrib(data) Pi = N / len(data) df = np.zeros((N_CLASSES, voc_size)) for doc in data: for word in doc['words']: df[doc['class'], word] += 1 # Laplace smoothing PC = df + 1 for k in range(N_CLASSES): PC[k] /= N[k] + 2 return Pi, PC def bernoulli_test(doc, Pi, PC, voc_size): PiF = np.log(Pi) for k in range(N_CLASSES): for word in range(voc_size): if has_word(doc, word): PiF[k] += np.log(PC[k][word]) else: PiF[k] += np.log(1 - PC[k][word]) return np.argmax(PiF) |
Seulement, mes boucles dans ma fonction de test ne me semblent pas optimales et je me demandais si numpy me permettait de faire ça plus efficacement. Je suis tombé là-dessus mais passer par une liste en compéhension prendrait de la place inutilement. Et je ne vois pas comment vectoriser ma fonction has_word
.
Merci !
+0
-0