Transformer automatiquement des mots en lien.

Magicarno
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 22
Inscription: 23 Déc 2007

Transformer automatiquement des mots en lien.

Message le Jeu Déc 27, 2007 19:37

Bonjour,

Je cherche soit un script tout fait soit une piste pour en développer un.
Je veux en fait pouvoir automatiquement remplacer dans une zone de texte certains mots par des liens.

Par exemple je poste une news du type...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec molestie.
Sed aliquam sem ut arcu. Phasellus sollicitudin. Vestibulum condimentum
facilisis nulla. In hac habitasse platea dictumst. Nulla nonummy. Cras quis
libero. Cras venenatis. Aliquam posuere lobortis pede. Nullam fringilla
urna id leo. Praesent aliquet pretium erat. Praesent non odio. Pellentesque
a magna a mauris vulputate lacinia. Aenean viverra. Class aptent taciti
sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos.
Aliquam lacus. Mauris magna eros, semper a, tempor et, rutrum et, tortor.

et je veux que sur le site (Php / Mysql) apparaisse

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec molestie.
Sed aliquam sem ut arcu. Phasellus sollicitudin. Vestibulum condimentum
facilisis nulla. In hac habitasse platea dictumst. Nulla nonummy. Cras quis
libero. Cras venenatis. Aliquam posuere lobortis pede. Nullam fringilla
urna id leo. Praesent aliquet pretium erat. Praesent non odio. Pellentesque
a magna a mauris vulputate lacinia. Aenean viverra. Class aptent taciti
sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos.
Aliquam lacus. Mauris magna eros, semper a, tempor et, rutrum et, tortor.

Où en bleu on trouve des liens vers des articles en rapport avec les mots.
En fait c'est un système équivalent aux nouveaux formats pubs de type Intellitxt mais adapté au surf sur un même site.

Merci d'avance pour votre aide.


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8581
Inscription: 23 Nov 2005

Message le Jeu Déc 27, 2007 19:45

En php tu te définis une sorte de dictionnaire de mot, et les url terminales relatives à ces mots, et tu fais un recherche-remplacer dans ton contenu avant de l'afficher.

Le but étant de remplacer chaque occurence d'un mot présent dans le "dictionnaire" par un lien vers la page qui correspond à ce mot.

Le tout lié à un système de cache pour pas trop surcharger.


KOogar
WRInaute accro
WRInaute accro
 
Messages: 3974
Inscription: 16 Nov 2004

Message le Jeu Déc 27, 2007 19:59

basiquement tu fais un tableau avec les mots et un simple str_replace devrait suffir. Tout depend de la quantité de mots que tu dois remplacer ?

$texte = str_replace("mot","<a href="">mot</a>",$texte);


cloacking
WRInaute impliqué
WRInaute impliqué
 
Messages: 722
Inscription: 20 Oct 2004

Message le Jeu Déc 27, 2007 20:02

Tout depend de la quantité de mots que tu dois remplacer ?

Si il y en a + de 10.000 c'est grave docteur ?

Je demande ça également car je comptais faire un adapt de mon nuage de Tags dans ce sens :)


KOogar
WRInaute accro
WRInaute accro
 
Messages: 3974
Inscription: 16 Nov 2004

Message le Jeu Déc 27, 2007 20:48

O!! 10 000 mots... preg devrait etre 10 à 20 fois plus rapide.

preg_replace('`\b'.$mot.'\b`i','<a href="http://www.site.com/index.php?val=$0">$0</a>',$texte);

darmond.j
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 347
Inscription: 18 Fév 2007

Message le Jeu Déc 27, 2007 22:14

merci KOogar ça va me servir :)


ckarone
WRInaute impliqué
WRInaute impliqué
 
Messages: 522
Inscription: 29 Juin 2004

Message le Ven Déc 28, 2007 9:42

Salut,

Une petite recherche donne souvant des résultats sur WRI :
http://www.webrankinfo.com/forums/viewtopic_84877.htm


medium69
WRInaute passionné
WRInaute passionné
 
Messages: 2485
Inscription: 7 Mai 2005

