Mysql
 sql >> Base de données >  >> RDS >> Mysql

correspondance de recherche php (floue)

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 ?