En utilisant, entre autres sources, divers messages ici sur Stackoverflow, j'essaie d'implémenter mon propre classeur PHP pour classer les tweets en une classe positive, neutre et négative. Avant de coder, il faut que je mette le processus en place. Mon train de pensée et un exemple sont les suivantes:Utilisation d'un classificateur Naive Bayes pour classer les tweets: quelques problèmes
p(class) * p(words|class)
Bayes theorem: p(class|words) = ------------------------- with
p(words)
assumption that p(words) is the same for every class leads to calculating
arg max p(class) * p(words|class) with
p(words|class) = p(word1|class) * p(word2|topic) * ... and
p(class) = #words in class/#words in total and
p(word, class) 1
p(word|class) = -------------- = p(word, class) * -------- =
p(class) p(class)
#times word occurs in class #words in total #times word occurs in class
--------------------------- * --------------- = ---------------------------
#words in total #words in class #words in class
Example:
------+----------------+-----------------+
class | words | #words in class |
------+----------------+-----------------+
pos | happy win nice | 3 |
neu | neutral middle | 2 |
neg | sad loose bad | 3 |
------+----------------+-----------------+
p(pos) = 3/8
p(neu) = 2/8
p(meg) = 3/8
Calculate: argmax(sad loose)
p(sad loose|pos) = p(sad|pos) * p(loose|pos) = (0+1)/3 * (0+1)/3 = 1/9
p(sad loose|neu) = p(sad|neu) * p(loose|neu) = (0+1)/3 * (0+1)/3 = 1/9
p(sad loose|neg) = p(sad|neg) * p(loose|neg) = 1/3 * 1/3 = 1/9
p(pos) * p(sad loose|pos) = 3/8 * 1/9 = 0.0416666667
p(neu) * p(sad loose|neu) = 2/8 * 1/9 = 0.0277777778
p(neg) * p(sad loose|neg) = 3/8 * 1/9 = 0.0416666667 <-- should be 100% neg!
Comme vous pouvez le voir, je l'ai « formé » le classificateur avec un positif (« heureux gagnant bien »), neutre (« milieu neutre ») et un tweet négatif ("triste loose loose"). Pour éviter les problèmes d'avoir des probabilités de zéro à cause d'un mot manquant dans toutes les classes, j'utilise le LaPlace (ou ädd one "), voir" (0 + 1) ". :
- est-ce un plan approprié pour la mise en œuvre y at-il place à l'amélioration
- Lors du classement d'un tweet (« triste lâche »), il devrait être 100% en classe « neg » parce qu'elle ne? Le lissage de LaPlace rend les choses plus compliquées: les classes pos et neg ont une probabilité égale, y a-t-il une solution de contournement?
'p (class) = # mots dans la classe/# mots au total' ne semble pas correct si vous classifiez des tweets. Ce devrait être 'p (class) = # tweets dans la classe/# tweets'. Il semble que beaucoup de vos problèmes pourraient provenir de cette question de ce que vous êtes en train de classer ... – Xodarap