root / classifier / doc / classifier.txt

Revision 162:ca1529c62df9, 5.2 kB (checked in by Tarek Ziad?? <tarek@…>, 9 months ago)

fixes

Line 
1==========
2Classifier
3==========
4
5Le module classifier fournit un outil de classification par
6`inférence bayésienne`_. La probabilité est calculée par
7la méthode `Robinson-Fisher`_, décrite par Gary Fisher et basée
8sur le caclul de Fisher, utilisé initialement dans `PopF`.
9
10Let's work in a special database::
11
12    >>> db_file = 'test.db'
13    >>> import settings
14    >>> settings.SQLURI = 'sqlite:///%s' % db_file
15
16Cette implémentation est construite avec une chaîne de tokenizers et
17un objet de storage::
18
19  >>> from tokenizer.filters import AllFilters
20  >>> from storage import SQLStorage
21  >>> from classifier import BayesClassifier
22  >>> backend = SQLStorage('tarek')
23  >>> tokenizer = AllFilters()
24  >>> classifier = BayesClassifier('fr', backend, tokenizer)
25
26Le backend doit être vide au début::
27
28  >>> backend.word_count()
29  0
30
31Le classificateur fait deux choses: apprendre et deviner, pour une langue
32donnée.
33
34Apprentissage::
35
36  >>> classifier.learn('Achetez du savon KIMOUSS', 'spam')
37  >>> classifier.learn('Salut, savon, comment tu vas ?', 'friend')
38  >>> classifier.learn('KIMOUSS', 'spam')
39
40Le storage doit être rempli::
41
42  >>> backend.word_count()
43  6
44
45Et les catégories créées automatiquement::
46
47  >>> cats = list(backend.list_categories())
48  >>> cats.sort()
49  >>> cats
50  [u'friend', u'spam']
51
52Pour gérer la phase de reconnaissance, le classifier doit donner quelques
53informations::
54
55  >>> classifier.corpusSize()
56  6
57  >>> classifier.categorySize('spam')
58  3
59
60Le classifier calcul la propabilité pour chaque mot d'une catégorie, de faire
61partie du calcul (pour les mots qui sont dans n catégories::
62
63  >>> sorted(classifier._buildCategoryWordProbabilities('spam').items()) #1
64  [(u'achetez', 0.99...), (u'kimouss', 0.99...)]
65
66  >>> classifier.learn('savon kipouss par-ci, savon par-la, savon toujours',
67  ...                  'song')
68  >>> sorted(classifier._buildCategoryWordProbabilities('spam').items()) #2
69  [(u'achetez', 0.99...), (u'kimouss', 0.99...), (u'savon', 0.14...)]
70
71  >>> classifier.categorySize('song')
72  4
73
74  >>> sorted(classifier._buildCategoryWordProbabilities('song').items())
75   [(u'kipouss', 0.99...), (u'par', 0.99...), (u'toujours', 0.99...)]
76
77Ce calcul est fait pour toutes les catégories::
78
79  >>> sorted(classifier._buildWordProbabilities().items())
80  [(u'friend', {...}), (u'song', {...}), (u'spam', {...})]
81
82
83La reconnaissance se base sur ce filtrage de mots, puis applique l'algo de
84Robinson-fisher::
85
86  >>> classifier.guess('achetez mon savon KIPOUSS')
87  [(u'song', 0.99...), (u'spam', 0.70...), (u'friend', 0.16...)]
88
89We lower default treshold first::
90
91  >>> classifier.options['treshold'] = 1
92
93Reprenons un exemple concret pour vérifier que le classificateur marche bien,
94soit l'exemple de divmod pour Reverend::
95
96  >>> classifier = BayesClassifier('fr', backend, tokenizer, treshold=1)
97  >>> classifier.learn('le la les du un une je il elle de en', 'french')
98  >>> classifier.learn('der die das ein eine', 'german')
99  >>> classifier.learn('el uno una las de la en', 'spanish')
100  >>> classifier.learn('the rain in spain falls mainly on the plain', 'english')
101  >>> classifier.learn('the it she he they them are were to', 'english')
102
103Résultats::
104
105  >>> classifier.guess('they went to el cantina')
106  [(u'english', 0.999...), (u'spanish', 0.999...)]
107  >>> classifier.guess('they were flying planes')
108  [(u'english', 0.999...)]
109
110Plus d'exemples, pour le plaisir :), un outil de reconnaissance
111de texte, qui sait faire la différence entre un fichier texte de type doctest et
112un fichier de code python::
113
114  >>> import classifier
115  >>> import os
116  >>> root = os.path.dirname(classifier.__file__)
117  >>> root = os.path.split(os.path.realpath(root))[0]
118  >>> file = os.path.join(root, 'classifier', 'classifier.py')
119  >>> source = open(file).read()
120  >>> file = os.path.join(root, 'classifier', 'storage.py')
121  >>> source2 = open(file).read()
122  >>> file = os.path.join(root, 'classifier', 'doc', 'storage.txt')
123  >>> texte = open(file).read()
124  >>> backend = SQLStorage('tarek')
125  >>> classifier = BayesClassifier('en', backend, tokenizer, treshold=2)
126  >>> classifier.learn(source, 'python')
127  >>> classifier.learn(texte, 'doctest')
128  >>> classifier.learn(source2, 'python')
129
130Saura-t-il reconnaitre `classifier.py` comme étant du code python ?
131::
132
133  >>> file = os.path.join(root, 'classifier', 'classifier.py')
134  >>> source2 = open(file).read()
135  >>> classifier.guess(source2)
136  [(u'python', ...), ...]
137
138Le classificateur doit aussi savoir `désapprendre`::
139
140  >>> classifier.unlearn(source, 'python')
141  >>> classifier.unlearn(source2, 'python')
142  >>> classifier.guess(source2)
143  [(u'doctest', ...), ...]
144
145
146Définitions
147___________
148
149_`inférence bayésienne`: On nomme inférence bayésienne la démarche logique
150permettant de calculer ou réviser la probabilité d'une hypothèse. Cette
151démarche est régie par l'utilisation de règles strictes de combinaison des
152probabilités, desquelles dérive le théorème de Bayes. Dans la perspective
153bayésienne, une probabilité n'est pas interprétée comme le passage à la
154limite d'une fréquence, mais plutôt comme la traduction numérique d'un état
155de connaissance (le degré de confiance accordé à une hypothèse, par exemple;
156(Wikipédia)
157
158Let's remove the test db::
159
160    >>> import os
161    >>> os.remove(db_file)
162
163
164.. _`PopF`: http://christophe.delord.free.fr/fr/popf/index.html
Note: See TracBrowser for help on using the browser.