Message le Ven Déc 28, 2007 10:26

J'ai ce script justement...

Je te donnes quelques piste pour ne recherché que les mots qui t'intéresse sans tous les passer à la moulinette.

Dans un premier temps, tu récupère tous les mots de ton texte :

Code: Tout sélectionner
$mots_texte = preg_split('#([\s/\[\]\\\@.,(){}><]+)#Us', $value, -1, PREG_SPLIT_NO_EMPTY); // Découpe du texte pour récupéré les mots séparés (pas de séparation des apostrophes)   
$mots_texte_bis = preg_split('#([\s/\[\]\\\@.\',(){}><]+)#Us', $value, -1, PREG_SPLIT_NO_EMPTY); // Découpe du texte pour récupéré les mots séparés (séparation des apostrophe)
$mots_texte = array_merge($mots_texte, $mots_texte_bis); // On combine les deux tableaux créés
$mots_texte = array_unique($mots_texte); // On ne garde qu'une occurrence de chaque mot
$mots_texte = array_slice($mots_texte, 0); // On réindexe le tableau à partir de 0


Ensuite tu filtre un peu cette liste selon tes besoins (dans l'exemple, on ne garde que les mots de 2 caractères minimum, qui contiennent au moins une lettre, mais pas de chiffre) :

Code: Tout sélectionner
$mots_defin = '';
$total_mots_texte = count($mots_texte);
   
for ($nb = 0; $nb < $total_mots_texte; $nb ++) {
  if (mb_strlen($mots_texte[$nb]) >= 2 && preg_match('#[a-zA-Z]#U', $mots_texte[$nb]) && !preg_match('#[0-9]#U', $mots_texte[$nb]) ) {
    $mots_defin .= $mots_texte[$nb].', '; // Préparation de la chaine de requête         


Maintenant que tu sais quels mots auront éventuellement un lien tu envoi une requête SQL vers ta liste de mots.
Dans mon cas, je tiens compte compte de la casse par exemple la planète Mars n'est pas le mois de mars... je tiens compte aussi de la possibilité qu'un terme puisse être retrouvé à partir de plusieurs forme (homonyme, pluriel, etc.). Je te laisse cherché un peu si tu veux adpaté cela à ton cas.

Pour faire simple, dans une table, tu as les champs suivant :

:arrow: le mot ou le groupe de mots sur lequel mettre un lien
:arrow: une liste de mots clés ou groupe de mots séparé par une virgule

Dans une autre, tu as une occurence de chaque mots séparé de tes mots clés avec l'identifiant correspondant ; c'est dans cette table que tu fera la recherche des termes de ton texte avec un WHERE cherche_mot IN('') en faisant un tri descendant pour mettre les mots les plus long au début ORDER BY Length(terme_lien) DESC.

Maintenant on crée un tableau contenant, tes occurences accompagné de leurs mots-clés :

Code: Tout sélectionner
while ($terme = mysqli_fetch_assoc(ta_requête)) {
$defin[] = array('keyword' => $terme['defin_keywords'], // Mots clés
         'terme'   => $terme['defin_nom']); // Nom
}


Il ne te reste plus qu'à mettre tes liens en place :

Code: Tout sélectionner
/* ****************************************************************************
- comparaisonNombreCaractere($value_1, $value_2)
- Permet de trier un tableau en fonction du nombre de caractère (tri ascendant)
- À utiliser avec « usort() »
- Dernière version : 22/09/07

-$value_1 : Première valeur
-$value_2 : Seconde valeur
**************************************************************************** */
function comparaisonNombreCaractere($value_1, $value_2) {

   if (mb_strlen($value_1) == mb_strlen($value_2)) {
      return 0;
    }
   
   if (mb_strlen($value_1) > mb_strlen($value_2)) {
      return -1;
   } else {
      return 1;
   }
}

      
   // Mise en place du lien vers la définition du glossaire
   if (isset($defin) ) {
      $total_defin = count($defin);
      
      for   ($nb = 0; $nb < $total_defin; $nb ++) {
         unset($keywords, $keywords_majus);
         
         // Création du tableau de mots clés
         $keywords_defaut = preg_split("/(, +)/", $defin[$nb]['keyword'], -1, PREG_SPLIT_NO_EMPTY); // Découpe des mots et expressions et mise dans un tableau
         
         // Création d'un second tableau avec une majuscule en début de chaque valeur
         $total_keywords_defaut = count($keywords_defaut);
         
         for   ($nb_1 = 0; $nb_1 < $total_keywords_defaut; $nb_1 ++) {
            $keywords_majus[] = majuscule($keywords_defaut[$nb_1]);
         }
         
         $keywords_liste = array_merge ($keywords_defaut, $keywords_majus); // Fusion des deux tableaux précédents
         array_unique ($keywords_liste); // On ne garde qu'une occurence de chaque mots
         usort ($keywords_liste, 'comparaisonNombreCaractere'); // Tri ascendant en fonction du nombre de caractères
         
         // Création de la liste de mots clés formatée pour la recherche            
         $keywords = '';
         $total_keywords_liste = count($keywords_liste);
         
         for ($nb_1 = 0; $nb_1 < $total_keywords_liste; $nb_1 ++) {
            $keywords .= $keywords_liste[$nb_1].'|'; // préparation de la chaine des mots à recherché
         }
         
         // Mise en plce du lien une seule fois par terme
         $value = preg_replace('#(^|[\s\b\'(>])('.$keywords.')([\s\b.\],)<]|$)#U', '<a href="http://www.site.com/$1.html</a>', $value, 1);
      }
   }


Mon script est assez complexe et je ne t'ai donné que ce qui peut t'intéressé. Désolé de ne pas te dévoiler la totalité, mais j'y est passé plus de 200 heures de recherche et de codage pour le finaliser.

Par contre pense à faire une bonne mise en cache si tu as de très grandes pages.

Espérant avoir pu t'aider :wink:


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6469
Inscription: 13 Juin 2005

Message le Ven Déc 28, 2007 10:35

@medium69: pour la peine je recommande :)


ckarone
WRInaute impliqué
WRInaute impliqué
 
Messages: 522
Inscription: 29 Juin 2004

Message le Ven Déc 28, 2007 10:57

OUI, une reco pour moi aussi.
Il y a de très bonnes idées dans ce script, notemment :
"Dans mon cas, je tiens compte compte de la casse par exemple la planète Mars n'est pas le mois de mars... je tiens compte aussi de la possibilité qu'un terme puisse être retrouvé à partir de plusieurs forme (homonyme, pluriel, etc.)".

Merci medium69


KOogar
WRInaute accro
WRInaute accro
 
Messages: 3974
Inscription: 16 Nov 2004

Message le Ven Déc 28, 2007 12:25

merci pour ce code, surtout pour recuperer les mots, moi je me contentais d'un simple split("[^[:alpha:]]+", $texte)... et bien sur ca ne prenait pas les apostrophes en consideration...

par contre le coté j'enlève les mots de 2 caracteres je trouve ca trés bof
perso j'utilise cette liste:
http://www.ranks.nl/stopwords/french.html
et j'enleve les mots que je ne veux pas en 1 fois
array_diff($regs,$table_mots_bannis)

pour le reste j'ai pas suivie ton raisonnement
je me contente de recherche les mots qui ont le plus d'occurence et je fais mes liens;

Code: Tout sélectionner
// groupe les Mots-clés identiques et on les compte
$stats = array_count_values($regs);
// trie par ordre croissant la liste
array_multisort($stats, SORT_DESC);
// crée un tableau avec les clés du tableau correpondants aux mots clés
$tabKey = array_keys($stats);


apres je fais les liens sur les mots et basta...

tu as une url pour ton appli en production ?


medium69
WRInaute passionné
WRInaute passionné
 
Messages: 2485
Inscription: 7 Mai 2005

Message le Ven Déc 28, 2007 13:02

KOogar a écrit:tu as une url pour ton appli en production ?


Mon site :wink:

Par contre je le répète, il faut une bonne mise en cache car certains traitement peuvent être long.

Sur certaines de mes page, le traitement peut prendre jusqu'à 10 secondes. Il faut dire que je ne me contente pas uniquement de cela...


medium69
WRInaute passionné
WRInaute passionné
 
Messages: 2485
Inscription: 7 Mai 2005

Message le Ven Déc 28, 2007 13:05

KOogar a écrit:par contre le coté j'enlève les mots de 2 caracteres je trouve ca trés bof
perso j'utilise cette liste:
http://www.ranks.nl/stopwords/french.html
et j'enleve les mots que je ne veux pas en 1 fois
array_diff($regs,$table_mots_bannis)

pour le reste j'ai pas suivie ton raisonnement
je me contente de recherche les mots qui ont le plus d'occurence et je fais mes liens;

Code: Tout sélectionner
// groupe les Mots-clés identiques et on les compte
$stats = array_count_values($regs);
// trie par ordre croissant la liste
array_multisort($stats, SORT_DESC);
// crée un tableau avec les clés du tableau correpondants aux mots clés
$tabKey = array_keys($stats);


Je vais étudier cela pour optimiser mes scripts.


KOogar
WRInaute accro
WRInaute accro
 
Messages: 3974
Inscription: 16 Nov 2004

Message le Ven Déc 28, 2007 13:19

le résultat est magnifique et grandement pertinant

pourquoi faire une mise en cache ? c'est à chaque nouvelle insertion de documents qu'il faut placer les liens et la mise à jour est déjà dans la table sql.


medium69
WRInaute passionné
WRInaute passionné
 
Messages: 2485
Inscription: 7 Mai 2005

Message le Ven Déc 28, 2007 13:31

KOogar a écrit:le résultat est magnifique et grandement pertinant

pourquoi faire une mise en cache ? c'est à chaque nouvelle insertion de documents qu'il faut placer les liens et la mise à jour est déjà dans la table sql.


Disons que je ne me contente pas uniquement de mettre des liens...

Au sujet des liens, parfois, il ne faut pas que le mot soit pris en compte car dans le contexte il ne veut pas dire la même chose. dans ce cas, j'insère un filtre « § » juste à côté de ce mot ; il est enlevé avant la mise en page.
De même un terme contenu dans une url, un attribut, etc. ne doit pas être pris en compte...
J'ai plusieurs filtres pour plusieurs traitement selon mes besoins ; la majorité se mettent en place au fur et à mesure du traitement.

En vrac et tout en automatique :
:arrow: Ajout de liens (
:arrow: Pris en compte des abréviations (abréviations courantes, formules chimiques, symbole monétaire, chimique, etc.)
:arrow: Prise en compte des acronymes
:arrow: Prise en compte des mots à mettre en gras

Après un mediumCode ^^ pour :
:arrow: Mise en place des illustrations avec leur légende avec une taille adapté au contexte
:arrow: Mise en forme des tableau
:arrow: Pris en compte de la langue
:arrow: Mise en italique
:arrow: Mise en forme des titres
:arrow: Mise en place des liste
:arrow: Et encore bien d'autres choses...

Je t'envoi un MP pour un exemple concret de ce qui est en BDD et ce qui est à l'écran;)

Transformer automatiquement des mots en lien.

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google AdWords API

  • Transformer des textes non cliquables en liens
    Cet outil vous permet de trouver des pages citant votre site mais ne faisant pas (encore) de lien. Il suffira parfois d'un simple mail pour transformer cette simple citation en lien (backlink).
  • Tester la validité d'un lien
    Cet outil vous permet de tester la validité d'un lien pour le référencement. Il vous indique la nature du lien (lien en dur, redirection bien gérée par les moteurs ou redirection mal gérée par les moteurs).
  • Calculer le ratio de liens profonds
    Cet outil vous permet de calculer le taux de liens profonds vers un site web. Un lien profond est un lien qui ne pointe pas vers la page d'accueil mais au contraire vers une page interne du site. Les sites dont l'essentiel du référencement vient de leurs inscriptions dans des annuaires ont un taux de liens profonds faible ; à l'inverse, les sites de référence ont souvent un taux de liens profonds plus important, signe que leur contenu a suscité de nombreux liens spontanés.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité