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 :

Compter erreurs même si mot manquant


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Femme Profil pro
    Doctorante
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut Compter erreurs même si mot manquant
    Bonjour tout le monde
    J'ai un projet informatique à faire pour la fac et je suis bloquée à un endroit

    Je vous explique brièvement ce que je dois faire
    J'ai créé 2 fichiers texte. L'un est le support d'une dictée
    Par exemple: Les oiseaux chantent dans le ciel.

    L'autre est la dictée d'un élève
    Par exemple: Les oiseau chante dans le ciel

    Je dois avec ça créer un programme pour compter les nmbre de fautes.
    Jusqu'ici pas de problème, je fais une table de hachage de ce type
    les --> les
    oiseaux -->oiseau
    chantent --> chante
    dans --> dans
    le --> le
    ciel --> ciel

    Si la valeur est différente de la clé alors le mot est compté faux

    Le problème c'est s'il manque un mot dans la dictée de l'élève ou s'il en ajoute un ou s'il inverse 2 mots.
    Ma table de hachage est décalée
    Ex: les oiseau chante le ciel
    les --> les
    oiseaux -->oiseau
    chantent --> chante
    dans --> le
    le --> ciel
    ciel -->

    Comment puis-je dire quel mot il manque, ejouté, ou inversé et comment compter le nombre de fautes malgré ça.
    Dois-je changer mon système de table de hachage ou y a-t-il une petite manip à faire

    Merci d'avance pour votre aide
    En espérant que je comprenne vos solutions (je suis un peu débutante)

    Lili

    PS: j'utilise Perl sur Windows et je lance les sripts sur l'invite de commandes

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est un problème d'algorithmique, et pas si simple avec ça... Et qu'est ce que tu fais s'il y a trop de mot (mot incorrectement coupé en deux, oubli d'un tiret...) ?
    Si c'est pour la fac et que tu as des instructions précises, transmets les nous, sinon il faut que tu décides par toi-même ce que ton logiciel doît être capable de faire et à partir de quel moment il jette l'éponge et classe la copie comme "irrécupérable" !
    Déjà une première étape serait de vérifier si le nombre de mots correspond entre la dictée et la copie (c'est complètement insuffisant vu qu'il peut y avoir des fautes et contrefautes rattrapant le coup, mais c'est déjà un premier pas), puis d'envisager l'utilisation d'un module comme Text::Levenshtein ou Text::WagnerFischer qui permettent d'évaluer la distance entre deux mots de façon à déterminer où le mot est manquant.

    --
    Jedaï

  3. #3
    Membre à l'essai
    Femme Profil pro
    Doctorante
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    J'avais pensé compter le nombre de mots et s'ils n'étaient pas égaux j'arrêtais le programme mais la prof m'a dit que c'était trop simple.

    Je pense que je vais déjà me limiter à ce qu'elle m'a demandé c'est à dire s'il manque un mot ou si on en ajoute un. Et donc c'est là que je bloque!

    Sinon Text::Levenshtein et Text::WagnerFischer je ne connais pas du tout. mais si tu peux m'indiquer comment ca marche où m'orienter (si c'est trop long) vers des articles qui en parlent

    Pfff... pas évident tout ça, et je sui persuadé que c'est pas tellement difficile si elle me demande de le faire.

    Merci pour ton aide

    Lili

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par petitange_lili
    Sinon Text::Levenshtein et Text::WagnerFischer je ne connais pas du tout. mais si tu peux m'indiquer comment ca marche où m'orienter (si c'est trop long) vers des articles qui en parlent
    Ce serait une bonne idée de faire un tour du côté de la FAQ perl, surtout du côté des modules. La documentation des modules devrait te suffire à les utiliser.

    Pfff... pas évident tout ça, et je sui persuadé que c'est pas tellement difficile si elle me demande de le faire.
    Tout dépend de ton niveau en algorithmique et en Perl... Néanmoins je ne qualifierais pas cela de "simple" (si tu essaies vraiment de faire un truc qui marche dans la plupart des cas).

    --
    Jedaï

  5. #5
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Humm voila une ébauche j'utilise l'algorithme de levensthein mais le mieux serai d'utiliser l'algorithme de damerau-levensthein.

    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
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use Levensthein;
    use Data::Dumper;
     
    my $leven = new Levensthein;
     
    my %matrice;
    my $compteur_bon = 0;
    my $compteur_fautes = 0;
    my $motsenplus = 0;
     
    my @dicte = qw( Les oiseau chante dans le ciel );
    my @eleve = qw( Les oiseaux chantent dans le ciel maman joue au tennis );
     
    # On compte les mots en plus
    $motsenplus = scalar @eleve - scalar @dicte;
     
     
    # Comparaison des termes
    foreach my $mot (@dicte)
    {
      foreach my $mot1 (@eleve )
      {
         # Calcul de la distance de levensthein
         my $distance = $leven->Levensthein(lc $mot, lc $mot1);
         # Ok si la distance sémantique est de 0
         if ( $distance == 0 ) {
           # pas de faute :)
           $compteur_bon++;
           $matrice{$mot1} = "OK";              
         } else {
           # encore une faute
           $compteur_fautes++ if not exists $matrice{$mot1};
           $matrice{$mot1} = "Faux ou en +" if not exists $matrice{$mot1};
         }
      }
    }
     
    ### affichage des résultats
     
    print "Il y'a $motsenplus mot(s) en plus dans le texte de l'élève\n";
    print "Il y'a $compteur_fautes faute(s) dans la dictee de l'élève\n";
    print "Il y'a $compteur_bon mot(s) bien écrit\n";
    print "Liste des mots\n";
     
    foreach my $key ( keys %matrice )
    {
      print "$key  =>\t$matrice{$key}\n";
    }
    Le programme renvoie :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Il y a 4 mot(s) en plus dans le texte de l'élève
    Il y a 9 faute(s) dans la dictee de l'élève
    Il y a 4 mot(s) bien écrit
    Liste des mots
    joue  =>	Faux ou en +
    maman  =>	Faux ou en +
    le  =>	OK
    Les  =>	OK
    dans  =>	OK
    au  =>	Faux ou en +
    ciel  =>	OK
    chantent  =>	Faux ou en +
    tennis  =>	Faux ou en +
    oiseaux  =>	Faux ou en +
    Vala vala
    Fichiers attachés Fichiers attachés
    Everybody have in their the potential to be their own god : Marilyn Manson

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Mais tu ne résouds pas vraiment le problème exposé au premier message : s'il y a un mot manquant dans le corps de la copie, ton programme marquera toute la suite comme fausse, même si elle ne comporte pas d'erreur...

    Mon idée était de tenter de faire correspondre "au mieux" la copie et la dictée avec une adaptation de l'algorithme de "plus longue sous-séquence commune" utilisant Levensthein ou équivalent.

    --
    Jedaï

  7. #7
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Une petite correction

    ajouter a la fin des boucles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ### Correction du nombre de fautes
     
    $compteur_fautes -= scalar @eleve + 1;
    $compteur_fautes += $motsenplus;
    Everybody have in their the potential to be their own god : Marilyn Manson

  8. #8
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par Jedai
    Mais tu ne résouds pas vraiment le problème exposé au premier message : s'il y a un mot manquant dans le corps de la copie, ton programme marquera toute la suite comme fausse, même si elle ne comporte pas d'erreur...

    Mon idée était de tenter de faire correspondre "au mieux" la copie et la dictée avec une adaptation de l'algorithme de "plus longue sous-séquence commune" utilisant Levensthein ou équivalent.

    --
    Jedaï

    Ah oui effectivement , ce soir je me pencherai plus avant sur ce problème sa vas être fun
    Everybody have in their the potential to be their own god : Marilyn Manson

  9. #9
    Membre à l'essai
    Femme Profil pro
    Doctorante
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup déjà pour vos pistes et pour vous y pencher autant!
    Je vais essayer d'en toucher un mot tout de même à ma prof car si vous dites que c'est pas évident! En plus on niveau s'arrête aux boucles, tableaux, fichiers, table de hachage, et quelques expressions régulières. Je suis une linguiste pas une programmatrice, même si le but c'est de lier les deux! Mais bon jpeux pas l'inventer si on me l'explique pas (bon je me calme!)

    Le problème c'est qu'il ne me suffit pas d'avoir les mots en plus ou en moins car je dois ensuite créer des fichiers avec les mots à réviser, c'est à dire la liste des mots faux avec leur correction

    C'est déjà super bien ce que vous m'avez fait et je vais me pencher sur la théorie Levenshtein

    Merci encore et si vous avez d'autres pistes c'est pas moi qui vais vous dire de les garder pour vous!

  10. #10
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    OK je vois regarde du coté des lemmantiseur , en perl plusieur modules font sa très bien regarde de ce coté

    http://search.cpan.org/search?query=stemmer&mode=all

    les lemmantiseur sont utiliser pour rechercher les formes de bases des mots par exemple manger

    par exemple ont pourrais imaginer générer une liste de mots pour les mots faux exemple

    meison faire un programme qui génererai une liste de mot sonmei maison etc... puis coder derrière un système qui compare au niveau prononciation et distance sémantique qu'elle est la correction la plus plausible.

    Il doit surement y avoir des modules qui font sa très bien sur CPAN

    Je trouve que c'est un exercice très complexe pour quelqu'un qui qui ne fait pas de programation a mon avis la prof a fondue un fusible


    On te filera un coup de main

    Tu doit rendre ton code pour quand ? me dit pas pour mercredi
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par scaleo
    meison faire un programme qui génererai une liste de mot sonmei maison etc... puis coder derrière un système qui compare au niveau prononciation et distance sémantique qu'elle est la correction la plus plausible.
    Oui, comparer au niveau prononciation (avec Text::Soundex par exemple) est probablement un meilleur choix que d'utiliser Text::Levensthein vu qu'on cherche à trouver les mots correspondants malgré d'éventuelles fautes.

    --
    Jedaï

  12. #12
    Membre à l'essai
    Femme Profil pro
    Doctorante
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Le projet est à rendre je pense en juin.

    Si je comprends bien votre raisonnement dans un premier temps on pourrait comparer les mots dans leur prononciation. Si ca correspond alors là on regarde l'orthographe! C ca? Et si ca correspond pas comment on fait pour comparer l'orthographe des mots qui sont quand même dans la dictée

    J'ai eu une idée. Je vais essayer de la tester et je vous en parle pour voir si je suis bloquée ou pas

    Merci encore vous êtes les meilleurs

  13. #13
    Membre à l'essai
    Femme Profil pro
    Doctorante
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Voilà ce que ma prof me conseille de faire

    Jen'ai pas de solution miracle .. une piste est de regarder si le mot est faux si un
    certain % de lettres sont communes au mot avec lequel tu compares .. si ce n'est pas
    le cas .. c'est que tu es surement dans le cas d'oubli de mots donc tu peux faire
    le meme test avec le mot d'apres .. si egalite ou presque tu avais peut etre un mot
    en moins et donc tu 'rattrapes ' le retard

    Génial comme solution vous trouvez pas?!
    Et comment je rattrape le retard?!

    Bon c déjà ca elle me donne une piste
    Merci madame

  14. #14
    Membre à l'essai
    Femme Profil pro
    Doctorante
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    J'ai jamais essayé de mettre un code alors j'espère que ca va marcher. Sinon pouvez vous me dire comment on fait

    En clair, ce que j'ai fait c'est que je compte le pourcentage de chance qu'un mot soit le même s'il est écrit différemment
    Quand le pourcentage est faible c'est qu'il manque un mot (en tout cas ici)
    Il me dit le mot manquant et je rajoute un mot fictif "ajout" dans mont tab2 pour que ca décale les autres mots.

    Les mots mal orthographiés sont après mis dans une table de hachage avec leur mot cible

    Mais ca ne marche que s'il manque un mot. Si y a un mot en trop le décalage n'est pas approprié, il faudrait l'enlever. Mais comment décaler dans ce cas là?

    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
     
     
    #!/usr/bin/perl
     
     
    @tab1=qw(les oiseaux chantent sur les arbres pleins de fruits);
    @tab2=qw(les oiseau chante les arbres plein de fruits);
     
    $i=0;
    foreach $elt(@tab1){
    	if($elt ne $tab2[$i]){
    		print("$elt $tab2[$i]\n");
    		$compt=0;
    		$l1=length($elt);
    		$l2=length($tab2[$i]);
    		for($j=0;$j<=$l1;$j=$j+1){
    			$c1=substr($elt,$j,1);
    			$c2=substr($tab2[$i],$j,1);
    			if($c1 eq $c2){
    				$compt=$compt+1;
    			}
    		}
    		if($l1>$l2){
    			$res=$compt/$l1;
     
    		}
    		else{
    			$res=$compt/$l2;
    		}
    		if($res<0.50){
    			$ajout="ajout";
    			unshift(@tab2,$ajout);
    			print("il manque un mot : $elt\n");
    		}
    		else{
    			$motfaux{$elt}=$tab2[$i];
    		}
    	}
    	else{
    		print("$elt $tab2[$i]\n");
    	}
    	$i=$i+1;
     
    }
     
    foreach $val(keys %motfaux){
    	print("$val $motfaux{$val}\n");
    }

  15. #15
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par petitange_lili
    J'ai jamais essayé de mettre un code alors j'espère que ca va marcher. Sinon pouvez vous me dire comment on fait

    En clair, ce que j'ai fait c'est que je compte le pourcentage de chance qu'un mot soit le même s'il est écrit différemment
    Quand le pourcentage est faible c'est qu'il manque un mot (en tout cas ici)
    Il me dit le mot manquant et je rajoute un mot fictif "ajout" dans mont tab2 pour que ca décale les autres mots.

    Les mots mal orthographiés sont après mis dans une table de hachage avec leur mot cible

    Mais ca ne marche que s'il manque un mot. Si y a un mot en trop le décalage n'est pas approprié, il faudrait l'enlever. Mais comment décaler dans ce cas là?

    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
     
     
    #!/usr/bin/perl
     
     
    @tab1=qw(les oiseaux chantent sur les arbres pleins de fruits);
    @tab2=qw(les oiseau chante les arbres plein de fruits);
     
    $i=0;
    foreach $elt(@tab1){
    	if($elt ne $tab2[$i]){
    		print("$elt $tab2[$i]\n");
    		$compt=0;
    		$l1=length($elt);
    		$l2=length($tab2[$i]);
    		for($j=0;$j<=$l1;$j=$j+1){
    			$c1=substr($elt,$j,1);
    			$c2=substr($tab2[$i],$j,1);
    			if($c1 eq $c2){
    				$compt=$compt+1;
    			}
    		}
    		if($l1>$l2){
    			$res=$compt/$l1;
     
    		}
    		else{
    			$res=$compt/$l2;
    		}
    		if($res<0.50){
    			$ajout="ajout";
    			unshift(@tab2,$ajout);
    			print("il manque un mot : $elt\n");
    		}
    		else{
    			$motfaux{$elt}=$tab2[$i];
    		}
    	}
    	else{
    		print("$elt $tab2[$i]\n");
    	}
    	$i=$i+1;
     
    }
     
    foreach $val(keys %motfaux){
    	print("$val $motfaux{$val}\n");
    }

    Ton programme comporte beacoup d'erreurs les variables ne sont pas déclaré, tu n'utilise pas non plus use strict; mais bon vue que la progra c'est pas ton domaine a la base c'est pas grave.
    Everybody have in their the potential to be their own god : Marilyn Manson

Discussions similaires

  1. Erreur, même dans un try-catch
    Par TheCool dans le forum C#
    Réponses: 3
    Dernier message: 06/03/2008, 19h26
  2. Réponses: 1
    Dernier message: 07/12/2007, 16h10
  3. Réponses: 5
    Dernier message: 14/09/2007, 22h50
  4. Réponses: 17
    Dernier message: 28/05/2007, 17h55
  5. Erreur : corps de méthode manquant.
    Par J0r_x dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2007, 22h15

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