Afficher les articles relatifs à celui consulté en PHP/MySQL

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par milkiway, 25 Février 2010.

  1. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Salut,

    Je voudrais afficher sur mes articles un bloc "Vous aimerez également :" suivi d'une liste de 5 articles pas forcément de la même catégorie dans le site mais dont les titres laissent à penser qu'ils sont similaires.

    Exemple : titre "L'Audi A8 W16, missile de luxe"
    et que ça puisse me sortir dans "Vous aimerez également :" l'article que j'ai écris le mois dernier "Bugatti Veyron W16 : l'action de Total monte en flèche". :mrgreen:

    Quelqu'un aurait un tuto ou une piste technique pour sortir ça ?

    Un grand merci

    PS : j'imagine que ça fonctionne à grand renforts d'explode et de like % ?
     
  2. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 003
    J'aime reçus:
    128
    Je gérerais davantage ça en créant un système d'association d'article, un article pouvant être associé à n autres.

    Ou si tu veux automatiser cela (ce qui me semble être le cas vu qu'une partie des titres est identique) ça peut en effet se faire via une recherche sur les autres titres d'articles présent dans ta base, après avoir nettoyé ceux-ci des mots inutiles (pronoms, déterminants, conjonctions diverses).
     
  3. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Merci c'est ce que j'ai commencé à faire. J'ai déjà 600 articles et je ne peux/vais pas les associer à la main ni en automatique.
    Je suis parti sur du str_replace pour virer les "le, la, les, des, du, au" etc., explode, like et ça devrait rouler.
     
  4. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 003
    J'aime reçus:
    128
    Le souci c'est qu'en automatisant, tu risques à un moment d'avoir des listes d'articles non négligeables de conseillés en-dessous d'un article.
     
  5. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 774
    J'aime reçus:
    0
    Regarde la méthode utilisé par le plugin wordpress "related post".
    Je pense qu'il faut partir sur des % LIKE et des bons gros preg_match, mais par la suite, les faire à la main pourrait être pas mal.

    Edit: j'ignore quel module c'est sur PHPBB, mais matte un peu en dessous de la réponse "sur ce thème".

    Un moteur google peut être pas mal sinon pour faire ce genre de chose (à vérifier bien sûr)
     
  6. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Non tinquite, je croise avec d'autres critères et je limite a 5 articles.
     
  7. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    Perso je verrai bien en premier un traitement sur le titre qui remplace tous les caracteres non alphanumeriques par des espaces, ensuite un explode sur les caracteres d'espace, et tu te construis une requete avec une boucle for et des LIKE avec le tableau que t'as obtenu avec l'explode (en ne gardant que les mots de plus de deux caracteres par exemple).

    Autre chose pour la précision tu peux additionner le nombre de mots qui matchs bien ;) (je garanti pas la rapidité, c'est juste pour te donner des idées)
    Pour exemple essaye une requete du style :
    Code:
    SELECT *, (TITRE LIKE '%audi%') AS TEST1, (TITRE LIKE '%a8%') AS TEST2, (TITRE LIKE '%w16%') AS TEST3 FROM `tatable` ORDER BY (TEST1+TEST2+TEST3) DESC
    t'as juste à remplacer tatable par le nom de ta table d'articles, et TITRE par le champ qui correspond aux titres de tes articles, et les mots que tu recherches. Je t'ai mis les mots audi, a8, et w16 pour rester dans ton exemple ;)

    Si t'as beaucoup d'affluence regarde au niveau temps de réponse d'une telle requête...
    Après ça dépend de ton serveur et du nombre de tes articles, mais les LIKE c'est pas forcement très rapide...
    Fais des tests, si ca te pénalise trop tu peux aussi précalculer et enregistrer en bdd dans un nouveau champ pour chaque article... genre quand tu créé un article ca te calcul direct les articles similaires, et t'enregistres les id des articles séparés par des virgules dans un champ tinytext.
    Limite si tu veux que ce soit actualisé tu te fais un script en tache cron qui se lance une fois de temps en temps en pleine nuit et qui recalculera tout ça...
     
  8. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 274
    J'aime reçus:
    0
    j'utiliserais plutôt des regexp dans la requête : ça éviterait ainsi de sélectionner des morceaux de mots, du genre like "%audi%" qui te ressortirait aussi "bon matériel audio" :wink:
     
  9. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    exact, avec des \b autour :)
     
  10. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    par contre, quelle est la conso en ressoruces d'un str_replace() ?
     
  11. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 274
    J'aime reçus:
    0
    moins qu'un preg_replace()
     
  12. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    oui ça je sais, mais c'est considéré comme gourmand ou tout à fait standard
     
  13. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    bin faut tester...
    par contre moi j'aurais plutot mis un preg_replace pour retirer les caractères non alpha numériques...

    Code:
    $ret=preg_replace("/\W/"," ",$tonTitre);
    tu compte te faire un tableau des caracteres à retirer avec ton str_replace?


    [edit] benchmark entre str-replace et preg_replace : http://www.php-scripts.com/php_diary/011303.php3
     
  14. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Merci mais je ne comprends rien aux regex.

    Prenons un exemple :
    Allumettes de pomme de terre façon Cuisinetoo (reblochon)
    Quel regex pour en sortir
    allumettes
    pommes de terre
    reblochon

    J'ai bien sur isolé pomme de terres par un str_replace (je le remplace par un chiffre).

    ?
     
  15. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 274
    J'aime reçus:
    0
    dans leur 1° benchmark, ils n'ont pas utilisé str_replace de façon efficiente, ce qui fait que sa performance était moindre. En utilisant str_replace(array("-","."," ","(",")"),"", $phone); ils auraient gagné un facteur de 5 quasiment
    Code:
    select * from tatable where title regexp "(allumettes|pommes de terre|reblochon)"
    après, il faut voir pour gérer les pluriels, etc...
     
  16. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    En effet y'a moyen de discuter sur son test.
    Par contre c'est pas évident de se faire un tableau avec tous les caractères non alpha qu'il pourrait utiliser dans un titre. là il faut rajouter ! ; ? " = + à ta liste je pense, et plus la liste grossi plus ca prendra du temps. Comparé à un \W je pense que ce serait quand même bien de tester...


    milkiway> t'auras du mal à ressortir l'espression "pomme de terre", t'auras plutot "pomme", "de", et "terre".

    Code:
    <?php
    
    $txt="c'est la fête, et on s'amuse comme des fous!!";
    
    $ret=preg_replace("/\W/"," ",$txt); // a reflechir si str_replace ou preg_replace
    $ret2=explode(" ",$ret);
    
    print_r($ret2);
    
    ?>
     
  17. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Merci.
    Comme dit, avant le regex, je remplace tout simplement "pommes de terre" par "01" ainsi ce n'est pas touché ;)
    Par contre, ta fonction c'est un explode en 20 fois plus gourmand non?
     
  18. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    non preg replace c'est comme un str_replace mais avec une expression reguliere. En gros le \W veut dire tous les caracteres non alpha numerique (c'est l'inverse de \w qui veut dire tous les caracteres alphanum).
    Donc là le preg_replace remplace tous les caracteres non alphanum par des espaces.
    Ensuite t'as un explode qui coupe à chaque fois que y'a un espace.
    Et ensuite dans ta boucle for pour créer ta requete mysql t'a juste à récupérer les éléments du tableau avec un petit if pour filtrer les entrées nulles ou alors de 1 caractère.

    [edit]
    Bon je t'ai fais un truc rapidos pour t'expliquer ce à quoi je pensais.

    Code:
    <?php
    
    $txt="c'est la fête, et on s'amuse comme des fous!!";
    
    $ret=preg_replace("/\W/"," ",$txt);
    $ret2=explode(" ",$ret);
    
    print_r($ret2);
    
    $query="debutRequete WHERE";
    $n=count($ret2);
    $nn=0;
    for ($i=0;$i<$n;$i++) {
        if (strlen($ret2[$i])>1) {
            if ($nn>0) { $query.=" OR"; }
            $query.=" (test avec '".$ret2[$i]."')";
            $nn++;
        }
    }
    
    echo "<br/>".$query;
    
    ?>
     
  19. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Ok merci.

    Comment je peux faire pour virer dans $ret2 de ton exemple, toutes les entrées vides et celles de moins de trois lettres ?
    Ou alors je le fais carrément d'office dans le premier regex ?
     
  20. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    erf, j'ai édité le précédent message en même temps ;)
     
  21. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    C'est super sympa à vous, merci RiPso, je me suis basé sur ton script que j'ai modifié (j'ai ... viré le preg_replace car certains de mes titres contiennent des chiffres...) et ça a l'air de me donner satisfaction. Reste plus qu'à créer cette requête et faire un bon système de cache...
     
  22. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    Alpha numérique veut dire lettres + chiffres donc c'était bon ;)
     
  23. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Merci pour tout. Par contre je suis obligé de faire une requête par terme ?
    Si je sépare les termes par des OR comme j'ai pas mal de résultats rien que pour le premier et que je ne veux afficher que 5 articles relatifs, les autres ne sont pas pris en compte.
    Je voudrais que ça sorte des résultats pertinents.
    Par exemple trois mots représentant le contenu : gratin, pâte, viande hachée
    je voudrais que ça me sorte les autres gratins de pâtes par exemple, pas juste les gratins ou juste les pâtes ou juste la viande hachée.

    Comment je peux faire pour ça ?
    J'ai pas besoin d'un algo à la Google mais bon ;)
    Je regarde bien sur du côté de FULL TEXT (pour ceux que le sujet intéresse : http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html ) seulement il ne trouve rien. Je ne comprends pas tout.
     
  24. RiPSO
    RiPSO WRInaute impliqué
    Inscrit:
    5 Octobre 2007
    Messages:
    948
    J'aime reçus:
    0
    Et bien il te suffit d'adapter avec la requête que je t'ai donné plus haut.
    Ça comptera 1 à chaque fois qu'il trouvera un des mots et ca classera en fonction de la somme des résultats.

    Ensuite si ça te prends trop de temps à l'exécution je te conseil d'enregistrer le résultat à chaque fois que tu créé un article.
     
  25. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 274
    J'aime reçus:
    0
    full text ce n'est pas vraiment pertinent au niveau des réponses
     
  26. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    Et bien pourtant je viens de le finir et le résultat est au delà de mes espérances :D
    La pertinence, pour ce que j'en fais, est excellente :D
    Alleluhuia !

    Merci à tout le monde pour l'aide, j'ai maintenant un système de tags automatisé ne renvoyant que des résultats pertinents et un système d'articles qui peuvent intéresser le lecteur qui fonctionne à merveille.

    J'adore le PHP et MySQL (même si ça devient vite lent).
     
  27. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 274
    J'aime reçus:
    0
    Si tu pouvais afficher ta solution, cela pourrait aider d'autres webmasters qui souhaiteraient avoir le même type de solution
     
  28. milkiway
    milkiway WRInaute accro
    Inscrit:
    3 Février 2004
    Messages:
    4 196
    J'aime reçus:
    0
    ;)
     
  29. Lili2201
    Lili2201 Nouveau WRInaute
    Inscrit:
    26 Octobre 2011
    Messages:
    5
    J'aime reçus:
    0
    Savez-vous quel est l'impact des related post sur le référencement web ?
     
