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. #21
    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
    Bon là c'est la 1ere partie du code
    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
    #!/usr/bin/perl 
     
    use strict;
    use warnings;
    use Data::Dumper;
    use Getopt::Long;
     
    my $n = 1;
    my $m = 1;
     
    GetOptions ('n=i' => \$n);
    GetOptions ('m=i' => \$m);
     
    my $inWords = createIndex('final.txt',$n);
    my $outWords = createIndex('final.txt',$m);
     
    sub createIndex
    {
      my ($filename, $taille) = @_;
      open fileSeq, "<$filename" or die $!;
     
      my %seqs =();
      while (<fileSeq>) {
        chomp;
        s/^\s+//;
        s/\s+$//;
        my @words = split(/ /);
     
        for(my $i = 0; $i < scalar(@words); $i++) {
     
          my @key = ();
     
          for (my $j = $i; $j<($i+$taille); $j++) {
            if (defined $words[$j]) {
              push @key, $words[$j];
            }
          }
          if (scalar(@key) == $taille) {
         my $word = lc (join ' ', @key);
     
            if ($seqs{$word}) 
            {
           $seqs{$word}++;
            }
            else
            {
           $seqs{$word} = 1
            }
          }
        }
      }
     
      close fileSeq;
     
      return \%seqs;
    }
    Il extraite tous les n sequence et m sequence des deux fichier telque n et m sont precisé par l'user
    Mais apres je vois pas comment lier ca au code du calcul de prob
    Le jour est le père du labeur et la nuit est la mère des pensées.

  2. #22
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    Je ne suis pas bien sur de ce que tu souhaites faire avec ta première partie de code. Il semblerait que tu aies en sortie de ta sub une hash ( return \%seqs et que tu mettes ça dans une variable ($inWords). Du coup je supposes que tu dois obtenir des résultats tels que :
    $inWords==HASH(0xcff82e0)

  3. #23
    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 Trex,
    J'ai une autre question
    comment je peux lire 2 fichier simultanement?
    Je veux dire
    J'ai deux fichier
    Fichier1
    bonjour les amis
    bonjour les copains

    Fichier2:
    Hello friends
    Hello my friends

    J'aimerai extraire le nombre de paire de mot dans chacune de phrase dans les 2 fichoer de cette facon
    nombre de paire = (2*1)+ (2*2)
    1 correspond 2 paires de mots contigues fichier1ligne1 * 1 paire fichier2ligne1) +( 2 paire ligne2 fichier1 * 2 paires ligne2 fichier2)

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

  4. #24
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    C'est assez simple en fait : tu connais déjà la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (<fileSeq>) {
    ...
    }
    Perl est un langage très gentil qui comprend ce que tu veux lui dire. Tu pourrais aussi écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (defined( $line = <fileSeq> )) {
    ...
    }
    Cette ligne de code te permet de mettre la ligne d'intérêt non pas dans la variable spéciale $_ mais dans une variable "classique" $line. Sinon le fonctionnement est exactement le même. Mais que se passe-t'il exactement ?
    1/tu es dans une boucle while qui s'arrête dès que le booléen est faux.
    2/ton booléen correspond à l'existence d'une nouvelle ligne dans ton fichier <fileSeq> ; Vrai si la ligne existe, Faux si la ligne n'existe pas.
    3/la variable $line devient égale à la nouvelle ligne de <fileSeq>.

    Dans ton cas, tu veux conserver ta boucle, qui va analyser ton fichier ligne à ligne, mais également extraire une deuxième ligne d'un autre fichier Pour cela il te suffit de faire une commande similaire à 3/ !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (defined( $line1 = <fileSeq1> )) {
    	$line2 = <fileSeq2>;
    ...
    }
    Tu supposes ici que ton fichier fileSeq2 est au moins aussi long que ton fichier fileSeq1.

  5. #25
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    En fait, lire deux fichiers en parallèle peut être assez difficile, selon ce que l'on veut vraiment faire (quand je dis difficile, je veux dire qu'il est très facile de foirer son algo). Techniquement, pas de difficulté, Trex7 a montré comment faire, c'est simple. Mais si l'on veut l'on veut lire soit le fichier 1, soit le fichier 2, selon les circonstances (par exemple selon les résultats d'une comparaison entre les deux lignes en cours), il est assez facile de se tromper sur des cas particuliers.

    Donc, si l'un au moins de tes fichiers est suffisamment petit, il est souvent beaucoup plus facile de lire entièrement un fichier et de le stocker en mémoire (dans un tableau ou un hash, par exemple), puis de lire d'autre et, pendant la lecture du second, de regarder dans le tableau ou le hash sir l'on retrouve des éléments du premier fichier.

    Si tes deux fichiers sont très gros (disons par exemple 1 Go), alors ils ne tiendront pas en mémoire et pas d'autre solution que la lecture en parallèle, à condition que les fichiers soient ordonnés de la même façon. Je précise cela parce que, sur ton autre fil, tu manipules des quantités de données très volumineuses.

    Ce que je dis est pour l'instant un peu général parce que je ne sais pas ce que tu veux faire exactement dans ta lecture simultanée des deux fichiers. Je pourrais être plus spécifique si tu expliques le but de la lecture de ces deux fichiers.

    Je te signale au passage que je suis en train d'écrire (tout doucement pour l'instant) un module de comparaison entre deux fichiers triés très volumineux, il se pourrait qu'il te soit utile. Si c'est le cas, ce serait pour moi une motivation de me dépêcher un peu plus que je ne le fais actuellement. J'y gagnerais une occasion de tester mon travail, et toi un algo tout fait à utiliser.

    Donc, explique plus précisément ce que tu veux faire dans cette lecture simultanée de tes deux fichiers, il est relativement vraisemblable que mon module puisse te servir.

  6. #26
    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 Lolo,
    En fait j'ai fini ce weekend de faire le script, mais le probleme c'est quil ne pas fonctionner sur des machine equipés de memoire inférieuer à 10G .
    Donc là je cherche une idée pour l'ameliorer
    Le jour est le père du labeur et la nuit est la mère des pensées.

  7. #27
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour Étoile de mer,

    mais le probleme c'est quil ne pas fonctionner sur des machine equipés de memoire inférieuer à 10G
    C'est exactement ce dont je parlais: si tes fichiers sont très gros ils ne tiendront pas dans un hash ou un tableau car tu dépassera la mémoire disponible.

    Dans ce cas, il faut voir si tu peux lire les deux fichiers séquentiellement en parallèle pour faire le traitement au fur et à mesure de la lecture, mais cela implique de trier préalablement les deux fichiers selon la clef de comparaison qui sera utilisée pour lire les fichiers.

    Ensuite, comme je le disais dans mon post précédent, l'algo de lecture en parallèle tend à être délicat, c'est la raison pour laquelle j'essaie de faire un module qui se charge de cette partie algorithme de lecture en parallèle (mais je n'en suis qu'au début).

    Cela dit, je ne sais pas si cela fonctionnerait pour ce que tu veux faire pour la bonne raison que je ne comprends pas ce que tu veux faire.

    Pourrais-tu poster ton script ainsi qu'un extrait significatif de tes vrais fichiers pour que je puisse comprendre exactement ce que tu veux faire?

    Bonne fin de weekend,
    Laurent.

  8. #28
    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
    Citation Envoyé par étoile de mer Voir le message
    Merci Lolo,
    En fait j'ai fini ce weekend de faire le script, mais le probleme c'est quil ne pas fonctionner sur des machine equipés de memoire inférieuer à 10G .
    Donc là je cherche une idée pour l'ameliorer
    Poste le pour voir

    Sinon, voici une fonction simple permettant d'extraire toutes les séquences de n mots d'une phrase :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub get_sequences($$) {
      my ($sentence, $sequence_size) = @_;
     
      my @words = split /\s+/, $sentence;
      return map { "@words[$_ .. $_ + $sequence_size-1]" } 0 .. @words-$sequence_size;
    }
    (ça améliorera un peu les performances de ton programme, mais ça ne rendra surtout "moins complexe").
    L'algorithme fonctionne ainsi :
    - pour tous les indices de mots de 0 à (nombre-de-mot - taille-de-la-sequence)
    - assembler les mots de l'indice courant à l'indice courant plus la taille de la séquence moins un.
    La fonction retourne un liste.

    Pour la lecture en parallèle, je crois comprendre qu'à chaque ligne du fichier 1 correspond une ligne du fichier 2, à la même position, je me trompe ? Si c'est bien ça, une lecture systématique et en parallèle de chaque handle de fichier est la bonne solution. Sinon, comme le dit lolo, s'il faut attendre sur l'un ou l'autre des fichiers, c'est plus complexe.
    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

  9. #29
    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
    Bonjour,
    Je commence par expliquer le but du script apres de le poster
    On possede deux fichier !
    fichier est sous cette forme :

    x y z
    x y z x

    Fichier2 :
    x' y' z'' x' x'
    x' x' y' z' z'

    telque : x, x', y, y', z, z' sont des mots
    Bien sur les fichier comportent chacun 600 000 ligne.

    L'utilisateur va indiquer 3 parametre à savoir :
    -m : longuer de la séquences des mots contigues du fichier1
    -n : longueur de sééquences des mots contigues du fichier.
    -f : fréquence minimale (nombre d'apparition de la séquence source du fichier1)

    Objectif1 :
    Extraction des séquences sources de taille m et dont la fréquence est supérieure ou egal à f.

    exemple :
    pour m = 2 et f = 2 :
    xy =2
    yz =2
    zx = 1

    ==> Après filtrage des séquence sur la fréquence on aura comme séquences résultantes :
    xy =2
    yz =2.

    Objectif2 :
    Création des règles entre les séquences sources résultantes et les séquences de taille n ayant le même numéro de ligne.
    Ici dans cet exemple on aura :
    xy -> x'y'
    xy -> y'z'
    xy -> z'x'
    xy -> x'x'
    xy -> x'x'
    xy -> z'z'

    yz -> x'y'
    yz -> y'z'
    yz -> z'x'
    yz -> x'x'
    yz -> x'x'
    yz -> z'z'


    Objectif 3

    Pour chaque regle extraire on calcule sa MMI
    de cette facon:
    MMI(xy -> x'y') = (nombre de fois où xy et x'y' se trouvent en meme ligne) divisé par (nombre de n-gram*nombre de m-gram) * log ((nombre de fois où xy et x'y' se trouvent en meme ligne) divisé par (nombre de n-gram*nombre de m-gram) /(nombre de (x,y)*nombre (x'y'))

    C'est compliqué oui cette formule
    j'explique par un exemple

    MMI(xy -> x'y') = 2/(8*12) * log ( (2/(8*12)) / (2*2)

    voilà le code :
    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Data::Dumper;
    use Getopt::Long;
     
    # taille sequence dans le fichier initiale
    my $n = 1;
     
    # taille sequence dans la deuxieme fichier
    my $m = 1;
     
    # frequence
    my $f = 1;
     
    GetOptions ('n=i' => \$n, 'm=i' => \$m, 'f=i' => \$f);
    #calculer nombre de mots dane le fihcier
    print "Charegement de premier Fichier  \n";
    my ($inWords,$inWordsNb,$lignesInWords) = createIndex('Texte_FR.txt',$n);
    #createTempFile('tempFr.txt',$inWords);
    undef $inWords;
    print "Charegement de deuxieme Fichier  \n";
    my ($outWords,$outWordsNb,$lignesOutWords) = createIndex('Texte_EN.txt',$m);
    #createTempFile('tempEn.txt',$outWords);
    undef $outWords;
    my $tailleLigneWords = 0;
     
    print "Calcule de nombre total des regles\n";
    my $nbLignes = scalar(keys %{$lignesInWords});
     
    for (my $key = 1; $key <= $nbLignes; $key++) {
    	print "Traitement de ligne $key / $nbLignes\r";
    	$tailleLigneWords += $lignesOutWords->{$key} * $lignesInWords->{$key};
    }
    print "\nTaille de sequences $tailleLigneWords \n";
    undef $lignesInWords;
    undef $lignesOutWords;
     
    open fileResult, ">result.txt" or die $!;
    print "Construction des regles et calcule de IM\n";
    my $cmp = 1;
    open inFile, "<tempFr.txt" or die $!;
    while (<inFile>) {
    	chomp;
    	print "Traitement de regle $cmp / $nbLignes  \n";
    	$cmp++;
    	my($seqFr, $lignesFr) = split />/;
    	my @lingesInWords = ($lignesFr =~ m/\d+/g);
    	my %regles = ();
    	my $nbLignesInWords = scalar(@lingesInWords);
    	my $cmp2 = 1;
    	if($nbLignesInWords < $f)
    	{
    		next;
    	}
    	foreach my $ligne (@lingesInWords) {
    		my @seqsEn = `grep "'$ligne'" tempEn.txt`;
    		my $nbLignesEnWords = scalar(@lingesInWords);
    		my $cmp3 = 1;
    		foreach my $ligneEn (@seqsEn) {
    			print "\t Traitement de regle $cmp2 / $nbLignesInWords : $cmp3 / $nbLignesEnWords\r";
    			$cmp3++;
    			my($seqEn, $lignesEn) = split />/,$ligneEn ;
    			my @lingesOutWords = ($lignesEn =~ m/\d+/g);
    			my @commenlignes = ();
    			foreach my $value (@lingesInWords) {
    				foreach my $value2 (@lingesOutWords) {
    					if ($value == $value2) {
    						push @commenlignes, $value;
    					}
    				}
    			}
    			if(scalar(@commenlignes) > 0) {
     
    				my $pFr = scalar(@lingesInWords)/$inWordsNb;
    				my $pEn = scalar(@lingesOutWords)/$outWordsNb;
    				my $pCommun = scalar(@commenlignes)/($tailleLigneWords);
    				my $im = sprintf("%.10f", ($pCommun * log2($pCommun/($pFr * $pEn))));
     
    				$regles{"$seqFr > $seqEn"} = $im;
    			}
    		}
    		$cmp2++;
    	}
     
    	foreach my $key (sort { $regles{$b} <=> $regles{$a} } keys %regles) 
    	{
    		print fileResult $key ." > ". $regles{$key} ."\n";
    	}
     
    	delete ($inWords->{$seqFr});
    }
    close fileResult;
    close inFile;
    `rm tempEn.txt tempFr.txt`;
     
    sub log2 {
    	my $n = shift;
    	return log($n)/log(2);
    }
     
    sub createIndex
    {
    	my ($filename, $taille) = @_;
    	open fileSeq, "<$filename" or die $!;
     
    	my %seqs =();
    	my %lignes = ();
    	my $ligne = 1;
    	my $wordsNb = 0;
    	while (<fileSeq>) {
    		chomp;
    		s/^\s+//;
    		s/\s+$//;
    		my @words = split(/ /);
    		$lignes{$ligne} = 0;
    		for(my $i = 0; $i < scalar(@words); $i++) {
     
    			my @key = ();
     
    			for (my $j = $i; $j<($i+$taille); $j++) {
    				if (defined $words[$j]) {
    					push @key, trim($words[$j]);
    				}
    			}
    			if (scalar(@key) == $taille) {
    				$wordsNb++;
    				my $word = lc (join ' ', @key);
    				if (exists $seqs{$word})
    				{
    					push @{ $seqs{$word} }, $ligne;
    				}
    				else
    				{
    					$seqs{$word}[0] = $ligne ;
    				}
    				if ($lignes{$ligne} != 0)
    				{
    					$lignes{$ligne} = $lignes{$ligne} + 1;
    				} 
    				else
    				{
    					$lignes{$ligne} = 1 ;
    				}
    			}
    		}
    		$ligne++;
     
    	}
     
    	close fileSeq;
    	return (\%seqs, $wordsNb, \%lignes);
    }
     
    sub trim($)
    {
    	my $string = shift;
    	$string =~ s/^\s+//;
    	$string =~ s/\s+$//;
    	return $string;
    }
     
    sub createTempFile
    {
    	my($filename,$hash) = @_;
    	print "Begin writing to temp file > $filename\n";
    	my @keys = sort {
    		    scalar(@{$hash->{$b}}) <=> scalar(@{$hash->{$a}})
    	    } keys %{$hash};	
    	open fileSeq, ">$filename" or die $!;	
    	foreach my $key (@keys) {
    		my @linges = @{$hash->{$key}};
    		print fileSeq "$key>('". join("'", @linges) ."')\n";
    	}
    	close fileSeq;
     
    	print "End writing to temp file > $filename\n";
    }
    Le jour est le père du labeur et la nuit est la mère des pensées.

  10. #30
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    4 foreach imbriqués, un index qui peut être vraiment très gros... Ca ne m'étonne pas trop que tu aies besoin de beaucoup de mémoire. Il y a un moment ou si tu fais des calculs complexes, tu vas devoir demander beaucoup de ressources .

    la seule chose qui peut éventuellement te sauver c'est la complexité des mots. Si tu as en tout 100 mots possibles, le nombre de combinaisons de 2 mots est assez énorme! A moins que tu n'aies des propriétés particulières qui permettrait de simplifier certains calculs ?

    je vais essayer de me plonger dans tes scripts un peu dans le détail mais je ne promet vraiment rien.

  11. #31
    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 Trex
    Le jour est le père du labeur et la nuit est la mère des pensées.

  12. #32
    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
    @Étoile: pour l'objectif 2, je suppose que le fichier 1 utilisé est celui filtré par l'objectif 1 ? (et que donc, après filtrage, les lignes du fichier 1 vont correspondre une à une à celles du fichier 2 ?)
    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

  13. #33
    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
    Coucou Philou,
    Oui les séquence du fichier 1 sont celles apres le filtrage :
    On s'en fou apres des fichier si'ils gardent le meme nombre de ligne,
    Juste on associe les séq source et cible qui ont le meme numero de ligne.
    Le jour est le père du labeur et la nuit est la mère des pensées.

  14. #34
    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
    En tout cas, d'après ta description, il ne me semble pas nécessaire de charger la totalité des fichiers d'entrées, mais seulement de les lire "ligne à ligne". Il faudra réaliser la boucle principale sur le fichier 1, filtrer les lignes, puis seulement lire la ligne correspondante dans le 2e fichier.
    Ensuite, à l'aide de la fonction que j'ai donnée plus haut dans ce fil (get_sequence), récupérer tous les m-gram et n-gram pour en calcul le MMI de chaque assemblage de couples m-gram x n-gram.

    Pourrais-tu fournir (une fois de plus ), des fichiers exemples (relativement significatifs) ?
    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

  15. #35
    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
    Citation Envoyé par étoile de mer Voir le message
    Juste on associe les séq source et cible qui ont le meme numero de ligne.
    Quand tu parles de numéro de ligne, tu parles de numéro de ligne "d'origine", pas de numéro de ligne après filtrage ?
    Si oui, il faut modifier ce que j'ai dit précédemment en lisant systématiquement les deux fichiers, et non le fichier 2 uniquement si pas filtré. Ce qui simplifie l'algorithme.
    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. #36
    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
    les deux fixhier sont accessible à travers ce liens : http://dl.free.fr/pRPozuEQ5

    Oui je parle des num de ligne d'origine
    Le jour est le père du labeur et la nuit est la mère des pensées.

  17. #37
    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 le calcul de MMI que tu donnes
    MMI(xy -> x'y') = (nombre de fois où xy et x'y' se trouvent en meme ligne) divisé par (nombre de n-gram*nombre de m-gram) * log ((nombre de fois où xy et x'y' se trouvent en meme ligne) divisé par (nombre de n-gram*nombre de m-gram) /(nombre de (x,y)*nombre (x'y'))
    j'avais compris que des éléments du LOG étaient des sommes sur la totalité des fichiers analysés, mais en lisant ton programme, je n'ai pas l'impression de retrouver cela. Pourrais-tu expliquer dans cette formule ce qui ne dépend que des mots d'une ligne, et ce qui dépend de tout le fichier ?

    Par ailleurs, dans ton programme, tu utilises des fichiers temporaires dont on ne sais pas vraiment comment ils sont construits.
    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. #38
    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
    Bon, en relisant l'exemple, je pense comprendre qu'aucun calcul ne peut être exécuté à chaque ligne, mais qu'il faut enregistrer les informations nécessaire au calcul du MMI pour chaque règle au fur et à mesure de la lecture des fichiers.
    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

  19. #39
    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
    1ere partie de la formule et la plus délicate est MMI( a1 a2 ..an, b1 b2....bm) =
    nombre de (a1 a2 ..an, b1 b2....bm) dans tout le texte divisé par la somme du produit du nombre de ngram et de m-grame de 2 fichier


    Par exemple jai
    bonjour les amis ----- good morning
    bonjour les amis bonjour les ------- good morning
    premiere partie de la formule (avant le log) MMI( bonjour les -> good morning) =

    3 (car on a 3 fois "bonjour les , good morning dans le fichier 1 fois dans la 1ere ligne et 2 fois dans la 2eme ligne) divisé par ((2*1)+(4*1))

    pour determiner le nombre de n-grame dans une ligne c'est = nombre de mot de la ligne -(n-1)
    donc dans la 1ere ligne du fichier 1 : on (2 2-gram * 1 (1-gram) )+(4*1)


    donc on aura 3/((2*1)+(4*1))

    C'est compliqué oui
    Le jour est le père du labeur et la nuit est la mère des pensées.

  20. #40
    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
    Citation Envoyé par étoile de mer Voir le message
    donc dans la 1ere ligne du fichier 1 : on (2 2-gram * 1 (1-gram) )+(4*1)
    Tu veux dire que sur la 1ere ligne, on a
    - 2 2-gram dans le fichier 1
    et
    - 1 2-gram dans le fichier 2
    et que pour la 2e ligne on a :
    - 4 2-gram dans le fichier 1
    et
    - 1 2-gram dans le fichier 2

    donc on a :
    Somme_pour_chaque_ligne(nombre de m_gram * nombre de n_grame)
    soit 2*1 + 4*1
    C'est ça ?

    Sinon, peux-tu faire la même chose pour la partie LOG ?
    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

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

Discussions similaires

  1. Probleme de calcul :S
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2005, 20h06
  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, 14h11
  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, 14h17
  4. Petit probleme de calcul...
    Par Mistoufline dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 17/05/2005, 16h52
  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, 17h46

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