Comparaisons de chaines / trouver les chaines similaires

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Comparaisons de chaines / trouver les chaines similaires

Re: Comparaisons de chaines / trouver les chaines similaires

par jojolapine » 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 );
  }

}

Re: Comparaisons de chaines / trouver les chaines similaires

par zeus » 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.

Comparaisons de chaines / trouver les chaines similaires

par jojolapine » 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 ;)