Chargement...
Similar Threads - Afficher articles relatifs Forum Date
Afficher les articles non vu Google Analytics 6 Février 2015
[WP] Afficher le nombre d'articles pour un tag Développement d'un site Web ou d'une appli mobile 19 Août 2012
Wordpress : Afficher les listings d'articles en random, bonne idée ? Demandes d'avis et de conseils sur vos sites 21 Juillet 2012
Afficher des articles dans une page sous WordPress Développement d'un site Web ou d'une appli mobile 23 Janvier 2012
Google lance une fonction pour afficher en temps réel les nouveaux articles Google : l'entreprise, les sites web, les services 27 Août 2010
Afficher liste articles par catégories sous WORDPRESS Développement d'un site Web ou d'une appli mobile 22 Octobre 2009
Script ou logiciel pour ajouter/afficher des articles Développement d'un site Web ou d'une appli mobile 10 Mars 2009
Afficher les derniers articles Wordpress Développement d'un site Web ou d'une appli mobile 17 Décembre 2008
Script "Afficher derniers articles" Développement d'un site Web ou d'une appli mobile 30 Mai 2007
Afficher les titres des articles spip sur l'index en HTML Développement d'un site Web ou d'une appli mobile 12 Mars 2006
Afficher des articles trouvés sur le web en citant la source Le café de WebRankInfo 17 Octobre 2005
SPIP - comment afficher les derniers articles Administration d'un site Web 12 Juillet 2005
Afficher des infos depuis plusieurs page en PHP Développement d'un site Web ou d'une appli mobile 23 Mars 2022
Afficher la dernière version d'un fichier php ? Développement d'un site Web ou d'une appli mobile 8 Novembre 2021
comment afficher l erreur 404 URL Rewriting et .htaccess 28 Juillet 2021
Devra-t-on afficher les émissions de gaz à effet de serre de nos sites? Droit du web (juridique, fiscalité...) 28 Mars 2021
Afficher module avis Google sur un site web via le GTM ? Google : l'entreprise, les sites web, les services 18 Mars 2021
Afficher stats analytics sur mon site Google Analytics 14 Novembre 2020
Ne pas afficher certaines conversions dans Google Ads AdWords 8 Juillet 2020
Afficher les produits suivants en ajax Développement d'un site Web ou d'une appli mobile 12 Mai 2020