-
Notifications
You must be signed in to change notification settings - Fork 1
How_to_use_FR
Pour notre premier exemple, nous allons construire un classifieur qui détecte la langue d'un document (ou d'une phrase). Ce cas est simple car les documents sont classés avec un seul symbole (Mono-classement) etle classement est défini par un seul niveau.
Le prototypage d'un classifieur a trois étapes
- la constitution du corpus d'entrainement
- l'indexation des documents
- tests et validation du classifieur
La mise en production est complétée par:
- construction et stockage des réseaux de neurones des classifieurs de la hiérarchie de classification.
- publication du classifieur avec un WebService
- élaboration des applications clientes.
Le corpus d'entrainement est défini par:
- les documents.
- le catalogue.
Cette séparation permet de manipuler les catalogues indépendamment des documents.
Le classifieur pour apprendre à prédire la langue d'une phrase doit posséder des exmples de phrases pour chaque langue.
Nous avons établi un format pour le corpus de documents (.mflf Many FiLe Format). Ce format permet de rendre compact l'ensemble des documents (en effet si chaque document se trouve dans un fichier séparé, le temps d'accès et le volume de stockage va considérablement augmenter. Il faut compter 10ms pour ouvrir un fichier sur un disque. Les corpus peuvent avoir plusieurs millions de documents.
Chaque document est séparé par une ligne qui commence et se termine avec la séquece de caratère #####. Le texte entre les deux séquences est l'identifiant du document.
Exemple de fichier documents:
####CS1#####
o podmínkách a pravidlech přijetí Bulharské republiky a Rumunska do Evropské unie.
#####DA1#####
om vilkårene og de nærmere bestemmelser for optagelse af Republikken Bulgarien og Rumænien i den Europæiske Union.
#####DE1#####
über die Bedingungen und Einzelheiten der Aufnahme der Republik Bulgarien und Rumäniens in die Europäische Union.
#####EL1#####
σχετικά με τους όρους και τις λεπτομέρειες της προσχώρησης της Δημοκρατίας της Βουλγαρίας και της Ρουμανίας στην Ευρωπαϊκή Ένωση.
...
Le catalogue détermine la classe du documents (ou les classes). Chaque ligne décrit le classement d'un document avec la forme suivante:
IDDOC CLASS1 CLASS2 ... CLASSn
Exemple de fichier catalogue:
CS1 CS
DA1 DA
DE1 DE
EL1 EL
...
Comme source du corpus d'entrainement, nous avons choisi un extrait de 1000 phrases du DGT2014 (corpora of the european committee (voir DGT2014) containing 85 million sentences from 24 languages).
La construction du corpus nécessite toujours un travail d'adaptation au format .mflf et .cat
Dans le dossier MYCLASS_MODEL\sample\langdetect
contient les catalogues et le corpus pour la suite de travail.
L'entrainement du réseaux de neurones se fait sur un corpus de document qui est indexé.
L'indexation permet d'organiser le plus efficacement la structure linguistique (le texte) en une structure numérique. Dans notre cas, nous utilisons des BOW (Bag Of Words), litéralement des sacs de mots. Chaque mot du documents est remplacés par l'identifiant du mot et le nombre d'occurence dans le document. On peut aussi effectuer des traitements supplémentaires:
-
Eliminer les mots outils (le, la, une, ...) qui non pas de pouvoir classifiant en général. Sauf dans notre cas particulier, en effet ils sont un bon marqueur pour la détection des langues.
-
En définissant la notion de "mot" lors de l'indexation. Doit-on conserver les majuscules, les chiffres, …?
-
Lemmatiser les mots: Chercher la racine du mot. (global, globlalement, globalisation, ...). Ceci permet de rassembler sous un seul terme plusieurs forme du même concept.
-
Filter par le nombre d'occurences minimun et maximun dans tous le corpus.
Pour indexer le corpus, nous utilisons le même indexeur que celui de MYCAT (le code de l'indexeur peut être ici).
En ouvrant le projet myclass
dans votre IDE. vous trouverez le code associé à notre exemple dans le package org.olanto.demo.langdetect_word
. Trois classes sont utilisées pour l'indexation:
-
ConfigurationForCat
: Paramètres d'indexation -
TokenCatNative
: Définition des mots (token) -
CreateIndexForCat
: Programme réalisant l'indexation
La structure de dossier doit exister avant l'indexation.
Par convention, les structures sont dans le dossier data
.
Chaque projet possède son dossier. Chaque dossier contient un dossier sto0
et un dossier mnn
.
La création de la structure de l'index se fait lors du premier lancement du programme. Pour vider l'index, on efface manuellement les fichiers. (ces opérations manuelles sont pour éviter des accidents qui efface un index qui a pris beaucoup de temps calcul pour être construit.
Nous avons vu plus haut que le programme CreateIndexForCat
va effectuer l'indexation.
public static void main(String[] args) {
id = new IdxStructure("NEW", new ConfigurationForCat()); // build a new structure
// first pass to count words
id.indexdirOnlyCount(SenseOS.getMYCLASS_ROOT() + "MYCLASS_MODEL/sample/langdetect");
id.flushIndexDoc(); // flush buffers
// seconde pass to build BOW
id.indexdirBuildDocBag(SenseOS.getMYCLASS_ROOT() + "MYCLASS_MODEL/sample/langdetect");
id.flushIndexDoc(); // flush buffers
id.Statistic.global(); // display statistic
id.close(); // close index
}
L'indexation se fait en deux passes:
- compter les mots pour pouvoir les filtrer
- construire les BOW pour chaque document
Le log de l'indexation est un fichier assez complet voir log de l'indexation.
Ces lignes donnent des statistiques sur le corpus.
STATISTICS global:
wordmax: 1048576, wordnow: 401448, used: 38%
documax: 262144, docunow: 21537, used: 8%
docIdx: 21537 docValid: 21537, valid: 100%
totidx: 0
Dans notre cas, 401448 mots différents pour 21537 documents.
Le programme à utiliser pour faire le training et le test est ExperimentManual
.
L'ensemble des paramètres est décrit dans Paramètres d'entrainement et de test
Nous définissons ici les catalogues. Le catalogue de test est vide car nous utilisons un test 80/20 à partir du catalogue d'entrainement. Nous chargeons les catalogues avec une classification sur deux caractères.
// define path to catalog
String fntrain = SenseOS.getMYCLASS_ROOT() + "MYCLASS_MODEL/sample/langdetect/corpus_dgt2014.cat";
String fntest = SenseOS.getMYCLASS_ROOT() + "MYCLASS_MODEL/sample/langdetect/EMPTY.cat";
// load catalog at the specified level (2 char codification in this case)
NNBottomGroup BootGroup = new NNBottomGroup(id, fntrain, fntest, 2, false, false);
Notre test est effectué sur les trois premières prédictions. Nous effectuons les tests en Mono classement (Maintest)
// TEST -- parameters for the test
3, // int Nfirst,
true, // boolean maintest,
true, // boolean maintestGroupdetail,
false, // boolean maintestDocumentdetail,
false, // boolean multitest,
false, // boolean multitestGroupdetail ,
false // boolean multitestOtherdetail
Notre test est complété par le calcul de matrice de confusion.
// display a Confusion Matrix
NNOneN.ConfusionMatrix(false);
Finalement, nous demandons la liste des mots (features) les plus déterminantes de chaque classe.
// display top features
NNOneN.explainGroup(20, true);
Le log de l'exécution du test manuel est assez complet voir log des tests.
Examinons les parties les plus intéressantes du log
On voit que 21536 documents sont identifiés dans le catalogue. Le nombre de mot minimum est de un et le maximum de 104. La moyenne est 20.
#doc:21536, avg:20, min:1, max:104
STOP [2018/05/31 12:34:07]: avgLength() - 62 ms
Ne pas considérer les mots apparaissant une fois à réduit le nombre de mots à 33573. Le système a préparé un test 80/20. la classification porte sur 22 classes (langues à détecter)
GLOBALMINOCC: 2 , MAX features:33573
start mem: 121454680
2.
lasttraindoc:21536
lasttestdoc:21536
Train 0..17228 Test ..21536
maxgroup:22
after localgroup: 124413040
Active group:22
Le système répartit l'entrainement sur les cores. Il montre la progression. Le corpus est parcouru 5 fois dans ce cas.
START [2018/05/31 12:34:07] : TrainWinnow
after init: 125684344
filter used:0, open:33573, discarded:0, filtred:0
Start loop 0 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 - 4 - 5 - 7 - 3 - 6 - 0 - 1 - 2 End loop 0
Start loop 1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 - 5 - 6 - 1 - 4 - 7 - 2 - 3 - 0 End loop 1
Start loop 2 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 - 4 - 0 - 1 - 3 - 5 - 6 - 7 - 2 End loop 2
Start loop 3 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 - 1 - 0 - 2 - 3 - 4 - 6 - 7 - 5 End loop 3
Start loop 4 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 - 1 - 2 - 0 - 5 - 3 - 7 - 4 - 6 End loop 4
# features: 33573
# maxgroup: 22
# maxtrain: 17228
# avg doc : 20
# repeatK: 5
size of NN: 738 [Kn]
estimate #eval (if no discarded feature): 37884 [Kev]
estimate power (if no discarded feature): 185 [Mev/sec]
STOP [2018/05/31 12:34:08]: TrainWinnow - 219 ms
Les documents réservé pour faire le test sont utilisés.
Mainclass1000.0,1.06,2,300.0,300.0,9979,20,9955,18,4
La ligne de résultat s'interprète comme suit:
-
Mainclass1000.0,1.06,2,300.0,300.0,
: paramètre d'entrainement -
9979,
: la somme de la précision des trois premières prédiction (99.79%) -
20,
: la somme des erreurs des trois premières prédiction (0.20%) -
9955,
: précision de la premières prédiction (99.55%) -
18,
: précision de la deuxième prédiction (0.18%) -
4
: précision de la troisième prédiction (0.04%)detail in: C:/MYCLASS_MODEL/experiment/langdetect/detailworddetect-MainDetail-Class.txt
START [2018/05/31 12:34:08] : ConfusionMatrix
1000.0,1.06,2,300.0,300.0,995,995,4,0
confusion matrix: (line=real category; colums= prediction)
>>predict,HU,ET,PL,LT,EL,LV,MT,DE,SL,BG,EN,SV,NL,SK,FR,CS,FI,PT,IT,ES,DA,RO,
HU,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
ET,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
PL,0,0,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
LT,0,0,0,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
EL,0,0,0,0,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
LV,0,0,0,0,0,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
MT,0,0,0,0,0,1,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
DE,0,0,0,0,0,0,0,190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
SL,0,0,0,0,0,0,0,0,203,0,0,0,0,1,0,0,0,0,0,0,0,0,
BG,0,0,0,0,0,0,0,1,0,216,0,0,0,0,0,0,0,0,0,0,0,0,
EN,0,0,0,0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,0,1,1,0,
SV,0,0,0,0,0,0,0,0,0,0,0,221,0,0,0,0,0,0,0,0,1,0,
NL,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,0,0,
SK,0,0,0,0,0,0,0,0,1,0,0,0,0,195,0,1,0,0,0,1,0,0,
FR,0,0,0,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0,
CS,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,199,0,0,0,0,0,0,
FI,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,205,0,0,0,0,0,
PT,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,
IT,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,195,0,0,0,
ES,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,197,0,0,
DA,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,200,0,
RO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,98,
STOP [2018/05/31 12:34:08]: ConfusionMatrix - 47 ms
Après mise en page dans un Tableur, on obtient le résultat suivant:
Les cases jaunes montrent les erreurs. Le test porte sur 20% des données qui ont été retirées du training. Les résultats sont excellents mais rappelons que les phrases testées avaient plus de 50 caractères comme tout le reste du corpus.
Cette fonctionnalité, nous donne les mots les plus valorisés lors de l'entrainement. Parmi eux, on retrouve les mots outils (stop words). D'autres mots sont aussi dans la liste, car la liste ne tient pas compte de la fréquence du mot dans le corpus.
groupe, nbdoc, kw1, kw2, kw3, ...
---- 0 HU, nbdoc:1000,az,és,bizottság,hl,tanács,nem,következo,csatlakozás,kell,ig,szóló,egészül,vagy,vonatkozó,rendelete,hoeromu,mint,támogatás,nemzeti,melléklet
---- 1 ET, nbdoc:1000,bulgaaria,või,ning,kui,lk,rumeenia,euroopa,eü,lisa,artikli,aasta,mis,nõukogu,kohta,kuni,bulgaarias,alusel,suhtes,määruse,punkti
---- 2 PL, nbdoc:1000,w,dnia,dz,sie,dla,oraz,we,panstwa,przez,bulgarii,rumunii,które,czlonkowskie,przy,jest,sa,zgodnie,rocznie,lub,przystapienia
---- 3 LT, nbdoc:1000,del,eb,iš,iki,istojimo,kaip,pagal,bulgarijos,punkte,ol,saugyklai,bulgarija,gali,i,nuo,yra,dalyje,arba,bulgarijoje,tarybos
---- 4 EL, nbdoc:1000,?a?,st?,t??,ap?,t??,??a,t??,p??,µe,t?,de?aµe??,t??,st??t??,t?,ß????a??a,??,ta,s?µe??,st?,?
---- 5 LV, nbdoc:1000,gada,uz,punkta,eiropas,pievienošanas,kas,lpp,vai,attieciba,ka,pec,panta,ov,atbilstigi,padomes,lai,lidz,dalas,bulgarija,ša
---- 6 MT, nbdoc:1000,li,apos,ankara,jew,ghandu,doganali,fuq,ghandha,ghandhom,dawn,u,minn,ghal,ta,ikunu,inkluzi,fl-appendici,ma,kif,dak
---- 7 DE, nbdoc:1000,und,aschebecken,vom,für,von,verordnung,werden,nach,wird,aus,über,mit,nummer,oder,absatz,abl,zur,nicht,dem,sind
---- 8 SL, nbdoc:1000,iz,pristopa,bolgarija,ul,ali,glede,lahko,št,bolgariji,prilogi,odstavka,sveta,tem,pogodbe,kot,skladu,sklep,države,podlagi,odbora
---- 9 BG, nbdoc:1000,??,?,?,?,???,??,??,??,?????,?????????,????,???,son,????????,altesse,royale,grand-duc,??,????????????,???????????
---- 10 EN, nbdoc:1000,shall,and,decision,following,oj,or,accession,regulation,european,council,committee,treaty,republic,member,may,with,amended,by,areas,executive
---- 11 SV, nbdoc:1000,och,av,skall,för,från,till,att,inte,enligt,får,förordning,vid,följande,är,genom,senast,anslutningen,tillämpas,republiken,som
---- 12 NL, nbdoc:1000,van,het,met,voor,door,bulgarije,zijn,aan,wordt,worden,asvijver,dat,tot,lid,volgende,bijlage,op,een,roemenië,bij
---- 13 SK, nbdoc:1000,ú,alebo,pre,ktoré,ako,rozhodnutie,pristúpenia,týchto,sú,môže,komisia,popol,súlade,sa,vo,ods,nariadenia,opatrenia,štátov,odseku
---- 14 FR, nbdoc:1000,dans,bulgarie,est,les,adhésion,une,du,république,paragraphe,règlement,aux,qui,sur,pour,cette,état,au,roumanie,sont,peut
---- 15 CS, nbdoc:999,nebo,pristoupení,pro,spolecenství,narízení,ve,techto,opatrení,být,cl,pokud,oblast,príloze,odst,smernice,státy,komise,souladu,prosince,které
---- 16 FI, nbdoc:1000,ey,kuin,päivänä,sekä,euroopan,jotka,mukaisesti,tuhka-allas,kohdassa,artiklan,neuvoston,liitteessä,sovelletaan,osalta,komissio,eyvl,bulgariassa,vuoden,annettu,että
---- 17 PT, nbdoc:1000,em,ao,conselho,roménia,artigo,com,não,regulamento,uma,adesão,membros,os,aos,bacia,cinzas,decisão,nas,comissão,é,até
---- 18 IT, nbdoc:1000,di,della,dell,dal,che,il,è,consiglio,regolamento,adesione,nel,stati,sono,dei,dicembre,allegato,commissione,gu,pag,stagno
---- 19 ES, nbdoc:1000,las,consejo,los,comisión,el,decisión,y,adhesión,ejecutivo,miembros,podrá,unión,artículo,declaración,hasta,con,diciembre,rumanía,miembro,común
---- 20 DA, nbdoc:1000,og,til,af,stk,skal,fra,ikke,ef,disse,inden,afsnit,følgende,omhandlet,bilag,forordning,rumænien,før,nye,tiltrædelsesdatoen,fastsættes
---- 21 RO, nbdoc:537,?i,în,acord,cu,sa,care,pe,prin,sau,prezentul,pentru,catre,poate,nu,sunt,acest,consiliul,fiecare,acordul,este
(total time: 17 seconds)
Dans les paramètres, nous avons indiqué que nous voulions les détails du test. Le paramètrage indique que les documents doivent être placé dans le dossier MYCLASS_MODEL\experiment\langdetect
Nous trouvons le fichier du détail par classe avec le nombre de test effectué et la performance pour les trois premières prédictions
group,tottest,in1,in2,in3,...
HU,204,0.99509805,0.0,0.0
ET,205,0.99512196,0.0,0.0
PL,202,1.0,0.0,0.0
LT,194,1.0,0.0,0.0
MT,187,0.9946524,0.0,0.0053475937
...
Nous trouvons le fichier du détail par document avec
- l'identifiant du document
- la classe attendue
- pour les trois premières prédictions: la classe prédite et le score de la prédiction
- la taille du BOW (sac de mots)
Il est intéressant d'examiner ce fichier si l'on veut comprendre les causes d'une mauvaise prédiction dans notre cas le document EN959 avait une prédiction pour le DA (danois) avec un score bas (en dessous de 1000). En regardant dans le fichier d'entrainement, la phrase à classifier est composée de noms propres.
#####EN959#####
TPP at ‘Zaharni zavodi’ ashpond, Veliko Tarnovo, Gorna Oryahovitsa;.
Nous avons vu:
- comment formatter le corpus et le catalogue
- comment indexer un corpus
- comment faire le training et le test
Dans l'exemple suivant, nous allons examiner un corpus donc le classement est hiérarchique et multi-classe Classification des brevets.