Distance entre deux chaines

Distance entre deux chaines - PHP - Programmation

Marsh Posté le 15-03-2007 à 22:53:23    

Bonjour,
 
Voilà, j'ai des regex qui me permettent de detecter la présence de mot clés, et d'autres qui me permettent de récupérer certaines valeurs correspondant aux mots-clés.
 
Mais je voudrais du même coups, compter le nombre de caractères qui les séparents, car les regex renvoient plusieurs valeurs.
 
Auriez-vous une idée ou une piste à suivre ?
 
Merci bcp,
Florian

Reply

Marsh Posté le 15-03-2007 à 22:53:23   

Reply

Marsh Posté le 15-03-2007 à 23:54:42    

Je suis pas sûr de comprende.
 
Donne un exemple simple de ce que ta ou tes regexp fait (font), et de ce que tu voudrais avoir.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 16-03-2007 à 00:07:45    

Le principe est simple.
 
J'analyse une page web, je regarde le mot "resolution" et "0000 x 0000 pixel(s)" par exemple. Et je calcul la distance entre ces 2 valeurs trouvées.
 
Merci

Reply

Marsh Posté le 16-03-2007 à 00:20:07    

http://fr.wikipedia.org/wiki/Distance_de_Levenshtein
 
Heu ton exemple il est mauvais : un exemple simple :  
chien - niche - chine
 
hotmail.fr / tohmai.fr

Reply

Marsh Posté le 16-03-2007 à 01:36:05    

Non, le principe est d'associer des caractéristiques techniques (Reconnu par mots clés) à des valeurs dont les formats sont connus (Poids, taille, etc...). Et calculer la distance en caractère entre ces deux données. A l'origine la chaine complete est une page WEB.
 
Merci pour cet article !
 
Florian

Reply

Marsh Posté le 16-03-2007 à 02:58:40    

strpos($fichier,$resregexp2) - ( strpos($fichier,$resregexp1)+strlen($resregexp1) );
 
Après avoir vérifié que $resregexp2 est placée après $resregexp1 dans ta page

Reply

Marsh Posté le 16-03-2007 à 09:13:59    

Perso à l'instinct j'aurais dit comme Gatsu à savoir levenshtein
http://fr2.php.net/levenshtein
Bon après tu en as plein d'autres qui font à peu près le même boulot en php:
http://fr2.php.net/manual/fr/function.similar-text.php ( méthode d'Olivier)
http://fr2.php.net/manual/fr/function.soundex.php ( du D. Knuth dans toute sa splendeur)
http://fr2.php.net/manual/fr/function.metaphone.php ( celle là je connais pas trop)
 
Mais en lisant plus précisément je dirais que ton besoin est très "spécifique" et que tu risques de devoir coder toi-même cette fonction ..

Reply

Marsh Posté le 16-03-2007 à 09:46:39    

anapajari a écrit :

Perso à l'instinct j'aurais dit comme Gatsu à savoir levenshtein
http://fr2.php.net/levenshtein
Bon après tu en as plein d'autres qui font à peu près le même boulot en php:
http://fr2.php.net/manual/fr/function.similar-text.php ( méthode d'Olivier)
http://fr2.php.net/manual/fr/function.soundex.php ( du D. Knuth dans toute sa splendeur)
http://fr2.php.net/manual/fr/function.metaphone.php ( celle là je connais pas trop)


Ca sert à calculer la distance en caractères entre 2 mot-clés ça :??:  
 
Je croyais qu'il s'agissait juste de compter le nombre de caractères entre 2 mot-clés dans une page... [:airforceone]

Reply

Marsh Posté le 16-03-2007 à 09:58:42    

Moi de ce que j'ai compris il a un système de "poids" sur certains mots clés et ils souhaitent comparer deux urls en fonction du poid qu'elles contiennent.
Maintenant c'est vendredi matin hein :o

Reply

Marsh Posté le 16-03-2007 à 15:59:34    

Tu utilises les balises HTML, (autres ) ou pas ?

 

Est-ce que t'as une structure de donnee, si oui laquelle ?

 

Tu parles de distance et en meme temps tu definis aucune unite.

 

Si t'as pas besoin d'aide il faut le dire hein, sinon il ya toujours le chaleureux manuel ...


Message édité par supermofo le 16-03-2007 à 16:09:51
Reply

Marsh Posté le 16-03-2007 à 15:59:34   

Reply

Marsh Posté le 16-03-2007 à 17:21:03    

Oui, mon message est assez peu explicite... Désolé :)
 
