Skip to content
Olanto Foundation edited this page Jun 4, 2018 · 36 revisions

Un premier exemple: détection des langues

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

Le corpus d'entrainement est défini par:

  • les documents.
  • le catalogue.

Cette séparation permet de manipuler les catalogues indépendamment des documents.

Les 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.

Format mflf

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#####
 σχετικά με τους όρους και τις λεπτομέρειες της προσχώρησης της Δημοκρατίας της Βουλγαρίας και της Ρουμανίας στην Ευρωπαϊκή Ένωση.
 ...

Format cat

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
 ...

Choix du corpus d'entrainement et préparation

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'indexation des documents

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:

Structure des dossier d'index

La structure de dossier doit exister avant l'indexation.

Ready to experiment

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.

Indexons notre corpus

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.

Premier entrainement et test

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

statistique sur les BOW (sac de mots)

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

filtrage des mots et repartition des documents pour les tests

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

start training

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

Test Mono Classe

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

build confusion matrix

 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:

Ready to experiment

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.

build top features

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)

Détails du test

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)

détail document

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;.

résumé

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.

Annexe