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 :

calcul de frequence


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut calcul de frequence
    Bonjour,

    J'ai un fichier où je voudrais calculer la fréquence de ses mot, les lignes de mot fichier se présentent comme suit :

    naql bdae 0 --- nAqly bdAE --- NN NN --- naql bdae --- nn --- BASE --- 00 --- 543 --- 0 --- 0
    où le numero 543 est le numéro du document où se trouve le mot naql bdae.

    de telle sorte que mo fichier de sortie serait une matrice où les lignes est les mots du fichier et les colonnes sont les fréquences du mot dans le document:
    D1…. Dn
    Mot 1 f1 ….fn
    Mot 2 f2 ….fn
    Mot 2 f2 ….fn

    Merci de votre aide

  2. #2
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour.

    Un conseil pour ce travail, utilises des tables de hachage et leur capacité d'autovivification

    Via une expression régulière, met tous tes mots dans une table de hachage et tu auras ainsi le nombre fois que le mot est présent dans le sujet

    Ca donnerais un truc comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my %hash;
    while (my $ligne = <FIC>)
    {
        $ligne =~s/(\w+)/{$hash{$1}++}/eg;
    }
    Modieife le comme tu veux pour qu'il réponde à ton besoin
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut calcul frequence
    Bonjour

    c'est ce que j'ai pu comprendre que j'aurais la frequence totale du mot dans tout le fichier alors que j'ai seulement un seul fichier où c'est ecrit le mot et le numéro du document où il se trouve par exemple une ligne du fichier et comme ceci :
    production économique 3 --- SBC ADJ --- na ---2---0
    où le mot "production économique" est dans le fichier numéro 2.

    Donc comme fichier de sortie

    production économique 1 1 0 0 0
    économie 2 0 0 0 0

    Merci de m'aider

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Citation Envoyé par siham_06
    Bonjour

    c'est ce que j'ai pu comprendre que j'aurais la frequence totale du mot dans tout le fichier alors que j'ai seulement un seul fichier où c'est ecrit le mot et le numéro du document où il se trouve par exemple une ligne du fichier et comme ceci :
    production économique 3 --- SBC ADJ --- na ---2---0
    où le mot "production économique" est dans le fichier numéro 2.

    Donc comme fichier de sortie

    production économique 1 1 0 0 0
    économie 2 0 0 0 0

    Merci de m'aider

    1) pense à utiliser la balise CODE, ce sera plus lisible

    2) ta ligne est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    production économique 3 --- SBC ADJ --- na ---2---0
    tu veux en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    production économique	1	1	0	0	0
    économie                          2           0           0	0	0
    question : ou vois-tu la ligne "économie" dans la ligne ?
    et à quoi correspondent les chiffres ?

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    2) ta ligne est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    production économique 3 --- SBC ADJ --- na ---2---0
    oui exactement j'ai donné un exemple d'une ligne de mon fichier
    tu veux en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    production économique	1	1	0	0	0économie                          2           0           0	0	0
    question : ou vois-tu la ligne "économie" dans la ligne ?

    le mot économie est la 2ème ligne

    et à quoi correspondent les chiffres ?[/QUOTE]

    J'ai donné l'exemple que je voudrais avoir en sortie
    Les chiffres correspond aux frequences du mot dans les documents
    par exemple le mot économie occure 2 fois dans le premier document alors que sa fréquence égale à 0 dans les autres documents.
    Pour production économique occure 1 fois dans le premier document une autre dans le deuxème document alors qu'il a une frequence de 0 dans les autres documents
    Merci de votre aide et de l'intérêt que vous portez à mon problème

  6. #6
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Ok, je comprends mieux le problème.

    Donc, en tout premier lieu, il te faut une hash pour stocker les résultats:

    Pour lire le fichier, utiliser un code du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    open(INPUT '<', $file) || die ("impossible de lire $file\n");
    while (my $line = <INPUT>)
    {
        # production économique 3 --- SBC ADJ --- na ---2---0
        if ($line =~ /^(.+?) \d --- (?:.+?) --- (?:.+?) --- (\d+) --- (?:\d+)$/)
        {
            my ($mot, $docid) = ($1, $2);
            $HASH{$mot}{$docid}++;
        }
    }
    close(INPUT);
    Bon là, la regexp est fausse, vu que tu n'as pas donné un format descriptif complet et précis de la ligne, mais le principe est bon.

    A la fin, tu n'auras plus qu'à afficher le tout...

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # liste des noms de fichiers
    my @documents = ('fichier1', 'fichier2', 'fichier3', 'fichier4', 
    'fichier5');
    Pour le tableau de documents, je ne l'ai pas, j'ai qu'un seul fichier qui se présente par exemple comme ceci (c'est qu'un bout du fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    production économique 3 --- SBC ADJ --- na ---2---0
     économique 5 --- SBC ADJ --- na ---3---0
    où le chiffre 2 veut dire que le mot production économique se trouve dans le document 2 et le chiffre 3 dans la deuxième ligne veut dire que le mot économique se trouve dans le document 3.
    et je voudrais calculer la frequence de chaque mot de telle manière j'aurais le mot et sa frequence pour chaque document.

    Merci pour votre aide

  8. #8
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Ok, alors voici le code pour lire le fichier:

    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 %HASH = ();
    my $docidmax = 0; # n° max de document
     
    open(INPUT '<', $file) || die ("impossible de lire $file\n");
    while (my $line = <INPUT>)
    {
        # production économique 3 --- SBC ADJ --- na ---2---0
        if ($line =~ /^(.+?) \d ---.*---(\d+)---0$/)
        {
            my ($mot, $docid) = ($1, $2);
            $HASH{$mot}{$docid}++;
            $docidmax = $docid, if ($docid > $docidmax);
        }
    }
    close(INPUT);
    et le code pour afficher le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foreach my $mot (sort keys %HASH)
    {
        print($mot);
        for (my $docid = 1; $docid <= $docidmax  ; $docid++)
        {
            my $frequency = $HASH{$mot}{$docid} || 0;
            print(" $frequency");
        }
        print("\n");
    }

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Merci infiniment pour votre aide precieuse
    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 %HASH = ();
    my $docidmax = 0; # n° max de document
     
    open(INPUT '<', $file) || die ("impossible de lire $file\n");
    while (my $line = <INPUT>)
    {
        # production économique 3 --- SBC ADJ --- na ---2---0
        if ($line =~ /^(.+?) \d ---.*---(\d+)---0$/)
        {
            my ($mot, $docid) = ($1, $2);
            $HASH{$mot}{$docid}++;
            $docidmax = $docid, if ($docid > $docidmax);
        }
    }
    close(INPUT);
    pour l'expression régulière de la ligne du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     production économique 3 --- production économique --- SBC ADJ --- production économique --- na --- BASE --- 92 --- 14 --- 1 --- 0
    J'ai utilisé cette expression regulière pour reconnaitre la ligne du fichier mais ça marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($_ =~ /^(.+?) \d ---.*---.*---.*---.*---.*---.*---(\d+)---.*---0$/)
    où le numero 14 est le document où se trouve le mot production économique

    le code est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while (<INPUT>)
    {   #production économique 3 --- production économique --- SBC ADJ --- production économique --- na --- BASE --- 92 --- 14 --- 1 --- 0 
        if ($_ =~ /^(.+?) \d ---.*---.*---.*---.*---.*---.*---(\d+)---.*---0$/)
            {
            my ($mot, $docid) = ($1, $2);
            $HASH{$mot}{$docid}++;
            $docidmax = $docid, if ($docid > $docidmax);
        }
    }
    close(INPUT);
    Merci de votre aide

  10. #10
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    C'est normal, la ligne ne correpond pas à ce que tu viens juste de me décrire dans ton précédent message... dans ton précédent message, tu as décrit un format ou le n° de ligne n'est pas encadré d'espaces, et là, le n° ligne est entouré d'espaces
    Dans le précédent message, tu avais mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    production économique 3 --- SBC ADJ --- na ---2---0
    avec 2 comme n° de ligne, et là, cette ligne est bien analysée par ma regexp.

    Décide toi sur le format, ou montre tous les formats que tu peux trouver, sinon on n'a pas fini de s'embrouiller

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    pourquoi n'utilises-tu pas la regexp que j'ai mise ?
    la regexp que vous m'aviez mis permet de reconnaitre la suite suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    production économique 3 --- SBC ADJ --- na ---2---0
    alors que je voudrais reconnaitre la sequence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    production économique 3 --- production économique --- SBC ADJ --- production économique --- na --- BASE --- 92 --- 14 --- 1 --- 0
    pour cela j'ai utilisé celle ci mais ça marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($_ =~ /^(.+?) \d ---.*---.*---.*---.*---.*---.*---(\d+)---.*---0$/)
    Merci de votre aide

  12. #12
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Il y a des espaces autour du n° de ligne, et ta regexp n'en comporte pas. il faut utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($_ =~ /^(.+?) \d ---.*---.*---.*---.*---.*---.*--- (\d+) ---.*--- 0$/)

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  13. #13
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    enfin ça marche

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] code vba pour formule de calcul de frequence date
    Par JENNIFER27950 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/11/2014, 17h32
  2. [Débutant] Comment calculer la frequence d'un image ?
    Par genius4evers dans le forum Images
    Réponses: 9
    Dernier message: 17/04/2012, 15h25
  3. Calcul de Mel Frequency Cepstral Coefficient mfcc
    Par imene_t1 dans le forum Traitement du signal
    Réponses: 2
    Dernier message: 12/04/2009, 22h43

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