Je récupère une page Web, je la nettoie (J'enleve le code HTML plus le contenu de certaines balises inutiles).
Voici deux regex que je vais ensuite appliquer à la page :
/([Pp]ixel(s)?|[Ss]ize)|([Rr]esolution)|([sS]creen)/
/[0-9]{3,4}(\s)?x(\s)?[0-9]{3,4}(\s)?(pixel(s)?|px(s)?)?/
 
Je regarde la distance en caractère entre toutes les valeurs trouvés et le couple qui a la plus petite distance est la bonne valeur. En gros...
 
La similitude entre deux mot ne m'interresse que peu à ce niveau.
 
Merci pour vos messages,
Florian

Reply

Marsh Posté le 17-03-2007 à 03:47:58    

T'as :

 
Code :
  1. preg_match($pixr, $file, $pixel);
  2. //et
  3. preg_match($resr, $file, $resolution);
 

Qui te sortent des resultats sous forme de tableau ( de taille differente )

 
Code :
  1. $pixel = array ( 'pixels' , 'px' , 'pxs' );
  2. $resolution = array ( '1024x768', '1280x1024', '800x600', '1244x768' );
  3. $findme = ( count($pixel) >= count($resolution) ) ? $pixel : $resolution;
  4. $negs = ( $findme == $resolution ) ? $pixel : $resolution;
  5. foreach($findme as $needle){
  6. foreach($negs as $neg){
  7. $posneedle = strpos($file, $needle);
  8. $posneg = strpos($file, $neg);
  9. //sens de la lecture de  gauche  a droite ou le contraire
  10. if($posneedle > $posneg){
  11. $res[$needle] = $posneedle;
  12. $res[$neg] = $posneg;
  13. $res['distance'] =  $posneedle - $posneg;
  14. $resp[] = $res;
  15. }
  16. //droite gauche
  17. else{
  18. //idem remplit $resn
  19. }
  20. }
  21. if(!$paramlecture){
  22. return array_merge($resp,$resn);
  23. }
  24. elseif(){
  25. return $resp;
  26. }
  27. else{
  28. return $resn
  29. }
  30. }
 

Faut placer le sens de lecture comme parametre de la fonction, pour diminuer operations ( dodo moi ).

 

Essayer de placer ca dans une recherche au meilleur cout marche pas tres bien vu que le coup est la distance (strpos).

 

Sinon comme alternative tu as :

 

- changer le pattern pour matcher pixel et resolution avec le  spam au milieu et donc sa longueur
- faire une recherche en profondeur en limitant le nombre de bouclage ( $counter > 10 ) break;
- discuter la taille de l'ensemble de recherche ( diminuer la taille du fichier ou  la taille des tableau de preg)

 



Message édité par supermofo le 17-03-2007 à 04:26:14
Reply

Marsh Posté le 17-03-2007 à 14:03:15    

lkolrn a écrit :

Ca sert à calculer la distance en caractères entre 2 mot-clés ça :??:


Ca calcule la "distance" entre deux chaînes de caractères en fonction de certains critères. Levenshtein est basé sur le nombre de substitutions d'une chaîne à l'autre, alors que Soundex est basé sur la distance phonétique (plus des chaînes se ressemblent au niveau prononciation et plus elles seront proches), idem pour Metaphone qui a été développé face aux manques et problèmes de Soundex mais spécialisé sur l'anglais (et Double Metaphone, une version encore plus avancée de Metaphone).
 
Il y a aussi la distance de Hamming entre des chaînes si tu veux, mais ça ne permet de comparer que des chaînes de même longueur.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 18-03-2007 à 17:45:13    

Bonjour,
 
Merci pour vos réponses. J'ai trouvé sur le site de PHP un element de réponse :
http://fr.php.net/strpos
 
Florian

Reply

Marsh Posté le 18-03-2007 à 19:50:27    

Nan mais ça c'est juste pour la position d'un caractère (ou chaine de caractères) dans une chaine.

Reply

Marsh Posté le 19-03-2007 à 21:14:03    

Quiqui c'est qu'avait bien compris la question du monsieur ? :whistle: Quoique je suis toujours pas sûr...
 

masklinn a écrit :

Ca calcule la "distance" entre deux chaînes de caractères en fonction de certains critères. Levenshtein est basé sur le nombre de substitutions d'une chaîne à l'autre, alors que Soundex est basé sur la distance phonétique (plus des chaînes se ressemblent au niveau prononciation et plus elles seront proches), idem pour Metaphone qui a été développé face aux manques et problèmes de Soundex mais spécialisé sur l'anglais (et Double Metaphone, une version encore plus avancée de Metaphone).
 
Il y a aussi la distance de Hamming entre des chaînes si tu veux, mais ça ne permet de comparer que des chaînes de même longueur.


Merci mais ma question exprimait plus un doute profond sur la réponse de Gatsu et d'anapajari (sauf leur respect :jap:) qu'une réelle méconnaissance de Levenshtein ou Soundex (par contre je connaissais po Metaphone "1" et "2" ). Enfin, je le répète je suis toujours pas certain, mais je crois que le but ici revenait tout simplement à calculer la taille de la chaîne entre 2 chaînes particulières [:airforceone]

Reply

Marsh Posté le 03-04-2007 à 05:00:35    

Bonjour,
 
Me revoici... J'ai pas mal avancé depuis !
 
Juste pour vous remercier, ca m'a aiguillé !
 
Florian

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed