Skip to content
Olanto Foundation edited this page Jul 6, 2018 · 18 revisions

Développer un WebService de Classification

Dans Construire un HNN, nous avons vu comment faire le training et comment utiliser une application avec une classification hiérachique.

Nous allons examiner comment faire un Web Service REST utilisant un classifieur. Nous allons reprendre le service de détection des langues.

Utiliser les n-grammes

Dans notre premier exemple, nous avions fait la détection sur la base des mots dans les langues. On comprend bien que ce type de détection dépend du texte des documents et du choix des exemples. La constitution d'un corpus couvrant les différents domaines et styles d'expressions peut être difficile. Pour éviter cela et rendre plus universel le training, nous allons recourir au n-gram.

Dans notre cas, nous allons prendre des séquences de 5 caractères. Nous allons réécrire le corpus d'entrainement pour lui substituer. Une fenêtre de 5 caractères est déplacée sur le texte original. Les espaces sont remplacés par le caractère souligné. (Ce travail aurait pu être fait dans le tokeniser)

On voit ci-dessous la conversion du premier document.

 #####EN1#####
 Concerning the conditions and arrangements for admission of the republic of Bulgaria and Romania to the European Union.

 #####EN1#####
 _conc conce oncer ncern cerni ernin rning ning_ ing_t ng_th g_the _the_ the_c he_co e_con _cond condi ondit nditi
 ditio ition tions ions_ ons_a ns_an s_and _and_ and_a nd_ar d_arr _arra arran rrang range angem ngeme gemen ement
 ments ents_ nts_f ts_fo s_for _for_ for_a or_ad r_adm _admi admis dmiss missi issio ssion sion_ ion_o on_of n_of_
 _of_t of_th f_the _the_ the_r he_re e_rep _repu repub epubl publi ublic blic_ lic_o ic_of c_of_ _of_b of_bu f_bul
 _bulg bulga ulgar lgari garia aria_ ria_a ia_an a_and _and_ and_r nd_ro d_rom _roma roman omani mania ania_ nia_t
 ia_to a_to_ _to_t to_th o_the _the_ the_e he_eu e_eur _euro europ urope ropea opean pean_ ean_u an_un n_uni _unio
 union

Nous allons retester la précision du classifieur utilisant les n-grams L'ensemble des programmes que nous utilisons sont dans le package org.olanto.demo.langdetection du projet myclass.

L'indexation des documents

En ouvrant le projet myclass dans votre IDE. vous trouverez le code associé à notre exemple dans le package org.olanto.demo.langdetection. Trois classes sont utilisées pour l'indexation:

Dans le paramétrage, nous indiquons un fichier qui contient les mots outils

   WORD_MAXBIT = 21; // to have more terms
   IDX_DONTINDEXTHIS = SenseOS.getMYCLASS_ROOT()+ "MYCLASS_MODEL/config/dontindexthiswords_EMPTY.txt";

Le tokeniser est modifié indexer le caractère souligné _ .

La structure de dossier doit exister avant l'indexation.

Par convention, les structures sont dans le dossier data. Le projet myfirst contient un dossier sto0 et un dossier mnn.

Indexons notre corpus

Nous avons vu plus haut que le programme CreateIndexForCat va effectuer l'indexation.

Dans le log, on trouve les statistiques suivantes:

 STATISTICS global:
 wordmax: 2097152, wordnow: 993631, used: 47%
 documax: 262144, docunow: 21539, used: 8%
 docIdx: 21539 docValid: 21539, valid: 100%

Dans notre cas, 993631 mots différents pour 21539 documents. (Rappelons que la version avec les mots avaient 401448 mots différents)

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 reprenons le même catalogue et les mêmes paramètres que dans l'expérience avec les mots

Voici quelques résultats

Mainclass1000.0,1.06,2,300.0,300.0,10000,0,10000,0,0 detail in: C:/MYCLASS_MODEL/experiment/langdetectngram/detailngram5-MainDetail-Class.txt

Rappelons que la ligne de résultat s'interprète comme suit:

  • Mainclass1000.0,1.06,2,300.0,300.0,: paramètre d'entrainement
  • 10000,: la somme de la précision des trois premières prédiction (100%)
  • 0,: la somme des erreurs des trois premières prédiction (0%)
  • 10000,: précision de la premières prédiction (100%)
  • 0,: précision de la deuxième prédiction (0%.)
  • 0: précision de la troisième prédiction (0%)

Le résultat indique un sans faute. Donc la matrice de confusion n'est pas utile.

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. On peut constater que les termes qui apparaissent sont moins dominés par la composition du corpus mais reflète plus la langue.

 ---- 0 HU, nbdoc:1000,_és_a,_az_e,_szer,_rend,_nem_,ében_,követ,_köve,a_és_,határ,gálla,kell_,_közö,_a_kö,_hatá,atkoz,állam,amely,k_és_,almaz,ában_,_cikk,eket_,atáro,tároz,lepít,_hamu,ülepí,epítő,tagál,agáll,etkez,_amel,_az_a,rszág,mint_,k_az_,ber_i,ának_,_romá,román,tkező,_a_cs,kozás,orszá,tott_,gatás,ének_,és_a_,_vona
 ---- 1 ET, nbdoc:1000,atud_,gaari,akse_,aaria,tatud,takse,ulgaa,lgaar,_järg,riigi,eenia,_ning,liikm,iikme,_koha,_pašr,e_ja_,_või_,aasta,rumee,umeen,meeni,sioon,kogu_,e_koh,ataks,tsioo,damis,_aast,_rume,tikli,mille,järgm,ärgmi,nõuko,õukog,ukogu,_kui_,se_ko,kmesr,mesri,esrii,rgmis,iooni,usel_,halda,otsus,_nõuk,hoidl,oidla
 ---- 2 PL, nbdoc:1000,_prze,_przy,_oraz,oraz_,_któr,nego_,_bułg,bułga,ułgar,dnia_,_dla_,_dnia,łgari,_się_,astęp,_lub_,mieni,nych_,ości_,jące_,ienia,stępu,rzyst,owego,_wspó,_środ,_ustę,ustęp,munii,_czło,człon,złonk,_pańs,państ,aństw,spraw,tępuj,tanow,anowi,wspól,spóln,_okre,kich_,ego_w,odnie,awie_,unii_,nia_r,ępują,ych_w
 ---- 3 LT, nbdoc:1000,ijos_,_dėl_,io_d_,alsty,lstyb,pagal,joje_,taiko,_susi,ijoje,taryb,ybos_,_kiek,inių_,ų_ir_,jimo_,aikom,tojim,ojimo,_taik,_tary,_kaip,stybė,_prie,_bend,bendr,kaip_,_gali,_iki_,stoji,_arba,_ir_r,strai,traip,_dali,rijos,aipsn,ir_ru,_narė,inės_,_yra_,_pasi,raips,tinka,_nuo_,agal_,arija,s_tai,_įsto,įstoj
 ---- 4 EL, nbdoc:1000,_και_,_της_,_από_,_την_,_των_,_στο_,από_τ,_για_,_περι,_του_,_που_,νται_,για_τ,πό_το,ς_της,_προσ,_βουλ,βουλγ,ουλγα,υλγαρ,πό_τη,ό_την,τους_,_στη_,στο_σ,_με_τ,λγαρί,γαρία,εται_,σεις_,ς_περ,και_τ,ια_τη,_κράτ,τικά_,την_ε,_σημε,νή_στ,_δεξα,δεξαμ,εξαμε,ξαμεν,αμενή,μενή_,ενή_σ,ή_στά,_στάχ,στάχτ,τάχτη,άχτης
 ---- 5 LV, nbdoc:1000,_gada,ijas_,gārij,ības_,bulgā,ulgār,gada_,_kas_,_vai_,lgāri,šanas,ttiec,anas_,attie,ārija,s_un_,u_un_,jiem_,_pado,padom,unktā,notei,oteik,līgum,iecīb,nktā_,_note,_pant,ā_ar_,_rumā,_līdz,umus_,tiecī,ievie,ācija,ciju_,_piev,pievi,_piem,rumān,umāni,mānij,vieno,piemē,iemēr,bilst,starp,dalīb,alībv,lībva
 ---- 6 MT, nbdoc:1000,_tal-,zzjon,_għan,għand,zjoni,_jew_,_apos,apos_,azzjo,jiet_,a_apo,_li_j,_il-k,_għal,_ta_a,ta_ap,l-ist,mill-,kara_,_anka,ankar,nkara,komun,i_għa,ijiet,_minn,ħandh,joni_,_it-t,_jkun,_il-p,l-pro,n_il-,a_għa,a_li_,ni_ta,ista,i_li_,li_ji,kunu_,l-kom,_tkun,pos_l,andu_,plika,_l-is,l-art,rtiko,tikol,ħandu
 ---- 7 DE, nbdoc:1000,_und_,_von_,chen_,ungen,_über,_die_,_folg,_für_,ung_d,_nach,_vom_,_eine,enden,_dies,g_des,n_und,_werd,werde,nach_,folge,_auf_,n_ein,scheb,chebe,hmen_,diese,der_r,ische,_mitg,mitgl,itgli,tglie,glied,r_ver,_aus_,_oder,oder_,satz_,erden,und_d,lich_,ecken,über_,_des_,lieds,ng_de,ahmen,_absa,absat,bsatz
 ---- 8 SL, nbdoc:1000,bolga,olgar,z_dne,_ali_,risto,nega_,_drža,držav,porab,_član,_upor,upora,_bolg,anje_,_pogo,_romu,romun,_svet,določ,a_in_,_dolo,_pril,člani,lanic,skupn,stavk,lednj,_skle,prilo,_skup,itev_,_kot_,_ki_j,tavka,odlag,kater,_ured,_ki_s,topa_,avka_,ostop,skih_,uredb,anju_,_in_s,sklep,_in_o,_v_sk,člena,pomoč
 ---- 9 BG, nbdoc:1000,_или_,е_на_,ните_,а_на_,_пред,и_от_,ите_с,_коит,които,оито_,_на_т,_друг,ение_,и_за_,та_на,_при_,а_пре,то_на,о_на_,стта_,_на_с,_общн,общно,бщнос,щност,ностт,остта,и_на_,_като,като_,ането,нето_,_на_п,_прод,ките_,не_на,ията_,ване_,произ,_прил,ения_,а_от_,рани_,_годи,ителн,а_се_,ето_н,а_да_,_след,стран
 ---- 10 EN, nbdoc:1000,n_the,_and_,_of_t,the_c,_shal,shall,hall_,of_th,e_of_,f_the,_with,the_f,in_pä,on_of,to_th,_may_,ed_in,_to_t,s_of_,d_to_,_from,ion_o,o_the,from_,r_the,he_co,ed_to,the_a,with_,_not_,membe,blish,_of_a,the_p,c_of_,the_e,ber_s,_coun,ed_by,latio,t_of_,r_sta,_by_t,the_d,the_m,owing,_meas,measu,easur,asure
 ---- 11 SV, nbdoc:1000,_och_,_för_,skall,kall_,_av_d,_från,från_,av_de,till_,_får_,_till,enlig,n_och,erna_,_att_,_enli,anslu,iska_,ingar,ande_,_före,g_av_,v_den,tillä,r_av_,s_för,ighet,_över,n_av_,_vid_,en_oc,_ansl,nslut,_i_fö,n_för,inte_,_följ,illäm,llämp,r_för,_föro,föror,jande,emens,ng_av,örord,följa,öljan,ljand,tione
 ---- 12 NL, nbdoc:1000,_van_,_het_,_voor,van_d,_word,_aan_,_met_,voor_,n_het,elijk,elen_,arije,_een_,n_en_,oor_d,rije_,n_toe,n_de_,n_van,lijk_,_door,_zijn,enië_,lidst,idsta,wordt,ordt_,zijn_,g_van,_tot_,_dat_,_lids,an_de,orden,door_,_niet,_roem,roeme,ereen,volge,_onde,maatr,aatre,atreg,trege,ng_va,veree,n_wor,van_b,_uit_
 ---- 13 SK, nbdoc:1000,_ktor,_štát,_pre_,_ako_,ovani,odsek,_aleb,alebo,lebo_,riade,iaden,dnuti,spolo,poloč,ristú,istúp,bdobi,stúpe,túpen,_ú_v_,ú_v_e,lade_,uróps,rópsk,_sa_v,opatr,patre,atren,_odse,skej_,vania,dseku,_prij,_príl,prílo,ríloh,nutie,utie_,vanie,enej_,_príp,adeni,_zmlu,zmluv,smern,ktorý,_môže,môže_,_prís,ýchto
 ---- 14 FR, nbdoc:1000,_les_,ion_d,_et_d,dans_,_est_,_une_,_au_p,arie_,e_et_,_dans,_aux_,ique_,_à_l_,_et_l,ans_l,n_et_,de_l_,ant_l,_pour,_qui_,par_l,e_du_,s_et_,_à_la,pour_,_état,à_la_,_sur_,on_de,la_ré,_l_ar,_d_un,raphe,_adhé,adhés,dhési,hésio,ésion,_visé,_cett,cette,rouma,_sont,sont_,_du_c,onsei,nseil,ions_,_roum,_des_
 ---- 15 CS, nbdoc:999,_pro_,_stát,ních_,_kter,nebo_,vání_,e_dne,ního_,_nebo,ízení,ování,stavc,ství_,ující,_ze_d,ze_dn,jící_,omise,řízen,ající,_přij,zení_,_před,okud_,_část,aříze,těcht,ěchto,spole,poleč,_poku,pokud,tření,ření_,odle_,_přis,opatř,patře,atřen,_smlo,smlou,mlouv,stoup,přist,řisto,istou,_příl,přílo,tavci,_může
 ---- 16 FI, nbdoc:1000,n_ja_,taan_,päivä,assa_,iden_,_seur,seura,liitt,euraa,isen_,uraav,isest,istä_,an_ja,tään_,ksen_,rian_,n_lii,_päiv,perus,essä_,arian,_tai_,_peru,määrä,kuuta,erust,jäsen,tettu,voima,_yhte,neuvo,sesti,_muka,uuta_,_jäse,valti,altio,sovel,vien_,ettu_,allas,_tuhk,tuhka,uhka-,tymis,sopim,opimu,llas_,yhtei
 ---- 17 PT, nbdoc:1000,ação_,_com_,ção_d,_não_,ções_,_uma_,ão_de,s_em_,s_da_,ência,_da_a,_romé,romén,oméni,ménia,o_do_,adesã,desão,e_os_,ição_,dade_,énia_,o_da_,a_da_,o_em_,esão_,ho_de,_aos_,ionai,rtigo,os_e_,_pelo,o_n_o,e_um_,ssão_,idade,_deve,ações,ulame,issão,o_que,artig,belec,ões_d,onsel,nselh,selho,elho_,_ao_p,missã
 ---- 18 IT, nbdoc:1000,_dell,a_di_,o_di_,e_di_,i_di_,ioni_,_nell,sono_,zione,_che_,zioni,azion,ione_,_dall,_nel_,_dei_,iglio,_sono,_di_c,lla_c,_di_a,izion,_per_,segue,o_il_,_di_s,dalla,_dal_,gli_a,eguen,onsig,nsigl,sigli,_e_la,_gli_,guent,adesi,desio,glio_,a_e_l,icolo,tato_,_di_p,dell_,ato_i,_non_,per_i,o_nel,_cui_,_di_t
 ---- 19 ES, nbdoc:1000,_los_,_las_,n_el_,ción_,o_en_,a_el_,_el_p,ación,iones,iembr,sión_,ión_d,ón_de,_a_la,_con_,ia_y_,_el_c,onsej,nsejo,e_los,_en_e,cione,ablec,sejo_,_ruma,ruman,r_el_,en_el,de_lo,mient,_y_de,e_el_,ales_,n_la_,iento,umaní,manía,_miem,miemb,_el_d,_del_,idad_,_el_t,esión,podrá,ones_,_artí,artíc,rtícu,tícul
 ---- 20 DA, nbdoc:1000,_til_,n_og_,_fra_,iske_,delse,g_af_,en_og,e_af_,erne_,skal_,_rumæ,rumæn,umæni,mænie,ænien,_af_d,inger,r_og_,_anve,anven,nvend,_ikke,_af_s,_og_d,_ved_,_og_a,_stk_,r_der,r_er_,er_og,holde,følge,_af_e,_følg,n_af_,ølgen,l_af_,_og_r,elses,lder_,lige_,r_af_,af_de,ng_af,hold_,else_,for_d,emmel,sætte,andle
 ---- 21 RO, nbdoc:537,ilor_,edži_,e_în_,care_,_care,_în_c,_aces,acest,iile_,area_,ului_,_și_a,entul,ă_și_,i_și_,_sau_,ționa,ntul_,elor_,ntru_,pentr,ează_,ități,erea_,_pent,_părț,părți,itate,rezen,privi,entru,tului,i_în_,rilor,țiile,te_în,i_de_,ezent,siliu,_sunt,sunt_,izați,_și_c,ă_în_,onsil,nsili,nizaț,_acor,acord,oate_

