PDAsurf
Messages postés1Date d'inscriptiondimanche 1 octobre 2006StatutMembreDernière intervention29 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
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és44Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention28 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és129Date d'inscriptiondimanche 9 décembre 2001StatutMembreDernière intervention12 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és44Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention28 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és1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 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és1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 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))
sinon bon code mais une fonction suffit à mon avis inutile d'en faire une classe... .. .
@ tchaOo°
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 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és44Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention28 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és65Date d'inscriptionsamedi 29 octobre 2005StatutMembreDerniè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és1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 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 :
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 ;)
29 oct. 2008 à 23:50
- 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
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.
20 oct. 2008 à 12:40
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.
+++
20 oct. 2008 à 10:01
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
16 oct. 2008 à 23:47
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); !
16 oct. 2008 à 02:52
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°
16 oct. 2008 à 02:47
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°
16 oct. 2008 à 00:07
"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)
15 oct. 2008 à 21:24
@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!
+++
14 oct. 2008 à 16:40
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
14 oct. 2008 à 09:47
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 ;)