Maison >base de données >tutoriel mysql >Comment puis-je implémenter une correspondance floue de nom d'entreprise dans MySQL avec PHP pour la saisie semi-automatique ?
Correspondance floue du nom de l'entreprise dans MySQL avec PHP pour la saisie semi-automatique
Introduction
Recherche Les correspondances floues pour les noms d’entreprises sont une tâche courante dans les systèmes de saisie semi-automatique. Cette tâche peut être difficile en raison du grand nombre d'entreprises potentiellement correspondantes et de la nécessité d'algorithmes de recherche efficaces.
Indexation Soundex
Une approche de la correspondance floue consiste à utiliser Soundex indexage. Soundex est un algorithme phonétique qui code les mots en fonction de leur prononciation. Cela permet une correspondance approximative des mots, même s'ils ont des orthographes différentes. Cependant, l'indexation Soundex présente des limites, comme l'impossibilité de différencier les chaînes plus longues et l'exigence que la première lettre soit la même.
Distance de Levenshtein
Une approche plus avancée à la correspondance floue consiste à utiliser la distance de Levenshtein. La distance de Levenshtein mesure le nombre d'insertions, de suppressions ou de substitutions nécessaires pour transformer une chaîne en une autre. Contrairement à Soundex, cette méthode ne présente pas les inconvénients mentionnés précédemment.
Utilisation de Levenshtein Distance en PHP
Le site Web codejanitor.com fournit un exemple de fonction stockée MySQL qui calcule la distance de Levenshtein. Vous pouvez utiliser cette fonction pour effectuer une correspondance floue sur les noms de sociétés comme suit :
// Load MySQL stored function (if not already loaded) if (!function_exists('Levenshtein')) { $sql = "CREATE FUNCTION Levenshtein(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT BEGIN DECLARE lv_s1, lv_s2 VARCHAR(255); DECLARE lv_len1, lv_len2, lv_i, lv_j, lv_c, lv_cost INT; DECLARE lv_arr1[255] INT; SET lv_s1 = LOWER(s1); SET lv_s2 = LOWER(s2); SET lv_len1 = LENGTH(lv_s1); SET lv_len2 = LENGTH(lv_s2); -- Initialize the array SET lv_arr1[1] = 0; FOR lv_i = 1 TO lv_len1 DO SET lv_arr1[lv_i + 1] = lv_i; END FOR; -- Step 2 FOR lv_j = 1 TO lv_len2 DO SET lv_c = lv_j; FOR lv_i = 1 TO lv_len1 DO IF SUBSTRING(lv_s1, lv_i, 1) = SUBSTRING(lv_s2, lv_j, 1) THEN SET lv_cost = 0; ELSE SET lv_cost = 1; END IF; SET lv_c = LEAST(lv_c + 1, lv_arr1[lv_i] + lv_cost, lv_arr1[lv_i - 1] + 1); SET lv_arr1[lv_i] = lv_c; END FOR; END FOR; RETURN lv_c; END;"; $result = $mysqli->query($sql); } // Execute fuzzy matching query $numWords = 0; $userInput = "Microsift"; $query = "SELECT company_name, Levenshtein('$userInput', company_name) AS distance FROM companies ORDER BY distance ASC"; $result = $mysqli->query($query); // Display results while ($row = $result->fetch_assoc()) { $numWords++; echo $row['company_name'] . " (" . $row['distance'] . ")\n"; } if ($numWords == 0) { echo "No matches found.\n"; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!