2012-04-03 4 views
4

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) ". :

  1. est-ce un plan approprié pour la mise en œuvre y at-il place à l'amélioration
  2. 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?
+1

'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

Répondre

3

Il y a deux éléments principaux à améliorer dans votre raisonnement.

D'abord, vous devez améliorer votre méthode de lissage:

  • Lors de l'application de lissage de Laplace, il doit être appliqué à toutes les mesures, non seulement à ceux qui ont zéro dénominateur.
  • En outre, le lissage de Laplace pour de tels cas est habituellement donné par (c + 1)/(N + V), où V est la taille du vocabulaire (par exemple, voir Wikipedia).

Par conséquent, en utilisant la fonction de probabilité que vous avez défini (ce qui pourrait ne pas être le plus approprié, voir ci-dessous):

p(sad loose|pos) = (0+1)/(3+8) * (0+1)/(3+8) = 1/121 

p(sad loose|neu) = (0+1)/(3+8) * (0+1)/(3+8) = 1/121 

p(sad loose|neg) = (1+1)/(3+8) * (1+1)/(3+8) = 4/121 <-- would become argmax 

En outre, d'une manière plus courante de calculer la probabilité en premier lieu, serait par:

(number of tweets in class containing term c)/(total number of tweets in class) 

par exemple, dans la rame limitée donnée ci-dessus, et abstraction faite de lissage, p (triste | pos) = 0/1 = 0, et p (triste | neg) = 1/1 = 1. Lorsque la taille de la rame augmente, les chiffres seraient plus meani sérieux. par exemple. Si vous aviez 10 tweets pour la classe négative, avec 'triste' apparaissant dans 4 d'entre eux, alors p (sad | neg) aurait été de 4/10.

En ce qui concerne le nombre réel produit par l'algorithme de Naive Bayes: vous ne devriez pas vous attendre à ce que l'algorithme affecte une probabilité réelle à chaque classe; l'ordre des catégories a plutôt plus d'importance. Concrètement, l'utilisation de l'argmax vous donnerait la meilleure estimation de l'algorithme pour la classe, mais pas la probabilité pour celle-ci. L'attribution de probabilités aux résultats du Nouveau-Brunswick est une autre histoire; Par exemple, voir un article pour discuter de ce problème.

Questions connexes