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).
Version imprimable
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).
Merci Philou :hola:
aujourdhui jetais pas au bureau, en deplacement.
Je verifierai ca ce soir quand je rentre
je vous mettrai au courant
aplus
J'ai oublié de poster le script en question, le voici :
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).Code:
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; } }
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).
Merci Philou,
Me voilà ici apres une absence de 4 jours.
J'etais en deplacement, du coup j'arrivaispas à me connecter..
Bref ,
Oui c'est normal, mais bon on vais changer de corpus en supprimant le caractere "+".Citation:
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).
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 :
Citation:
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
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)
Et tu es bien l'utilisateur cyrine ?
Oui :)
As-tu essayé de créer à la main ce répertoire ?
Code:mkdir ~/.cpan
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
Il faut donc que tu demandes les droits à ton administrateur.
J'ai pas d'administrateur, c'est moi le prorietaire de la machine
Dans ce cas, donne toi les droits :)
Ouffff proble d'installation resolu :D
Mais là j'ai des souci au niveau du script :
Citation:
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
Pourrais-tu poster le script tel qu'il est chez toi ? Merci.
Effictivement, le code me semble etrange car il est tout ecrit en rose :roll:Code:
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; } }
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.
syntaxiquement il est correct? car ya une bonne partie du code qui est ecrit en rose :roll:Citation:
perl glib.pl -m=2 -n=2 -f=2 1000
Ha ok, je fais -in "fichier 1"
j'ai deux fixhier d'entree :roll: