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 :

Algo pour création de trigrammes


Sujet :

Langage Perl

  1. #1
    Membre du Club Avatar de goblin
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 53
    Points
    53
    Par défaut Algo pour création de trigrammes
    Bonjours a tous je galère depuis un petit moment déjà , j'essaie de faire un algo pour générer une liste de trigramme.

    Voila un extrait de ma liste de mots

    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
    abattre
    abattu
    abattus
    abbatial
    abbaye
    abbé
    abbesse
    abc
    abcéder
    abcès
    Abdel
    abdication
    abdiquer
    abdomen
    abdominal
    abécédaire
    abeille
    aber
    aberrant
    aberration
    abêtir
    abhorrer
    Abidjan
    abîme
    abîmer
    abject
    abjection
    abjurer
    ablation
    aboiement
    aboli
    abolir
    abolition
    abolitionnisme
    J'ai tenté une approche en faisant

    mesurer longueur du mot
    tant que la longueur du mot est > a 0
    faire $i = substr($mot, 0, 3);
    print "$i\n";
    Mais substr ne découpe pas réellement la chaine .

    Je trouve vraiment pas comment faire.

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    que veux tu obtenir exactement ?
    cherche "ngram" sur search.cpan.org et tu trouvera des modules interessants
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    S'il ne s'agit que d'un "bête" découpage de mots par paquets de trois lettres, alors les expressions rationnelles sont parfaites pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my @liste=qw (abattre abattu abattus abbatial abbaye abbé);
     
    foreach my $mot (@liste) {
      my @tri = ($mot =~ m/.{3}/g); # Hop, on récupère d'un coup tous les trigrammes complets.
      push (@tri, substr ($mot, 3*@tri)); # On ajoute éventuellement le(s) dernier(s) caractère(s)
      print "Liste des trigrammes pour $mot :\n";
      print " $_" foreach (@tri);
      print "\n";
    }
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    mais les ngrams sont "glissants": il faut sortir tous les trigrams

    exemple "abattre" => "aba", "bat", "att", "ttr", "tre"
    dans ce cas la bonne approche serait de prendre ton code et de 'lappliquer trois fois en decalant à chaque fois d'un caractere
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  5. #5
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Voici ma petite solution:

    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
     
    use strict;
    use warnings;
     
    if (@ARGV == 2) {
        my ($word, $length) = @ARGV;
        print join("\n", ngram($word, $length)), "\n";
    }
    else {
        print "Usage: $0 <word> <length>\n";
        exit 1;
    }
     
    sub ngram {
        my ($word, $length) = @_;
        my $part;
        my $pos = 0;
        my @parts;
     
        while (length($part = substr($word, $pos++, $length)) == $length) {
            push @parts, $part;
        }
     
        return @parts;
    }
    Attention, il peut y avoir des bogues! C'est pas super testé.

  6. #6
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Hop, deux solutions de plus (testées ) :
    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
    my @liste=qw (abattre abattu abattus abbatial abbaye abbé);
     
    foreach my $mot (@liste) {
      my @lettres=split (//, $mot);
      my @tri = map { join('', @lettres[$_..($_+2)]) } (0..(@lettres-3));
      print "Liste des trigrammes pour $mot :\n";
      print " $_" foreach (@tri);
      print "\n";
    }
     
    foreach my $mot (@liste) {
      my @tri = map { substr ($mot, $_, 3) } (0..(length($mot)-3));
      print "Liste des trigrammes pour $mot :\n";
      print " $_" foreach (@tri);
      print "\n";
    }
    Dans le premier cas, il s'agissait de s'amuser un peu avec map et des tranches de tableau.

    Dans le deuxième, beaucoup plus pragmatique, on balaye le mot pour générer les trigrammes à coup de substr.

    Si j'ai aussi utilisé map dans le second cas, c'est car je préfère faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @liste = map { truc_avec_$_ } @liste;
    plutot qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @liste;
    push (@liste, truc_avec_$_) foreach (@liste);
    Question de goût. 8)
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  7. #7
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    2EuroCents: en effet. Je suis un ancien programmeur fonctionnel et la plupart du temps je sort des solutions en utilisant des map dans des map, mais dans ce cas-ci, la boucle while et le push est la première solution qui m'est venue à l'esprit, donc c'est celle que j'ai utilisé. Dieu merci, Perl permet de faire les choses de plusieurs manières

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut groupe de mots
    Bonsoir à tous,

    Comment feriez-vous pour opérer sur des mots, au lieu de lettres?

    C'est-à-dire faire des gram de mots à partir de phrases?

Discussions similaires

  1. Algo de création de titre pour document
    Par scaleo dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 14/10/2006, 09h09
  2. Algo pour déterminer la couleur d'un objet
    Par Nath71 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 26/04/2005, 01h58
  3. Algo pour enlever les yeux rouges
    Par cha266 dans le forum Algorithmes et structures de données
    Réponses: 26
    Dernier message: 25/04/2005, 11h14
  4. Déterminer Algo pour une formule mathématique
    Par jekyll_omiwane dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/01/2005, 18h28
  5. Algo pour écrire un chiffre
    Par Skyw4lKR dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 11/08/2004, 13h32

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