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

PHP & Base de données Discussion :

Extraire les 5 mots les plus cités d'un texte [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut Extraire les 5 mots les plus cités d'un texte
    Bonjour,

    J'ai un texte avec un peu près 10'000 caractères, je souhaite afficher le top des 5 mots les plus cités dans ce texte (je ne connais pas les 5 mots..)

    L'unique condition est que les mots doivent faire au minimum 4 caractères pour être classé

    du genre

    1)....
    2)...
    3)...
    4)...
    5)..

    Mon texte vient de ma bd (mysql) et je ne sais pas comment m'y prendre pour effectuer une comparaison..

    Avez-vous une idée ?

    Merci d'avance
    Yule

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie ça. Tu passes ton texte à la fonction toto.

    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
     
    <?php
    function toto($texte,$nbrPostes=5) {
     //--- Si on passe une valeur incorrecte
     $nbrPostes = $nbrPostes <= 0 ? 5 : $nbrPostes;
     
     //--- Expression régulière
     // $pattern = '/(\w{5,})/m'; => ne prend pas les accents
     $caractères = "[a-z0-9àáâãäåçèéêëìíîïðòóôõöùúûüýÿA-ZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÒÓÔÕÖÙÚÛÜÝŸ]";
     $pattern    = "/($caractères{5,})/m";
     preg_match_all($pattern,$texte,$out);
     
     //--- passe tout en minuscules
     $out2       = array_map('strtolower', $out[0]);
     
     //--- crée un tableau avec le nombre d'occurrences par mot
     $array      = array();
     foreach($out2 as $value) {
      $array[$value] = !isset($array[$value]) ? 1 : $array[$value] +1;
     }
     
     //--- trie le tableau par ordre décroissant
     arsort($array);
     
     //--- tableau en sortie
     return array_slice(array_keys($array),0, $nbrPostes, true);
    }
    $fichier = file_get_contents('lorem.txt');
    $array= toto($fichier);
    var_dump($array);
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #3
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    Extra merci bien !!! Etre limité en prog n'est pas facile pour résoudre des pb..

    J'ai donc essayé avec le fichier lorem.txt ou j'ai collé mon texte et également la fonction, le résultat est là ! Par contre je peine à extraire les infos

    En rajoutant ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $array2= toto($data); // $data est mon texte
    var_dump($array2);
    ça m'affiche ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(5) { [0]=> string(5) "tissot" [1]=> string(6) "omega" [2]=> string(5) "rolex" [3]=> string(10) "longines" [4]=> string(7) "swatch" }
    Comment faire pour extraire chacun des 5 termes séparément et proprement

    J'ai fais ceci qui fonctionne, mais ça me parait pas très propre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $keys0 = $array2[0];
    $keys1 = $array2[1];
    $keys2 = $array2[2];
    $keys3 = $array2[3];
    $keys4 = $array2[4];
     
    echo "1. $keys0  <br>2. $keys1 <br>3. $keys2 <br>4. $keys3 <br>5. $keys4 ";
    me donne bien

    1. tissot
    2. omega
    3. rolex
    4. longines
    5. swatch

    D'avance merci
    Yule

  4. #4
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Si tu n'as toujours que 5 postes à afficher ton code en vaut un autre puisqu'il fait ce que tu veux qu'il fasse.
    Si tu veux avoir plus ou moins de 5 postes alors ça se corse puisqu'il te faudrait modifier le code pour ajouter ou enlever des lignes.

    La meilleure solution est de faire une boucle foreach du tableau retourné par toto. De cette manière que tu aies 1 ou 100 résultats le code est le même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach($array2 as $key => $value) {
      $b = $key + 1;
      echo "$b. $value<br/>";
    }
    Magique. Non ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  5. #5
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    RE,

    Effectivement, c'est magique et presque écoeurant !!!

    Encore un grand merci !
    Bonne soirée
    Yule

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    je passais par hasard par là et je pense qu'il est possible de faire beaucoup plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $words    = explode(' ', $lorem);
    $filtered = array_filter($words, function($p) { return (mb_strlen($p) >= 4); });
    $nb       = array_count_values($filtered);
    arsort($nb);
    EDIT : correction erreur de code

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/04/2012, 02h05
  2. Réponses: 16
    Dernier message: 24/12/2009, 19h44

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