Regrouper des expressions qui se ressemblent, en PHP ou MySQL, à l'aide

WRInaute accro
Bonjour,

Je bute sur une "fonction" à réaliser car je ne vois pas du tout comment faire. J'ai à ma disposition PHP et MySQL.

J'ai une liste de mots qui sort d'une base de données, comme ceci :
Attraction
Ambition
Attraction
Lauréate
Trend
Attraction
Trend A
Attraction + jantes 16
Ambition
Ambition
Trend Luxe
Attraction
Lauréate
Ambition A
Lauréate FR
Ce que je voudrais faire : avec un code PHP, ou directement MySQL, réussir à détecter les parties communes dans la liste pour pouvoir les isoler, dans ce cas ça donnerait:
Ambition
Attraction
Lauréate
Trend
Comment vous y prendriez vous ? Ca me semble complexe à faire, je ne dois pas avoir les bons automatismes en tête.

Toute aide sera grandement appréciée, merci d'avance.
 
WRInaute accro
Tu tries par ordre alphabétique, tu parcours en comparant à chaque fois la chaine la chaine précédente, si elles sont identiques tu ajoute à un autre tableau
Une fois que tu as finis de parcourir tu affiches le tableau avec un group on pour avoir les valeurs uniquement une fois
 
WRInaute accro
Merci mais ça ne marchera pas puisque par exemple Lauréate et Lauréate + 16" ne sont pas identiques.
Je voudrais en fait détecter, au sein d'une liste, les expressions qui sont uniques et qui se répètent, pour pouvoir regrouper sous "Lauréate", les "Lauréate" ainsi que "Lauréate +16" ou encore les "Version fr Lauréate".
 
WRInaute impliqué
Est ce que le mot clé "important" est toujours composé justement d'un seul mot ?
 
WRInaute accro
Si le seul mot "important" c'est le premier, alors tu peux faire quelque chose comme:

Code:
select substring_index(colonne, ' ', 1) from table group by 1 having count(*) > 1

Si tu dois prendre en compte les mots quelle que soit leur position, c'est un peu plus compliqué parce que je ne crois pas que mysql ait l'équivalent du regexp_split_to_table de postgresql. L'idée serait alors de faire une sous-requête avec une série de UNION qui renvoient chacun des mots un par un. Probablement plus simple de faire ça au niveau php avec un petit explode sur chaque ligne.

Jacques.
 
WRInaute accro
tu places tes elements en sortie dans un tableau php

pas tester mais ca fonctionne (j'ai repris une fonction pour le nbre max de mots, tu peux simplifier si besoin):

Code:
<?php

function getMaxWord($p_chaine, $p_maxWord){
    $array = explode(' ',$p_chaine);
    if(count($array)<=$p_maxWord){
        return $p_chaine;
    }
    
    $chaine = "";
    for($i=0; $i<$p_maxWord;$i++){
        $chaine .= $array[$i]." ";
    }
    return $chaine;
}


$tab = array("Attraction",
"Ambition",
"Attraction",
"Lauréate",
"Trend",
"Attraction",
"Trend A",
"Attraction + jantes 16",
"Ambition",
"Ambition",
"Trend Luxe",
"Attraction",
"Lauréate",
"Ambition A",
"Lauréate FR");

$i=0;
while ($i < sizeof($tab)) {
$new_tab[] = trim(getMaxWord($tab[$i],1));
$i++;
}

$result = array_unique($new_tab);


?>

te reste plus qu'a lister le tableau $result :wink:
si tu les veux par ordre alphabétique: sort($result);
 
WRInaute accro
Merci à vous tous. Je vais creuser dans le sens de l'eplode. Je pense exploder les chaines, créer une table temporaire qui va stocker les points attribués à chaque mots via PHP et ne garder que les redondances les plus importantes. ON verra bien si ça marche.

jcaron, merci mais oui l'expression peut être multiple et là ça se corse.

Pour utiliser Zend_Search_Lucene il faut installer quelque chose sur le serveur non ?
 
WRInaute discret
Php propose pas mal de fonctions pour comparer des mots entre eux.
- comparaison phonétique avec soundex(),
- distance entre 2 mots avec levenshtein()

A voir si elles te permettent de filtrer plus rapidement les mots qu'une méthode avec des array.
 
WRInaute accro
excellentes fonctions php
mais ca ne sera pas plus rapide
puisqu'il devra boucler sur chaque élements et le comparer aux autres pour chercher une correspondance exacte, une distance égale a 0
 
WRInaute accro
Tiens KOogar, un "vieux" WRiste.

Merci pour ces pistes, les fonctions deviennent rapidement gourmandes surtout que mes expressions peuvent avoir n mot.
Je crois que je vais procéder autrement car mon petit Celeron n'en pourra vite plus.
 
Discussions similaires
Haut