mise en production

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.

Calculer le HNN

Le programme à utiliser pour faire le training et le test est BuildMNN.

L'ensemble des paramètres est décrit dans Paramètres pour construire la hiérarchie des classifieurs. Dans notre cas, le nombre total de réseaux est 1 et le nombre de catégories est 22

Par convention, les structures sont dans le dossier data. Le projet myfirst contient un dossier mnn qui contiendra le résultat des calculs.

Exécutons le programme.

Le log enregistre la construction de tous les NN. La fin du log doit ressembler à ceci

 recording NN: 2. @0
 START [2018/06/26 14:28:03] : compress MNN file
 ...................................
 STOP [2018/06/26 14:28:06]: compress MNN file - 3037 ms
 end of NNmany save
 #NN:1#NN-cat:22
 STOP [2018/06/26 14:28:07]: global time -------------------------------- - 5798 ms
 BUILD SUCCESSFUL (total time: 28 seconds)
 On y voit l'enregistrement du dernier NN (`7.C09G @706`), la compression des NN. 
 Un résumé des ressources utilisées `#NN:707#NN-cat:8977` soit 707 NN et un total de 8977 classes.

les fichiers du HNN

le dossier mnn contient les fichiers suivants

  • langdetectngram.mnn (6M) : le fichier donnant toutes informations sur tous les NN de la hiérarachie.
  • langdetectngram.cmnn (2M) : le fichier compressé de tous les NN.
  • langdetectngram.rmnn (3M) : le fichier intermédiaire de travail pour contruire tous les NN.

Le fichier .rmnn est assez volumineux. Sa taille est le produit du nombre de features par le total des classes du HNN. Mais après la compression, il peut être supprimé.

application utilisant le HNN

Pour cela nous utilisons une classe (classify) qui permet d'utiliser le classifieur. L'initialisation demande d'accéder à l'index pour identifier les termes avec les mêmes numéros et d'ouvrir le HNN. Le fichier produit .mnn est utilisé. On doit impérativement indiquer le même nombre de classe maximum. Le processus de classification se décompose en:

  • Initialier le HNN.
  • Parser le document à classifier (construire le BOW du document)
  • Classifier le document.

La méthode que nous allons utiliser est advise(text).

public static String advise(String p) {
    init();
    ClassifierRequest rq = parse(Sentence2Ngram(p, 5) + ".", "3");
    return guess(rq, "", "2");
}

Le programme de test FilteringAll est le suivant:

Il permet de lire un fichier et pour chaque ligne de proposer 3 prédictions de langues (avec un score)

public class FilteringAll {

public static void main(String[] args) {
    msg("init clssifier ...");
    Classify.init();
    classifyAFile(SenseOS.getMYCLASS_ROOT() + "MYCLASS_MODEL/sample/langdetectngram/TestFR1000.txt",
            SenseOS.getMYCLASS_ROOT() + "MYCLASS_MODEL/sample/langdetectngram/TestFR1000results.txt", "UTF-8"
    );
    msg("end ...");
}

private static void classifyAFile(String f, String fo, String IDX_MFL_ENCODING) {
    try {
        InputStreamReader isr = new InputStreamReader(new FileInputStream(f), IDX_MFL_ENCODING);
        BufferedReader fin = new BufferedReader(isr, 1000000);
        OutputStreamWriter result = new OutputStreamWriter(new FileOutputStream(fo), IDX_MFL_ENCODING);
        msg(f + ":open in: " + IDX_MFL_ENCODING);
        String w = fin.readLine();

        while (w != null) {
            result.write("\n-----------------------------\n" + w + "\n" + Classify.advise(w) + "\n");
            w = fin.readLine();
        }  // while
        fin.close();
        result.close();
    } catch (IOException e) {
        error("IO error", e);
    }
}
}

En exécutant le programme on obtient les résultats suivant:

 -----------------------------
 relativo a las condiciones y al procedimiento de admisión de la República de Bulgaria y de Rumanía a la Unión Europea.
 ok Classifier.guess
   choice:1, ES, 2110.32177734375
   choice:2, RO, 821.8032836914062
   choice:3, DA, 771.8440551757812
 -----------------------------
 Bulgarian tasavallan ja Romanian Euroopan unioniin liittymistä koskevista ehdoista ja menettelyistä.
 ok Classifier.guess
   choice:1, FI, 2060.143310546875
   choice:2, RO, 709.693603515625
   choice:3, DA, 666.5216064453125
 -----------------------------
 bon.
 ok Classifier.guess
   choice:1, HU, 1000.0
   choice:2, ET, 1000.0
   choice:3, PL, 1000.0
 -----------------------------
 hello.
 ok Classifier.guess
   choice:1, DA, 943.3963012695312
   choice:2, FI, 839.6194458007812
   choice:3, SV, 792.0938720703125
 -----------------------------
 bonne année.
 ok Classifier.guess
   choice:1, FR, 1061.0445556640625
   choice:2, RO, 946.1441040039062
   choice:3, IT, 924.0783081054688
 -----------------------------
 bonnes vacances.
 ok Classifier.guess
   choice:1, RO, 941.1463012695312
   choice:2, FR, 925.3250122070312
   choice:3, DA, 870.7539672851562

On peut constater que le résultat est largement dépendant de la longueur des phrases.

Vérifier l'impact de la longueur de la phrase sur la précision

Pour cela, nous allons modifier notre programme de test et ajouter une méthode pour retourner les résultats de façon à les intégrer dans un tableur. Pour chaque phrase à tester, nous faisons un test avec 8, 16, 32, 64, 128, 256, 512 caractères.

            result.write(count + Classify.adviseTabulation(w.substring(0, Math.min(w.length(), 8)) + "."));
            result.write(Classify.adviseTabulation(w.substring(0, Math.min(w.length(), 16)) + "."));
            result.write(Classify.adviseTabulation(w.substring(0, Math.min(w.length(), 32)) + "."));
            result.write(Classify.adviseTabulation(w.substring(0, Math.min(w.length(), 64)) + "."));
            result.write(Classify.adviseTabulation(w.substring(0, Math.min(w.length(), 128)) + "."));
            result.write(Classify.adviseTabulation(w.substring(0, Math.min(w.length(), 256)) + "."));
            result.write(Classify.adviseTabulation(w.substring(0, Math.min(w.length(), 512)) + ".") + "\n");

Le test est composé de 1000 résumés de brevets en français.

Le résultat du test est retourné dans un fichier que l'on peut importer dans Excel. On obtient les résultats suivant:

FR1000

On peut répéter le travail avec d'autres langues. Pour obtenir une meilleure précsion cela vaut aussi la peine de rajouter des phrases qui proviennent d'autres domaines (journaux, mail, ...). Il faut aussi faire une comparaison entre mots et n-gram et peut-être faire un mixte des deux.

comment faire un Web Service

Nous allons utiliser le framework Jersey pour créer le WebService. Tout le projet est dans languagedetect

Nous avons décider de garder trois paramètres pour le WS:

 <detect>
      <content>Ceci est un texte en langue?</content>
      <numberofpredictions>3</numberofpredictions>
      <key>DEMO</key>
 </detect>
  • content un champ obligatoire: le texte dont on doit prédire la langue.
  • numberofpredictions : le nombre de prédictions
  • key : un paramèter permettant de mettre une clé d'identification (pas utilisé)

Le projet consiste essentiellement à mettre au format xml les entrées et les retours.

On a les packages suivant:

  • org.olanto.myclass.client.detect: des exemples de clients appelant le WebService.
  • org.olanto.myclass.core.detect: la classification
  • org.olanto.myclass.detect: la gestion des protocoles d'appels
  • org.olanto.myclass.web.detect: un exemple d'appel depuis une page html

La compilation du projet produit un fichier languagedetect.war qu'il faut déployer dans Tomcat.

On peut utiliser directement une url pour tester le service. Par exemple:

 http://localhost:8080/languagedetect/detect?content=culture des épinards

doit renvoyer:

 <?xml version="1.0"?>
 <predictions>
 <msg>ok</msg>
 <prediction>
      <rank>1</rank>
      <category>FR</category>
      <score>1154</score>
 </prediction>
 <prediction>
      <rank>2</rank>
      <category>RO</category>
      <score>901</score>
 </prediction>
 <prediction>
      <rank>3</rank>
      <category>DA</category>
      <score>873</score>
 </prediction>
 </predictions>

On peut utiliser la page suivante pour faire des appels:

<html>
<head>
    <title>page to detect language</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <h1><img src="olanto.jpg"/> Home page LanguageDetect</h1>
    <hr/>
    <h3>Call by a URL</h3>
    <p>Click here to have a <a target="_blank" href="http://localhost:8080/languagedetect/detect?content=culture des épinards">demo URL</a></p>
    <hr/>
    <h3>Call with a form</h3>
    <form target="_blank" action="http://localhost:8080/languagedetect/detect" method="get">
        Description : <br />
        <textarea rows = "5" cols = "50" name = "content">
        Enter text here...
        </textarea>
          <input type="submit" value="Submit">
    </form>
    More info here ...
</body>
</html>

la page html ressemble à:

htmlpage

la résultat html ressemble à:

htmlresult

résumé

Nous avons vu:

  • comment utiliser les n-gram pour le parsing.
  • Comment construire et stocker le HNN
  • Comment écrire un WebService

Dans l'exemple suivant, nous allons voir comment le déployer sur un Raspberry Pi (Raspberry Pi).