IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Mise au point d'un bon algo


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut Mise au point d'un bon algo
    Je cherche a faire un algo pour déterminer la langue de certains fichiers.

    les mots de ces fichiers sont stocké dans le tableau
    @motsdudoc
    et mes "dictionnaire" sont dans un fichier
    /dico/
    Les mot dans les dicos sont rangé sous la forme

    mot1
    mot2
    mot3

    J'ai déja fait un début d'algo que j'ai trouvé sur le forum mais il est loin d'être optimal.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/usr/bin/perl -w 
     
    #Tout d'abord, fais toi un repertoire ou tu auras tous tes dicos 
     
    use strict; 
    use Carp; 
     
    my $count = 0; 
    my $ligne_dico; 
    my @mots_dico; 
     
    my $texte = "voici un exemple de ligne dont je dois trouver la langue"; 
    my @mon_texte = split(/ /,$texte); 
     
    #Recuperation des fichiers (dico) par une commande system 
    my @mes_dico = `ls /home/.../mon_repertoire/`; 
     
    #parcour chaque fichier dico 
    foreach my $un_dico (@mes_dico) { 
       #ouverture dico 
       open (FILE, "$un_dico") || die "impossible to open $un_dico $!"; 
       #recupere la &ere et unique ligne du dico 
       $ligne_dico = <FILE>; 
       close (FILE); 
       #met chaque mot du dico dans une case du tableau @mots_dico 
       @mots_dico = split(/\|/,$ligne_dico); 
     
       #comparaison de @mon_texte avec les mots du dico @mots_dico 
       foreach my $mot_texte (@mon_texte) { 
          foreach my $un_mot_dico (@mots_dico) { 
             if ($mot_texte eq $un_mot_dico) { 
                $count ++; 
             } 
          }    
       } 
       print "$count mot(s) trouve(s) dans $un_dico \n"; 
       $count = 0;   #reinitialise le nombre à 0 pour le traitement du prochain fichier 
    }

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Et en quoi ce code n'est-il pas optimal, précisément ?

    Les dictionnaires sont-ils sur une seule ligne ? C'est bizarre, et ce n'est pas comme ça dans l'échantillon que tu donnes.

    Sinon, voici duex idées:
    • la fonction Perl opendir() est préférable à système('ls');
      il faudrait penser à déterminer un score (genre 75% du nombre de mots dans le texte à identifier) à partir duquel tu arrêtes de chercher dans un dictionnaire, et dans les autres.
      Et surtout : plutot que de faire des arrays à partir des listes des mots, des hashs seraient bcp plus performants.

    Ainsi, tu pourrais faire qqch comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my %langue1;
    #lire le dico
    while ( <DICO> ) {
        $langue1{$_} = 1;
    }
    Et puis plus loin, pour chaque mot du texte à tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ( definied $langue1{$mot} ) {
       # augmenter le score pour cette langue
    }

  3. #3
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Mets tes mots dans un regexp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    use strict;
    use Regexp::Assemble;
     
    my $mots_dico = Regexp::Assemble->new;
     
    ...
     
    open (FILE, "$un_dico") || die "impossible to open $un_dico $!";
    #recupere la &ere et unique ligne du dico
    $ligne_dico = <FILE>;
    close (FILE);
    #met chaque mot du dico dans une case du tableau @mots_dico
    $mots_dico->add( split(/\|/,$ligne_dico) );
     
    ...
     
    foreach my $mot_texte (@mon_texte) {
        ++$count if $mot_text =~ /$mots_dico/;
    }
    Le regexp pourrait prendre un certain moment à calculer, alors il serait peut-être utile de le génerer une fois, le sauver dans un fichier, et puis le lire chaque fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # use fois créé
    open OUT, '>', 'dico.regexp' or die $!
    print OUT $mots_dico->as_string, "\n";
    close OUT;
     
    # après
    open REGEXP, '<', 'dico.regexp' or die $!;
    my $str = <REGEXP>;
    close REGEXP;
    chomp($str);
    my $mots_dico = qr/$str/;
    c'est à dire que tu as un script qui génère le regexp (par exemple, à lancer chaque fois que tu fais des ajouts au dici), et ton script principal le lirait.

    On pourrait faire le malin et recalculer le regexp automatiquement seulement si la date d'un des fichiers du dico et plus récent que la date du fichier du regexp.

    N

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Auriez vous une idée sur comment faire un ti algo pour déterminer a partir de cette ligne la langue qui a matcher le plus de $count ? parce que je séche

    print "$count mot(s) trouve(s) dans $un_dico \n";
    mici

Discussions similaires

  1. Mise au point => static, inline et consorts
    Par progfou dans le forum C
    Réponses: 14
    Dernier message: 16/03/2006, 16h46
  2. Petite mise au point avec gluUnProject.
    Par fatpat94 dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/07/2005, 15h40
  3. [Mise au point] dhcp
    Par Ernest dans le forum Développement
    Réponses: 5
    Dernier message: 07/10/2004, 17h56
  4. Questions de mise aux points
    Par nicoo dans le forum DirectX
    Réponses: 5
    Dernier message: 11/05/2004, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo