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 :

Probleme de calcul de Probabilité


Sujet :

Langage Perl

  1. #61
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Voici un premier résultat pour les paramètres -m=2 -n=2 -f=2
    MMI.zip (temps d'exécution de l'ordre de 45mn, mémoire nécessaire : 2Go min).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  2. #62
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Philou
    aujourdhui jetais pas au bureau, en deplacement.

    Je verifierai ca ce soir quand je rentre

    je vous mettrai au courant

    aplus
    Le jour est le père du labeur et la nuit est la mère des pensées.

  3. #63
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    J'ai oublié de poster le script en question, le voici :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    use Getopt::Long;
     
    use File::Util;
    use List::Util qw(min sum);
    use DB_File;
    use Time::ETA;
     
    $|++;
     
    # taille sequence dans le fichier initiale, du 2e fichier et frequence
    my ($n, $m, $f, $size_max) = (1) x 3;
    my ($in, $out, $result) = (qw(Texte_FR.txt Texte_EN.txt));
     
    GetOptions ('n=i' => \$n, 'm=i' => \$m, 'f=i' => \$f, 'in=s' => \$in, 'out=s' => \$out, 'res=s' => \$result);
     
    $size_max = $ARGV[0];
     
    $result //= "MMI-m$m-n$n-f$f".($size_max ? "-$size_max" : "").".txt";
     
    sub get_x_gram($$) {
      my ($words, $x_gram_size) = @_;
     
      $words = [ split /\s+/, $words ] if !ref $words;
      return map { "@{$words}[$_ .. $_ + $x_gram_size-1]" } 0 .. @$words-$x_gram_size;
    }
     
    sub trim(\$) {
    	my $string = shift;
    	$$string =~ s/^\s+|\s+$//;
    }
     
    my $log2 = log(2);
    sub log2($) {
    	my $n = shift;
    	return log($n)/$log2;
    }
     
    my $print_progress = 1;
    my ($total, $size, $eta, $step, $progress);
    sub init_progress {
      my ($universe, $auto_step) = @_;
      $total = (-f $universe ? File::Util->line_count($universe) :
                ref($universe) eq "HASH" ? scalar(keys %$universe) :
                ref($universe) eq "ARRAY" ? scalar(@$universe) : $universe);
      $step = 0;
      $step = min(23, int($total / 20000) || 0) if defined $auto_step && $auto_step == 1;
      $eta = Time::ETA->new(milestones => int($total/($step+1)));
      $progress = 0;
    }
    sub progress {
      my ($line, $pre, $post) = @_;
      if ($print_progress && $progress++ == $step) {
        $progress = 0;
        $eta->pass_milestone();
     
        return ($pre // "").sprintf "%10d/$total %2d%% (remaining %s, elapsed ".int($eta->get_elapsed_seconds()).") $post",
          $line, $eta->get_completed_percent(), $eta->get_remaining_time();
      }
    }
     
    init_progress($size_max // $in);
    my $line_number = 0;
     
    open my $IN,  "<", $in  or die "Can't open $in for reading: $!\n";
    open my $OUT, "<", $out or die "Can't open $out for reading: $!\n";
    open my $RESULT, ">", $result or die "Can't open $result for writing: $!\n";
     
    my ($key_total, $m_gram_total, $n_gram_total) = (0) x 3;
    my %key_count;
    unlink "key_count_tmp";
    my $A = DB_File::HASHINFO->new();
    $A->{bsize} = 10000;
    $A->{nelem} = $total * 100;
    say "nelem=$A->{nelem}";
    #tie %key_count, "DB_File", "key_count_tmp", O_RDWR|O_CREAT, 0666, $A if $total > 100000;
    keys %key_count = $total * 100 if !tied %key_count;
    my (%m_gram_count, %n_gram_count);
    say "Starting";
    while (defined(my $words1 = <$IN>)) {
      print progress(++$line_number, "Counting rules ", scalar(keys %key_count)."      \r");
      trim($words1);
      my $words2 = <$OUT>;
      trim($words2);
     
      my @words1 = split /\s+/, $words1;
      my @m_gram = get_x_gram(\@words1, $m);
      my %line_m_gram_count;
      $line_m_gram_count{$_}++ foreach @m_gram;
      $m_gram_count{$_} += $line_m_gram_count{$_} foreach keys %line_m_gram_count;
      # Filter m_gram with frequence > $f
      if (grep $line_m_gram_count{$_} > $f, keys %line_m_gram_count) {
        my @words2 = split /\s+/, $words2;
        my @n_gram = get_x_gram(\@words2, $n);
     
        foreach my $m_gram (@m_gram) {
          foreach my $n_gram (@n_gram) {
            $key_count{$m_gram}->{$n_gram}++;
          }
        }
        my %line_n_gram_count;
        $line_n_gram_count{$_}++ foreach @n_gram;
        $n_gram_count{$_} += $line_n_gram_count{$_} foreach keys %line_n_gram_count;
        $key_total += @m_gram * @n_gram;
        $m_gram_total += @m_gram;
        $n_gram_total += @n_gram;
      }
     
      last if $size_max && $line_number >= $size_max;
    }
     
    say "";
    say "Counting total rules";
    my ($total_rules, $rule) = (sum(map scalar(keys %{$_}), values %key_count), 0);
    init_progress($total_rules, 1);
    foreach my $m_gram (sort keys %key_count) {
      foreach my $n_gram (sort keys %{$key_count{$m_gram}}) {
        my $mmi = $key_count{$m_gram}->{$n_gram};
     
        $mmi /= $key_total;
        $mmi *= log2($mmi/($m_gram_count{$m_gram}/$m_gram_total)*($n_gram_count{$n_gram}/$n_gram_total));
     
        print progress($rule++, "Computing MMI ", "      \r");
        printf { $RESULT } "$m_gram > $n_gram > %.10f\n", $mmi;
      }
    }
    J'ai commenté la ligne du tie, car la méthode n'est plus nécessaire avec cette version (visiblement, il est préférable d'avoir, en terme de consommation mémoire, n hash de m éléments plutôt qu'un hash de n x m éléments).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #64
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Un point : dans les fichiers d'exemples que tu as fourni, la ligne 2 du fichier FR contient une combinaison de mot (séparés par +), alors que la même ligne en version EN n'en possède pas (tous les mots sont séparés). Est-ce normal ? (seulement 5806 lignes contiennent des combinaisons avec + sur les presque 600000 lignes du fichier FR, et aucune dans le fichier EN).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #65
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Philou,
    Me voilà ici apres une absence de 4 jours.
    J'etais en deplacement, du coup j'arrivaispas à me connecter..
    Bref ,
    Un point : dans les fichiers d'exemples que tu as fourni, la ligne 2 du fichier FR contient une combinaison de mot (séparés par +), alors que la même ligne en version EN n'en possède pas (tous les mots sont séparés). Est-ce normal ? (seulement 5806 lignes contiennent des combinaisons avec + sur les presque 600000 lignes du fichier FR, et aucune dans le fichier EN).
    Oui c'est normal, mais bon on vais changer de corpus en supprimant le caractere "+".
    Le jour est le père du labeur et la nuit est la mère des pensées.

  6. #66
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Mince, je suis sur un nouveau probleme là,
    On ma donné un nouveau PC et j'ai passé tout le weekend sur un souci quand j'essaye d'installer CPAN :
    cpan
    Terminal does not support AddHistory.


    Your configuration suggests that CPAN.pm should use a working
    directory of
    /home/cyrine/.cpan
    Unfortunately we could not create the lock file
    /home/cyrine/.cpan/.lock
    due to permission problems.

    Please make sure that the configuration variable
    $CPAN::Config->{cpan_home}
    points to a directory where you can write a .lock file. You can set
    this variable in either a CPAN/MyConfig.pm or a CPAN/Config.pm in your
    @INC path;
    You don't seem to have a user configuration (MyConfig.pm) yet.
    Do you want to create a user configuration now? (Y/n) [yes] y
    mkdir /home/cyrine/.cpan/CPAN: Permission denied at /usr/share/perl/5.10/CPAN/Shell.pm line 656
    Le jour est le père du labeur et la nuit est la mère des pensées.

  7. #67
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    As-tu les droits en écriture et en éxecution sur le répertoire /home/cyrine/.cpan ? (et le répertoire /home/cyrine si .cpan n'existe pas)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #68
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    As-tu les droits en écriture et en éxecution sur le répertoire /home/cyrine/.cpan ? (et le répertoire /home/cyrine si .cpan n'existe pas)
    Merci Philou
    drwxr-xr-x 58 cyrine cyrine 4096 2013-04-14 21:49 ./
    le repertoire /home/cyrine/.cpan n'existe pas
    Le jour est le père du labeur et la nuit est la mère des pensées.

  9. #69
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Et tu es bien l'utilisateur cyrine ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #70
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Oui
    Le jour est le père du labeur et la nuit est la mère des pensées.

  11. #71
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    As-tu essayé de créer à la main ce répertoire ?

    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #72
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Moui je vois bien qu'il etait bien un dossier caché. mais j'ai pas le droit de modier les droit d'cces meme manuellement, il m'indique : "you are not the owner, so you cannot change these permissions"n
    Bizarre bien que c'e'st moi qui a fait l'installation et tout
    Le jour est le père du labeur et la nuit est la mère des pensées.

  13. #73
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il faut donc que tu demandes les droits à ton administrateur.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  14. #74
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    J'ai pas d'administrateur, c'est moi le prorietaire de la machine
    Le jour est le père du labeur et la nuit est la mère des pensées.

  15. #75
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Dans ce cas, donne toi les droits
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  16. #76
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Ouffff proble d'installation resolu

    Mais là j'ai des souci au niveau du script :
    nelem=200
    Starting
    Counting rules 2/2 100% (remaining 0:00:00, elapsed 0) 0
    Counting total rules
    Use of uninitialized value $universe in -f at glib.pl line 48, <$IN> line 2.
    Use of uninitialized value $total in division (/) at glib.pl line 52, <$IN> line 2.
    Use of uninitialized value $total in division (/) at glib.pl line 53, <$IN> line 2.
    Parameter 'milestones' should be positive integer. Stopped at glib.pl line 53
    Le jour est le père du labeur et la nuit est la mère des pensées.

  17. #77
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pourrais-tu poster le script tel qu'il est chez toi ? Merci.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  18. #78
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    use Getopt::Long;
     
    use File::Util;
    use List::Util qw(min sum);
    use DB_File;
    use Time::ETA;
     
    $|++;
     
    # taille sequence dans le fichier initiale, du 2e fichier et frequence
    my ($n, $m, $f, $size_max) = (1) x 3;
    my ($in, $out, $result) = (qw(Texte_FR.txt Texte_EN.txt));
     
    GetOptions ('n=i' => \$n, 'm=i' => \$m, 'f=i' => \$f, 'in=s' => \$in, 'out=s' => \$out, 'res=s' => \$result);
     
    $size_max = $ARGV[0];
     
    $result //= "MMI-m$m-n$n-f$f".($size_max ? "-$size_max" : "").".txt";
     
    sub get_x_gram($$) {
      my ($words, $x_gram_size) = @_;
     
      $words = [ split /\s+/, $words ] if !ref $words;
      return map { "@{$words}[$_ .. $_ + $x_gram_size-1]" } 0 .. @$words-$x_gram_size;
    }
     
    sub trim(\$) {
    	my $string = shift;
    	$$string =~ s/^\s+|\s+$//;
    }
     
    my $log2 = log(2);
    sub log2($) {
    	my $n = shift;
    	return log($n)/$log2;
    }
     
    my $print_progress = 1;
    my ($total, $size, $eta, $step, $progress);
    sub init_progress {
      my ($universe, $auto_step) = @_;
      $total = (-f $universe ? File::Util->line_count($universe) :
                ref($universe) eq "HASH" ? scalar(keys %$universe) :
                ref($universe) eq "ARRAY" ? scalar(@$universe) : $universe);
      $step = 0;
      $step = min(23, int($total / 20000) || 0) if defined $auto_step && $auto_step == 1;
      $eta = Time::ETA->new(milestones => int($total/($step+1)));
      $progress = 0;
    }
    sub progress {
      my ($line, $pre, $post) = @_;
      if ($print_progress && $progress++ == $step) {
        $progress = 0;
        $eta->pass_milestone();
     
        return ($pre // "").sprintf "%10d/$total %2d%% (remaining %s, elapsed ".int($eta->get_elapsed_seconds()).") $post",
          $line, $eta->get_completed_percent(), $eta->get_remaining_time();
      }
    }
     
    init_progress($size_max // $in);
    my $line_number = 0;
     
    open my $IN,  "<", $in  or die "Can't open $in for reading: $!\n";
    open my $OUT, "<", $out or die "Can't open $out for reading: $!\n";
    open my $RESULT, ">", $result or die "Can't open $result for writing: $!\n";
     
    my ($key_total, $m_gram_total, $n_gram_total) = (0) x 3;
    my %key_count;
    unlink "key_count_tmp";
    my $A = DB_File::HASHINFO->new();
    $A->{bsize} = 10000;
    $A->{nelem} = $total * 100;
    say "nelem=$A->{nelem}";
    #tie %key_count, "DB_File", "key_count_tmp", O_RDWR|O_CREAT, 0666, $A if $total > 100000;
    keys %key_count = $total * 100 if !tied %key_count;
    my (%m_gram_count, %n_gram_count);
    say "Starting";
    while (defined(my $words1 = <$IN>)) {
      print progress(++$line_number, "Counting rules ", scalar(keys %key_count)."      \r");
      trim($words1);
      my $words2 = <$OUT>;
      trim($words2);
     
      my @words1 = split /\s+/, $words1;
      my @m_gram = get_x_gram(\@words1, $m);
      my %line_m_gram_count;
      $line_m_gram_count{$_}++ foreach @m_gram;
      $m_gram_count{$_} += $line_m_gram_count{$_} foreach keys %line_m_gram_count;
      # Filter m_gram with frequence > $f
      if (grep $line_m_gram_count{$_} > $f, keys %line_m_gram_count) {
        my @words2 = split /\s+/, $words2;
        my @n_gram = get_x_gram(\@words2, $n);
     
        foreach my $m_gram (@m_gram) {
          foreach my $n_gram (@n_gram) {
            $key_count{$m_gram}->{$n_gram}++;
          }
        }
        my %line_n_gram_count;
        $line_n_gram_count{$_}++ foreach @n_gram;
        $n_gram_count{$_} += $line_n_gram_count{$_} foreach keys %line_n_gram_count;
        $key_total += @m_gram * @n_gram;
        $m_gram_total += @m_gram;
        $n_gram_total += @n_gram;
      }
     
      last if $size_max && $line_number >= $size_max;
    }
     
    say "";
    say "Counting total rules";
    my ($total_rules, $rule) = (sum(map scalar(keys %{$_}), values %key_count), 0);
    init_progress($total_rules, 1);
    foreach my $m_gram (sort keys %key_count) {
      foreach my $n_gram (sort keys %{$key_count{$m_gram}}) {
        my $mmi = $key_count{$m_gram}->{$n_gram};
     
        $mmi /= $key_total;
        $mmi *= log2($mmi/($m_gram_count{$m_gram}/$m_gram_total)*($n_gram_count{$n_gram}/$n_gram_total));
     
        print progress($rule++, "Computing MMI ", "      \r");
        printf { $RESULT } "$m_gram > $n_gram > %.10f\n", $mmi;
      }
    }
    Effictivement, le code me semble etrange car il est tout ecrit en rose
    Le jour est le père du labeur et la nuit est la mère des pensées.

  19. #79
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Peux-tu aussi poster les paramètres avec lesquels tu as appelé le script pour obtenir de telles erreurs ?
    La seule explication que je trouve est que tu n'aurais pas mis d'option -in=<fichier> pour préciser le fichier d'entrée.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  20. #80
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut

    perl glib.pl -m=2 -n=2 -f=2 1000
    syntaxiquement il est correct? car ya une bonne partie du code qui est ecrit en rose
    Ha ok, je fais -in "fichier 1"
    j'ai deux fixhier d'entree
    Le jour est le père du labeur et la nuit est la mère des pensées.

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 9 PremièrePremière 12345678 ... DernièreDernière

Discussions similaires

  1. Probleme de calcul :S
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2005, 21h06
  2. algorithme pour calcul de probabilité
    Par filsdugrand dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 14/12/2005, 15h11
  3. probleme de calculs : 1-0.9 = 0.099999999999998
    Par francon81 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/06/2005, 15h17
  4. Petit probleme de calcul...
    Par Mistoufline dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 17/05/2005, 17h52
  5. [Conversion]Probleme de calcul en double et en floatant
    Par TOPGUN89 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/04/2005, 18h46

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