COLORATION DE MOTS-CLÉS

codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 14 oct. 2008 à 09:47
PDAsurf Messages postés 1 Date d'inscription dimanche 1 octobre 2006 Statut Membre Dernière intervention 29 octobre 2008 - 29 oct. 2008 à 23:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48205-coloration-de-mots-cles

PDAsurf Messages postés 1 Date d'inscription dimanche 1 octobre 2006 Statut Membre Dernière intervention 29 octobre 2008
29 oct. 2008 à 23:50
Le code c'est très intéressant, mais je trouve deux soucis :
- Si on met dans les keywords quelque chose comme « origine » on ne trouve pas dans le texte, même sŽil existe. Mais toutes les occurrences sont de la forme « l'origine » et, comme il ni a pas de espace la fonction qui découpe les paroles prend « l'origine » comme un mot. Peut être il faut d’abord convertir « ' » dans espace pour le texte (mais c’est une norme particulier pour quelques langues, comme le français mais pas pour des autres, comme l’espagnol).

- Je ne suis pas codeur, mais j’ais tracée la fonction et j’ais vis que la comparaison ce fait avec chaque parole du texte contre chaque keyword. Donc s’il y a plusieurs fois un keyword on (re)trouve et compare chaque fois pour y souligner de forme individuelle. Je crois que ce serait plus efficace comparer chaque keyword dans le texte et à chaque occurrence, surligner d’un coup « tous » les occurrences qui existent dans le texte, puis invalider le keyword et continuer avec le keyword suivant.

Pour y mesurer la fonction j’ais ajoutée un timer, $tps_end = get_microtime();, au final du code

echo $keywordsHighlight->textHighlight($texte, $keywords);
$tps_end = get_microtime();

$interval= ($tps_end - $tps_start)* 1000 ;
echo "Temp : ($tps_end - $tps_start) en segundos";
echo "";

echo " Temp : $interval en ms";


Et mois aussi je trouve que ce serait préférable de mettre les keywords dans un tableau (array), ou bien d’accepter un tableau comme paramètre et détecter si la liste de keyword arrive comme chaine, et il faut la découper, o déjà comme tableau.
maxroucool Messages postés 44 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 28 janvier 2013
20 oct. 2008 à 12:40
Slt MangaII,

si dans la fonction simple(), tu rajoutes en premier la fonction strip_tags():
$str = strip_tags($str);

Je n'ai pas testé, mais ca doit pouvoir le faire.
+++
MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009
20 oct. 2008 à 10:01
Ca ma l'air pas mal du tout !
J'ai l'impression que c'est quand même un peu compliqué pour l'effet recherché ... mais bon !

Je suis confronté à un cas un peu plus compliqué, c'est de colorer des mots clés, dans un texte HTML !
Le soucis c'est qu'il faut garder les balises HTML, détecter les mots clés, rajouter des balises autour, le tout sans perturber le contenu ...

Une idée pour adapter cette source ???

Nico
maxroucool Messages postés 44 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 28 janvier 2013
16 oct. 2008 à 23:47
OK, donc je viens de la modifier fortement pour prendre en compte les phrases clées, comme suggéré par codefalse (Par contre j'ai tjs pas compris comment tu voulais que je fasse, donc j'ai fais à ma manière!).

Le code est maintenant un peu plus compliqué à comprendre qu'avant, et surement moins optimisé! Dc si vous remarquez des trucs à changer dites le moi!

+++

PS: si vous avez du mal a comprendre la structure du tableau $keywords (et notamment l'arrivée du $i_rank), faites un rapide print_r($this->keywords); !
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
16 oct. 2008 à 02:52
je rectifie j'avais pas fait gaffe pour le unset($test);

mais bon utiliser un unset est inutile surtout que ta variable est même pas instanciée à ta première itération autant le remplacer par

$test = false;

surtout que rien ne justifie de libérer cette variable, ça serait un objet ça serait utile car gain de place en mémoire mais à la réinitialiser à false suffit... unset c'est bien en abuser ça craint... .. . ;o)

@ tchaOo°
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
16 oct. 2008 à 02:47
t'as oublié d'enlever un truc... .. .

unset($test);

pas grand chose à rajouter dans tes blocs de comparaison utilise plutôt la comparaison typé vu que tu connais le type de tes variables... .. .

true == 1 mais true !== 1

tu grapillera en perf et surtout en rigueur... sauf cas particulier utilise plutôt les structures de langage quand tu peux...
if($x 0)> if(empty($x))

par contre pourquoi tu t'embête autant...

if($percent == 1)
if($words['simple'][$i_words] == $keywords['simple'][$i_keywords])
$test = TRUE;
else
$test = FALSE;
else
if(1 - levenshtein($words['simple'][$i_words]... etc...
$test = TRUE;
else $test FALSE; >

if($percent === 1) $test ($words['simple'][$i_words] $keywords['simple'][$i_keywords]);
else
$test = (1 - levenshtein($words['simple'][$i_words],... etc...

sinon bon code mais une fonction suffit à mon avis inutile d'en faire une classe... .. .

@ tchaOo°
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
16 oct. 2008 à 00:07
je te parlais d'un array c'est pour les mots à filtrer imagine je veux colorer "bonjour les amis", avec ta méthode, ca va me colorer
"bonjour", "les", "amis" dans mon texte. Mais je veux pas qu'il me souligne "les" qui soit ailleur, juste le "les" AVEC "bonjour" avant et "amis" apres. Tu vois ?

C'est pour ca, si tu fait avec un tableau, tu peux rechercher par entrée du tableau, donc array ('bonjour les amis', 'un message avec espaces') ne me cherchera que deux éléments, pas 7 ! Tu vois mieux ?

Les commentaires phpdoc (ou javadoc) c'est indiquer des infos sur tes classes genre @class nom de la class, @param type valeur : decription, @return type, etc.
Ca te structure ton code, et ca te donne une contrainte à respecter pour les commentaires, et comme cela tu pourras par la suite parser ton code (le logiciel doxyygen le fait) afin d'indiquer aux monde (:p), un max d'infos sur chaque fonctions (afin de savoir quel parametre passer et pourquoi, ce que ca retourne, etc) et une explication sur tes classes.

Recherche sur google pour javadoc/phpdoc tu verra comment c'est fait, peut-être tu comprendras mieux. Ou regarde mes sources (les plus récentes préférentiellements)
maxroucool Messages postés 44 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 28 janvier 2013
15 oct. 2008 à 21:24
Merci à vous deux pour vos commentaires!

@codefalse: j'ai mis en oeuvre tous tes conseils d'optimisation, mais j'ai pas compris ce que tu entendais par:
"Personnellement j'aurai plus vu un tableau pour les mots plutôt que des mots séparés par espaces."
et
"essaye de suivre une structure (phpdoc, javadoc ou ce que tu veux)"!

@defis91: j'ai modifier la ligne dont tu parles, mais je n'avais jamais eu ce probleme chez moi!

+++
defis91 Messages postés 65 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 8 août 2011
14 oct. 2008 à 16:40
Sur mon interpréteur PHP, if ($test) génère autant d'erreurs qu'il y a de mots dans le texte.

mettre : if(isset($test))

Sinon ce code est facile à lire et utile.
Le petit cours d'optimisation de "codefalse" est aussi très intéressant.
Merci aux deux
Dom Efis
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
14 oct. 2008 à 09:47
Plop :p
Personnellement j'aurai plus vu un tableau pour les mots plutôt que des mots séparés par espaces.

Comment est-ce que tu fait si je veux souligner "bonjour les amis" et que dans ma phrase, j'ai aussi, ailleurs "amis" ?
_ Le tableau résoudrait ce problème.

Tu devrais laisser le choix à l'utilisateur pour la méthode à utiliser lors de la mise en avant des mots trouvés. Strong, c'est bien, mais si le type dans son site il préfère les span parce qu'il a un style spécifique pour, ou tout autre raison... enfin bref.

Tu peux rajouter un setter, et jouer avec sprintf pour mettre le mot trouvé.

TRUE et FALSE sont des constantes.
true et false sont des structures de langage.
-> Lorsque tu utilise TRUE, le compilateur PHP va chercher l'existence de la constante TRUE, ne la trouvant pas, il va l'assimiler à true. Tu perd un peu de temps de traitement lorsque tu utilise ce style d'affichage. (Bon, c'est rien et c'est négligeable, mais c'est toujours bon de le savoir ! :))

for($i_words=0; $i_words<count($words['value']); $i_words++)
mettre count directement dans le for pose aussi un problème de performance. A chaque nouvelle itération de for, la fonction count sera appelée. Afin d'éviter des calculs superflus, tu devrait procéder ainsi :

$iWordsCount = count ($words['value']);
for ($i_words = 0; $i_words < $iWordsCount; $i_words++)

Enfin (promis j'arrête après ;)), tu commente ton code, c'est bien, mais essaye de suivre une structure (phpdoc, javadoc ou ce que tu veux), ca pourrait te sauver du temps si tu lance un jour doxygen sur ton code par exemple ;)
Rejoignez-nous