2011-05-30 3 views
4

Je voudrais écrire un programme de filtre de spam avec SVM et j'ai choisi libsvm comme outil.
J'ai obtenu 1000 bons mails et 1000 mails de spam, alors je les classer dans:
700 mails good_train 700 mails spam_train
300 good_test mails 300 spam_test mails
J'écrit un programme pour compter le temps de chaque mots se produisent dans chaque fichier, résultat obtenu comme:Comment utiliser libsvm pour la classification de texte?

good_train_1.txt: 
today 3 
hello 7 
help 5 
...  

J'ai appris qui a besoin libsvm format comme:

1 1: 3 2: 1 3: 0
2 1: 3 2: 3 à 3: 1
1 1: 7 3: 9

comme entrée. Je sais que 1, 2, 1 est l'étiquette, mais que signifie 1: 3?
Comment pourrais-je transférer ce que j'ai dans ce format?

Répondre

4

probablement, le format est

classLabel attribute1:count1 ... attributeN:countN 

N est le nombre total de mots différents dans votre corpus de textes. Vous devrez vérifier la documentation de l'outil que vous utilisez (ou ses sources), pour voir si vous pouvez utiliser un format clairsemés en ne comprenant les attributs ayant le nombre 0.

1
How could I transfer what I've got to this format? 

Voici comment je ferais ce . J'utiliserais le script que vous avez pour calculer le nombre de mots pour chaque courrier dans l'ensemble d'entraînement. Ensuite, utilisez un autre script et transférez ces données dans le format LIBSVM que vous avez montré précédemment. (Cela peut être fait de plusieurs façons, mais il devrait être raisonnable d'écrire avec un langage d'entrée/sortie facile comme Python) Je traiterais toutes les données "good-mail" en un seul fichier, et étiquetterais cette classe comme "1" . Ensuite, je ferais le même processus avec les données "spam-mail" et l'étiquette de cette classe "-1". Comme l'a dit nologin, LIBSVM exige que l'étiquette de classe précède les caractéristiques, mais les caractéristiques elles-mêmes peuvent être n'importe quel nombre tant qu'elles sont dans l'ordre croissant, par ex. 2: 5 3: 6 5: 9 est autorisé, mais pas 3:23 1: 3 7: 343.

Si vous craignez que vos données ne sont pas dans le bon format, utilisez leur script

checkdata.py 

avant la formation et il doit signaler les erreurs éventuelles.

Une fois que vous avez deux fichiers avec des données dans le bon format, vous pouvez appeler

cat file_good file_spam > file_training 

et générer un fichier de formation qui contient des données sur les deux courrier bon et le spam. Ensuite, faites le même processus avec l'ensemble de test. Un avantage psychologique de former les données de cette façon est que vous savez que les 700 premiers (ou 300) courriers dans l'ensemble de formation (ou de test) sont bons, et les autres sont des spams. Cela facilite la création d'autres scripts sur lesquels vous souhaitez agir, tels qu'un code de précision/de rappel.

Si vous avez d'autres questions, la FAQ au http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html devrait être en mesure de répondre à quelques-uns, ainsi que les différents fichiers README qui viennent avec l'installation.(J'ai personnellement trouvé que les fichiers README dans les répertoires "Outils" et "Python" étaient très utiles.) Malheureusement, la FAQ ne touche pas beaucoup à ce que Nologin a dit, à propos des données dans un format clairsemé. Sur une note finale, je doute que vous deviez garder des comptes de tous les mots possibles qui pourraient apparaître dans le courrier. Je vous recommande de ne compter que les mots les plus courants que vous soupçonnez d'apparaître dans les spams. Les autres caractéristiques potentielles comprennent le nombre total de mots, la longueur moyenne des mots, la durée moyenne de la peine et d'autres données possibles que vous jugez utiles.

Questions connexes