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

EDI, CMS, Outils, Scripts et API PHP Discussion :

compter le nombres d'occurence dans des chaines


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre éclairé Avatar de Lekno
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    883
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 883
    Points : 761
    Points
    761
    Par défaut compter le nombres d'occurence dans des chaines
    Bonjour à tous, je souhaite compter le nombre de fois qu'une chaine(mot) apparait dans une autre chaine(phrase).

    Aussi actuellement je procède comme ci-dessous :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $data = array("je suis un titre 1"," pourquoi pas ce soustitre 2","on peut en faire un troisieme");
    foreach($data as $value){
    		$split_titre	=	explode(' ', $value);
    		$array_titre	=	array_merge($array_titre, $split_titre);
    	}
    	//compte le nombres d'exemplaire de chaine
    	$occurence = array_count_values($array_titre);

    Le soucis est que le array_count_values ne prend pas en compte la "casse". Je veux dire par la que par exemple :

    Aujourd'hui et jour
    Ainsi il va me trouver jour x2 alors que le premier "jour" n'est pas du tout semble à "aujourd'hui" savez vous comment régler ce soucis ?

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Ce n'est pas une histoire de casse. La casse c'est majuscules-minuscules.

    Ce qu'il te faut c'est une regexp avec le séparateur \b. Ça veut dire word boundary, en français « limite de mots ». Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regexp = '/\bjour\b/i';
    Utilise cette regexp avec la fonction preg_match_all.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre éclairé Avatar de Lekno
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    883
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 883
    Points : 761
    Points
    761
    Par défaut
    Meric pour ta réponse, je n'ai effectivement pas utilisé le bon therme

    Cependant je ne vois pas du tout comment exploiter array_count_values via la solution que tu m'indiques ci-dessus !

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    regarde le lien que Watilin a mis dans son message, ça s'utilise comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $texte = "Aujourd'hui n'est pas un jour comme les autres jours. Mais quand même un bon jour !";
     
    $motRegex = preg_quote("jour", "#");
    $expreg = "#\\b$motRegex\\b#";
    preg_match_all($expreg, $texte, $resultats);
     
    var_dump($resultats);

  5. #5
    Membre éclairé Avatar de Lekno
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    883
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 883
    Points : 761
    Points
    761
    Par défaut
    Merci pour vos retours !

    j'en suis arrivé à ceci, une sacrée usine à gaz Pensez vous qu'il soit possible de l'optimiser ?

    Code php : 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
     
    $data = array("Voila une premiere phrase", "Puis une deuxieme phrase", "On peut en cosntruire une troisieme", "Testons avec une quatrieme", " Pourquoi pas une cinquieme");
     
    $array_titre	=	array();
    	$split_titre	=	array();
    	$texte	=	"";
    	foreach($data as $key => $value){
    		$split_titre	=	explode(' ', $value);
    		$array_titre	=	array_merge($array_titre, $split_titre);
    		foreach($split_titre as $element){
    			$texte	=	$texte." ".$element." ";
     
    		}	
    	}
    	foreach($array_titre as $value){
    		$motRegex = preg_quote($value, "#");
    		$expreg = "#\\b".$motRegex."\\b#";
    		preg_match_all($expreg, $texte, $resultats);
    		$nb_occurence = sizeof($resultats[0]);
     
    		if(isset($resultats[0][0])){
    			$mot_en_cours	=	$resultats[0][0];
    			echo $mot_en_cours." apparait : ".$nb_occurence."<BR />";		
    		}	
    	}

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    pour la 1re boucle qui cherche les mots, tu peux la remplacer par ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $texte = implode(" ", $data);
    $array_titre = explode(" ", $texte);

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Fait quand même attention, les regex sont gourmands en ressource, alors dans une boucle...
    Evites dans la mesure du possible d'utiliser des alias, ça rend le code moins portable et certains allias peuvent être supprimés dans le futur... donc autant utiliser count plutôt que sizeof.

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je ne suis pas certain du but poursuivi, moi je ferais ça:
    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
    <meta charset="UTF-8"/><pre><?php
     
    $sentences = [
    	'Faria le reçut assis, évita tout geste compromettant, et parvint à cacher au gouverneur la paralysie qui avait déjà frappé de mort la moitié de sa personne.',
    	'Sa crainte était que le gouverneur, touché de pitié pour lui, ne le voulût mettre dans une prison plus saine et ne le séparât ainsi de son jeune compagnon; mais il n’en fut heureusement pas ainsi, et le gouverneur se retira convaincu que son pauvre fou, pour le quel il ressentait au fond du cœur une certaine affection, n’était atteint que d’une indisposition légère.',
    	'Pendant ce temps, Edmond, assis sur son lit et la tête dans ses mains, essayait de rassembler ses pensées; tout était si raisonné, si grand et si logique dans Faria depuis qu’il le connaissait, qu’il ne pouvait comprendre cette suprême sagesse sur tous les points alliée à la déraison sur un seul: était-ce Faria qui se trompait sur son trésor, était-ce tout le monde qui se trompait sur Faria?',
    	'Dantès resta chez lui toute la journée, n’osant retourner chez son ami.',
    	'Il essayait de reculer ainsi le moment où il acquerrait la certitude que l’abbé était fou.',
    	'Cette conviction devait être effroyable pour lui.',
    	'Mais vers le soir, après l’heure de la visite ordinaire, Faria, ne voyant pas revenir le jeune homme, essaya de franchir l’espace qui le séparait de lui.',
    	'Edmond frissonna en entendant les efforts douloureux que faisait le vieillard pour se traîner : sa jambe était inerte, et il ne pouvait plus s’aider de son bras. Edmond fut obligé de l’attirer à lui, car il n’eût jamais pu sortir seul par l’étroite ouverture qui donnait dans la chambre de Dantès.',
    	'« Me voici impitoyablement acharné à votre poursuite, dit-il avec un sourire rayonnant de bienveillance.',
    	'Vous aviez cru pouvoir échapper à ma magnificence, mais il n’en sera rien.',
    	'Écoutez donc. »',
    	'Edmond vit qu’il ne pouvait reculer; il fit asseoir le vieillard sur son lit, et se plaça près de lui sur son escabeau.',
    	'« Vous savez, dit l’abbé, que j’étais le secrétaire, le familier, l’ami du cardinal Spada, le dernier des princes de ce nom.',
    	'Je dois à ce digne seigneur tout ce que j’ai goûté de bonheur en cette vie.',
    	'Il n’était pas riche bien que les richesses de sa famille fussent proverbiales et que j’aie entendu dire souvent: Riche comme un Spada.',
    	'Mais lui, comme le bruit public, vivait sur cette réputation d’opulence.',
    	'Son palais fut mon paradis.',
    	'J’instruisis ses neveux, qui sont morts, et lorsqu’il fut seul au monde, je lui rendis, par un dévouement absolu à ses volontés, tout ce qu’il avait fait pour moi depuis dix ans.'
     
    ];
     
    $res = [];
     
    // on construit un tableau "brut" qui associe à chaque mots différents  une liste d'index de phrase
    foreach ($sentences as $k => $sentence) {
        // la classe \p{Xan} contient tous les caractères unicode alphanumériques, \P{Xan} est son contraire
        $words = preg_split('~\P{Xan}+~u', mb_strtolower($sentence, 'UTF-8'), -1, PREG_SPLIT_NO_EMPTY);
     
        // array_fill_keys se charge d'écrabouiller au passage tous les mots dupliqués d'une même phrase
        $res = array_merge_recursive($res, array_fill_keys($words, $k));
    }
     
    // un fois qu'on a ce tableau brut, on peut en faire ce que l'on veut.
     
    // tableau des mots avec plusieurs occurrences
    $res = array_filter($res, function ($i) { return count($i)>1; });
     
    // tableau mots=>nombres d'occurrences trié par nombres d'occurrences
    $res = array_map('count', $res);
    arsort($res);
     
    // tableau des mots de plus de deux lettres
    foreach($res as $k=>$v) {
        if (mb_strlen($k, 'UTF-8') < 3)
            unset($res[$k]);	
    }
     
    print_r($res);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Membre éclairé Avatar de Lekno
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    883
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 883
    Points : 761
    Points
    761
    Par défaut
    Merci pour vos retours toutes les infos sont bonnes à prendre, CosmoKnacki effectivement ton code est bien plus léger pour le même résultat

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter le nombre d'occurences d'une chaine dans un texte
    Par tim91700 dans le forum Débuter
    Réponses: 5
    Dernier message: 02/04/2011, 16h27
  2. Compter le nombre d'occurence dans un tableau
    Par titou250 dans le forum Excel
    Réponses: 2
    Dernier message: 08/01/2008, 16h25
  3. Compter le nombre d'occurence dans une chaine
    Par shirya dans le forum Langage
    Réponses: 2
    Dernier message: 16/10/2007, 20h39
  4. Compter le nombre de caractere dans une chaine
    Par jmjmjm dans le forum C++
    Réponses: 13
    Dernier message: 19/11/2006, 11h37
  5. Nombre d'occurence dans la chaine
    Par Anduriel dans le forum Requêtes
    Réponses: 5
    Dernier message: 27/08/2006, 17h02

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