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 PHP Discussion :

[Tableaux] Découper un message et afficher le nombre d'occurence de chaque mot


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut [Tableaux] Découper un message et afficher le nombre d'occurence de chaque mot
    Bonjour,

    Je viens d'avoir à la minute près une petite idée sympatoche pour mon forum.
    Voilà : il s'agit en cliquant en bas d'un message d'ouvrir une fenêtre et d'afficher un tableau permettant de découper tous le message en une liste de mots unique avec à coté le nombre d'occurence de chaque mot du message.
    C'est un truc idiot si vous êtes pas psy, sinon c'est intéressant.

    Exemple :
    Moi aussi je suis tout à fait d'accord tout est bon à prendre.
    Nous donne :
    Tout : 2
    je : 1
    est : 1
    a : 1
    prendre : 1
    etc...

    Pour le classement :nombre d' occurence puis ordre alphabétique.


    Voilà, vu comme ça je sais pas faire , mais peut être que si vous me filez un coup de main, ça peut donner un truc intéressant.


    **edit** bon a priori faut faire un explode (implode) de la chaine et une boucle sur le tableau obtenu non ?
    C'est pas parce que j'ai tort que vous avez raison.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Oui récupérer les mots et les passer dans la fonction substr_count(), avec un tableau de booleen pour eviter d'avoir à compter plusieurs fois une sous-chaine déjà traitée...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Salut Gibigue,

    Je viens de faire ça mais ça affiche rien du tout, pas de message d'erreur ni rien, feuille blanche.

    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
     
    <?php
    $contenu='
    Les dirigeants politiques tchèques ont commencé à discuter pour empêcher un scénario de blocage après les législatives qui ont vu le Parti démocratique civique (ODS, droite libérale) arriver en tête des suffrages, sans toutefois obtenir une majorité suffisante au parlement.
    
    trouver une issue". De leur côté, les communistes (KSCM) ont proposé dimanche matin de former un . , les chrétiens-démocrates et des Verts ont déjà dit plusieurs fois leur refus total de participer à un gouvernement où les communistes seraient représentés.
    ';
    $contenuImplode=explode(" ",$contenu);
     
    for ($i=0; $i<contenuImplode.count; $i++)
    {
        $nb=substr_count($contenu,$contenuImplode[$i]);
        echo $contenuImplode[$i]." apparait ".$nb." fois dans la phrase <br>";
    }
     
    ?>
    Pour le tableau de booléen ça a l'air très bien mais j'ai rien pigé...
    C'est pas parce que j'ai tort que vous avez raison.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Tu as un problème avec ton count()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i=0; $i<count(contenuImplode)-1; $i++)
    Mais un problème persiste. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $text = 'Ceci est un test';
     
    echo substr_count($text, 'est'); // 2

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Je comprend pas là :

    J'ai remplacé ma ligne count par la tienne. Cela n' affiche rien.

    Pour ce que tu me dis après, je pige pas ce que tu veux dire par "mais un problème persiste".
    C'est pas parce que j'ai tort que vous avez raison.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    C'est normal il manque un $ devant la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i=0; $i<count($contenuImplode)-1; $i++)
    La fonction compte le nombre d'occurence d'une chaine même si celle-ci est une sous-chaine d'un mot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $text = 'Ceci est un test';
     
    echo substr_count($text, 'est'); // 2
    Le mot est n'apparait qu'une fois mais la fonction renvoie 2 car est est une sous-chaine de test

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Cela fonctionne, bravo Gibique

    Alors à quoi sert le -1 dans $i<count($contenuImplode)-1, que je comprenne ?

    Et surtout, comment faire pour régler l'autre problème que tu soulèves judicieusement ?
    C'est pas parce que j'ai tort que vous avez raison.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par psychoBob
    Cela fonctionne, bravo Gibique

    Alors à quoi sert le -1 dans $i<count($contenuImplode)-1, que je comprenne ?
    count renvoi le nombre d'elements du tableau, mais les indices des tableaux commencent à 0. Donc -1 pour éviter d'aller au délà du tableau.

    Citation Envoyé par psychoBob
    Et surtout, comment faire pour régler l'autre problème que tu soulèves judicieusement ?
    Je ne sais pas. Ca serait interressant de savoir.

    Sinon j'ai réfléchi à un début de solution. C'est un peu barbare mais les idées sont 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
    <?php
    $ch = '
    Les dirigeants politiques tchèques ont commencé à discuter pour empêcher un scénario de blocage après les législatives qui ont vu le Parti démocratique civique (ODS, droite libérale) arriver en tête des suffrages, sans toutefois obtenir une majorité suffisante au parlement.
    
    trouver une issue". De leur côté, les communistes (KSCM) ont proposé dimanche matin de former un . , les chrétiens-démocrates et des Verts ont déjà dit plusieurs fois leur refus total de participer à un gouvernement où les communistes seraient représentés.
    ';
    echo "<p>$ch</p>";
    $t = explode(" ",$ch);
    $len_ch = count($t)-1;
     
    for($i=0;$i<=$len_ch;$i++){
    if(!$fait[$i]){
    	$fait[$i] = true;
    	$cpt = 1;
    	for($j=$i+1;$j<=$len_ch;$j++)
    		if(!$fait[$j])
    			if(!strcmp($t[$i],$t[$j])){
    				$fait[$j] = true;
    				$cpt++;
    			}
    	echo $t[$i].' apparait '.$cpt.' fois<br>';
    	}
    }
     
    ?>
    Les problèmes posés cette fois-ci : le explode() extrait un peu n'importe quoi. Par exemple si ta chaine contient " . " le script va compter le nombre de points...
    Autre problème bonjour et bonjour. ne sont pas deux chaines identiques.

    C'est pour cela que j'indiquais que les idées étaient là, mais le script est perfectible.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Les problèmes posés cette fois-ci : le explode() extrait un peu n'importe quoi. Par exemple si ta chaine contient " . " le script va compter le nombre de points...
    Autre problème bonjour et bonjour. ne sont pas deux chaines identiques.
    On peut faire un str_replace() pour remplacer tous les ;,.?!_-' par des espaces par exemples. Et ensuite on traite la chaine. On peut faire pareil pour les déterminants peut être. Et pour le problème des majuscules, tout passer par strtolower.

    Je peux pas essayer le code là tout de suite, je m'y remet demain. Si cela fonctionne en l'état, le script reste complexe (au moins pour ma modeste personne) car il s'agit ensuite d'afficher la liste des mots par ordre décroissant d'occurence et même mieux par ordre alphabétique pour les mots ayant le même nombre d'occurence.

    **edit**
    Cela serait chouette si tu pouvais glisser quelques lignes de commentaire dans ton code Gibique, parce que j'y pige pas lourd comme ça. Alors pour essayer de bosser dessus ou pour l'expliquer à des collègues...
    C'est pas parce que j'ai tort que vous avez raison.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par psychoBob
    On peut faire un str_replace() pour remplacer tous les ;,.?!_-' par des espaces par exemples. Et ensuite on traite la chaine. On peut faire pareil pour les déterminants peut être. Et pour le problème des majuscules, tout passer par strtolower.
    Oui par des esspaces ou rien du tout même, ça evitera d'avoir à faire un trim() sur chaque mot. Et pour le strtolower c'est une bonne idée.

    Citation Envoyé par psychoBob
    Je peux pas essayer le code là tout de suite, je m'y remet demain. Si cela fonctionne en l'état, le script reste complexe (au moins pour ma modeste personne) car il s'agit ensuite d'afficher la liste des mots par ordre décroissant d'occurence et même mieux par ordre alphabétique pour les mots ayant le même nombre d'occurence.
    Ce n'est pas un gros problème. Il suffit de faire un tableau associatif avec le nombre d'apparition et d'uiliser la fonction sort() ou ses dérivées
    exemple de tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $str_stats['les'] = 1
    $str_stats['dirigeants'] = 1
    $str_stats['politiques'] = 1
    ....
    Citation Envoyé par psychoBob
    **edit**
    Cela serait chouette si tu pouvais glisser quelques lignes de commentaire dans ton code Gibique, parce que j'y pige pas lourd comme ça. Alors pour essayer de bosser dessus ou pour l'expliquer à des collègues...
    La méthode:
    Je prends le premier mot. Je le marque avec un booléen (fait)
    Je le compare avec tous les mots qui suivent (d'où le j=i+1)
    Quand je rencontre un mot identique, je marque ce j-ème mot dans mon tableau fait[] (ça m'evitera d'avoir à le traiter dans le futur) et j'incrémente le compteur qui me donne le nombre d'occurences.
    Et on recommence la même opération avec le deuxième mot, en vérifiant que celui-ci n'a pas été traité, sinon je passe au 3ème mot, ainsi de suite...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bon alors pendant que j'essaie de m'en sortir avec la fonction sort(), il y a quand même ce problème là :

    test est test est

    Cela va nous donner
    test 1
    est 1
    test 1
    est 1

    Pour être utilisable, il faut :
    test 1
    est 1

    Si un développeur passe par là hein...

    Resterait plus qu'à utiliser ensuite sort() ou autre pour trier le tout...
    C'est pas parce que j'ai tort que vous avez raison.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par psychoBob
    Bon alors pendant que j'essaie de m'en sortir avec la fonction sort(), il y a quand même ce problème là :

    test est test est

    Cela va nous donner
    test 1
    est 1
    test 1
    est 1

    Pour être utilisable, il faut :
    test 1
    est 1
    Le script que j'ai posté renvoie bien
    Il a juste un "netoyage" des chaines à faire. (suppression de la ponctuation et passage en minuscules)

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Salut Gibique,
    Tu m'as collé un doute alors j'ai réessayé :

    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
    <?php
    $ch = '
    test est test est
    ';
    echo "<p>$ch</p>";
    $t = explode(" ",$ch);
    $len_ch = count($t)-1;
     
    for($i=0;$i<=$len_ch;$i++){
    if(!$fait[$i]){
    	$fait[$i] = true;
    	$cpt = 1;
    	for($j=$i+1;$j<=$len_ch;$j++)
    		if(!$fait[$j])
    			if(!strcmp($t[$i],$t[$j])){
    				$fait[$j] = true;
    				$cpt++;
    			}
    	echo $t[$i].' apparait '.$cpt.' fois<br>';
    	}
    }
     
    ?>
    C'est texto ton code, j'ai juste remplacé le texte à tester par test est test est.

    Bein, j'ai bien essuyé mes lunettes et sur l'écran s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    test est test est
     
    test apparait 1 fois
    est apparait 1 fois
    test apparait 1 fois
    est apparait 1 fois
    C'est pas parce que j'ai tort que vous avez raison.

  14. #14
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Je comprends pas pourquoi tu utilises pas la fonction : str_word_count
    Cette magnifique fonction existe alors testons la lol

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Non mais ça va pas ton truc Kerod, je veux pas compter le nombre de mots dans la chaine. Je veux compter le nombre d'utilisation de chaque mot de la chaine. Ou alors tu suggères de l'utiliser dans le script de Gibique ? Bah alors je vois pas du tout comment...
    C'est pas parce que j'ai tort que vous avez raison.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par psychoBob
    Salut Gibique,
    Tu m'as collé un doute alors j'ai réessayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    test est test est
     
    test apparait 1 fois
    est apparait 1 fois
    test apparait 1 fois
    est apparait 1 fois
    As-tu forcé le rafraichissement de ta page (Shift + F5) ?
    J'ai mis en ligne le code http://hp.tribe.free.fr/

    Et pour str_word_count si j'ai bien compris le rôle de la fonction est de compter le nombre de mots et non de donner le nombre d'occurence de chaque mot. Ou j'ai loupé un truc ?

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Je viens même de copier coller ce script (toujours le même) sur une toute nouvelle page :

    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
    <?php
    $ch = '
    test est test est
    ';
    echo "<p>$ch</p>";
    $t = explode(" ",$ch);
    $len_ch = count($t)-1;
     
    for($i=0;$i<=$len_ch;$i++){
    if(!$fait[$i]){
    	$fait[$i] = true;
    	$cpt = 1;
    	for($j=$i+1;$j<=$len_ch;$j++)
    		if(!$fait[$j])
    			if(!strcmp($t[$i],$t[$j])){
    				$fait[$j] = true;
    				$cpt++;
    			}
    	echo $t[$i].' apparait '.$cpt.' fois<br>';
    	}
    }
     
    ?>
    M'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    test est test est
     
    test apparait 1 fois
    est apparait 1 fois
    test apparait 1 fois
    est apparait 1 fois
    C'est pas parce que j'ai tort que vous avez raison.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ah oui c'est bon.

    Bah le script que tu viens de mettre en ligne est pas celui que tu as donné sur le forum c'est pour ça.

    Je regarde les différences et j'édite ce post, deux minutes.

    **edit**

    Bon je vois pas la différence, passons sur ce phénomène paranormal, ça fonctionne presque. BRAVO GIBIQUE et MERCI, on applaudit.

    Comme je suis d'humeur estivale, je vous cache pas que si quelqu'un se sent le courage de classer le résultat par nombre d'occurence et ordre alphabétique, bein je serais un faignant heureux.
    Oui j'abuse je sais.

    **edit2**
    On doit pouvoir en faire des choses sympa avec ce petit script : relier chaque mot à sa famille dans une base de donnée, pour voir les thématiques plus ou moins inconsciente et préférées des posteurs par exemple.
    C'est pas parce que j'ai tort que vous avez raison.

  19. #19
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Autant pour moi alors pour la fonction...

    Mais pour ce qui est du script j'avais une autre solution
    Mais bon ...

    edit : et justement ca prenait par ordre alphabétique . Je peux etre quand mettre mon idée sur papier php et voir ce que ca donne

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Bah hésites pas Kerod hein. Surtout que le script est pas fini là.
    C'est pas parce que j'ai tort que vous avez raison.

Discussions similaires

  1. Affiche le nombre de lignes de chaque table
    Par Fabien Celaia dans le forum Contribuez
    Réponses: 1
    Dernier message: 22/08/2014, 14h53
  2. Réponses: 2
    Dernier message: 22/12/2009, 18h08
  3. [TPW] Afficher le nombre d'occurences de caractère
    Par miliassouma6600 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 16/05/2009, 12h06
  4. Réponses: 5
    Dernier message: 17/02/2008, 12h32
  5. Réponses: 6
    Dernier message: 20/02/2006, 22h13

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