Comparaisons de chaines / trouver les chaines similaires

ViPHP
ViPHP | 3607 Messages

21 déc. 2010, 10:37

Bonjour à tous!

Je viens vous voir avec un petit problème épineux!
Soit le tableau suivant:
<?php
$phrases = array(

'Je mange du chou',
'Je vais chez le coiffeur',
'Je mange des choux',
'je vais au coiffeur',
'il fait beau et chaud'

);
(attention une des phrases est volontairement fausse)

Bien je souhaiterais pouvoir dire "la deuxième phrase va avec la quatrième et la première avec la troisième (et la dernière reste toute seule)".
Donc j'ai pensé utiliser levenshtein() ou similar_text() en définissant un delta minimum afin de décider si oui ou non deux phrases "vont ensemble".

Mon problème vient du fait que je ne sais pas comment parcourir le tableau de phrases, étant donné que ce dernier est complètement aléatoire et qu'il peut à terme devenir assez gros...

Donc est-ce que je dois prendre chaque phrase et la comparer à toute les autres?
Est-ce que je dois faire un tri par longueur de chaine au préalable afin de limiter un peu le travail?

Je n'en ai aucune idée :)

Merci d'avance ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 déc. 2010, 10:56

Je te propose une autre approche, à l'aide de soundex().

Dans une 1ère passe, tu calcules le soundex de tout ton tableau, puis tu fais un tri sur ton tableau selon la valeur du soundex (pense au quick sort), et tu compares à chaque fois avec la valeur suivante pour savoir si les phrases vont ensemble ou pas.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 3607 Messages

21 déc. 2010, 15:53

Bonjour,

Effectivement c'est une bonne idée!
Je l'ai mise en place et c'est pas trop mal, mais c'est pas encore ça :/
Par exemple ces deux phrases:
Je vais chez ma grand-mère
Je vais chez ma grand-mère pour lui apporter des gateaux
Auront le même soundex, hors elles ne doivent pas être ensembles à mon sens...
Car il ne s'agit pas de corrections mineures d'orthographe...

Du coup je voulais essayer de trouver tout les combinaisons possibles de paires de phrases, et calculer les levenshtein() et/ou les similar_text() et ne garder que celles qui ont un score élevé...
Mais le problème de base c'est que je n'arrive pas à créer l'algorythme combinatoire... :/
Il faut que les paires soient uniques et l'ordre importe peu...

j'ai essayé de partir de ça: php-debutant/combinaison-lettres-t33035.html
Mais je n'arrive à rien!
Voici un des codes qui marche, mais c'est très sale :s
$paires = array();



rec_combiner('',array('a','b','c','d','e','f'));

$paires = array_unique($paires);

sort($paires);

var_dump($paires);


function rec_combiner ( $chaine, $letters ){
  global $paires;

  foreach( $letters as $key => $letter ){
    unset($letters[$key]);

    if(strlen($chaine . $letter) ==2){
      $paires[] = $chaine . $letter;
    }
    elseif(strlen($chaine . $letter) > 2) {
      $chaine = '';
    }
    rec_combiner ( $chaine . $letter , $letters );
  }

}