Malheureusement, cela en PHP est extrêmement coûteux (utilisation élevée du processeur et de la mémoire). Cependant, vous pouvez certainement appliquer l'algorithme à de petits ensembles de données.
Pour développer spécifiquement la façon dont vous pouvez créer un effondrement de serveur :quelques fonctions PHP intégrées détermineront la "distance" entre les chaînes :levenshtein et similar_text .
Données factices :(faites semblant qu'il s'agit de gros titres)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles );
À ce stade, $titles devrait juste être un tableau de chaînes. Maintenant, créez une matrice et comparez chaque titre avec TOUS les autres titres pour la similarité. En d'autres termes, pour 5 titres, vous obtiendrez une matrice 5 x 5 (25 entrées.) C'est là que le CPU et le puits de mémoire entrent en jeu.
C'est pourquoi cette méthode (via PHP) ne peut pas être appliquée à des milliers d'entrées. Mais si vous vouliez :
$matches = array(); foreach( $titles as $title ) { $matches[$title] = array(); foreach( $titles as $compare_to ) { $matches[$title][$compare_to] = levenshtein( $compare_to, $title ); } asort( $matches[$title], SORT_NUMERIC ); }
À ce stade, vous avez essentiellement une matrice avec des "distances de texte". Dans le concept (pas dans les données réelles), cela ressemble un peu à ce tableau ci-dessous. Notez qu'il existe un ensemble de valeurs 0 qui vont en diagonale - cela signifie que dans la boucle de correspondance, deux mots identiques sont - enfin, identiques.
Apple Apples Orange Oranges Banana Apple 0 1 5 6 6 Apples 1 0 6 5 6 Orange 5 6 0 1 5 Oranges 6 5 1 0 5 Banana 6 6 5 5 0
Le tableau $matches réel ressemble à ceci (tronqué) :
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
Quoi qu'il en soit, c'est à vous (par expérimentation) de déterminer à quoi correspond le plus souvent un bon seuil de distance numérique - puis de l'appliquer. Sinon, lisez sphinx-search et utilisez-le - car il possède des bibliothèques PHP.
Orange, content d'avoir posé la question ?