En PHP, la fonction Levenshtein est une fonction utilisée pour calculer la distance d'édition entre deux chaînes, qui est généralement utilisée pour implémenter la correspondance floue. Il évalue la similitude en comptant le nombre minimum d'opérations d'insert, de suppression et de remplacement requises pour se convertir d'une chaîne à une autre. Bien que la fonction Levenshtein elle-même soit très utile, dans certains scénarios de correspondance de chaînes complexes, nous pouvons vouloir l'utiliser en combinaison avec des expressions régulières pour obtenir des capacités plus puissantes lors de la mise en œuvre de correspondance floue flexible.
La syntaxe de base de la fonction Levenshtein est la suivante:
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$cost_ins</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$cost_rep</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$cost_del</span></span><span> = </span><span><span class="hljs-number">1</span></span><span> ] )
</span></span>
$ STR1 et $ STR2 sont deux chaînes à comparer.
Les $ Cost_ins , $ Cost_rep et $ Cost_del, représentent les coûts des opérations d'insertion, de remplacement et de suppression, respectivement (la valeur par défaut est 1).
La valeur de retour de la fonction est un entier représentant l'opérande minimum requis pour convertir la chaîne $ str1 en $ str2 . Par exemple, Levenshtein ('Kitten', 'Sitting') renvoie 3, car la transition du "chaton" à "S" nécessite trois opérations: remplacer "k" à "s", remplacer "e" à "i" et ajouter "g".
Les expressions régulières (regex) sont des outils puissants pour correspondre aux modèles de chaîne. En PHP, les fonctions de correspondance régulières couramment utilisées incluent Preg_Match , Preg_Match_all , Preg_Replace , etc. Les expressions régulières peuvent être utilisées pour la correspondance, la recherche, le remplacement et les autres opérations de modèle, et sont particulièrement adaptés pour traiter des problèmes complexes de correspondance de chaînes.
Bien que Levenshtein et les expressions régulières soient deux outils puissants, ils ne sont pas naturellement "combinés". Levenshtein calcule la distance entre deux chaînes, tandis que des expressions régulières sont utilisées pour correspondre aux modèles. Ils peuvent se compléter dans certains cas.
Supposons que nous voulons trouver le mot le plus similaire au mot entré par l'utilisateur à partir d'une chaîne contenant plusieurs mots. Nous pouvons utiliser la fonction Levenshtein pour calculer la similitude entre chaque mot et la chaîne entrée par l'utilisateur, sélectionnant ainsi le mot le plus proche.
<span><span><span class="hljs-variable">$words</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"orange"</span></span><span>, </span><span><span class="hljs-string">"grape"</span></span><span>, </span><span><span class="hljs-string">"kiwi"</span></span><span>];
</span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-string">"applw"</span></span><span>; </span><span><span class="hljs-comment">// Mots flous entrés par l'utilisateur</span></span><span>
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$min_distance</span></span><span> = PHP_INT_MAX;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$words</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$word</span></span><span>) {
</span><span><span class="hljs-variable">$distance</span></span><span> = </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, </span><span><span class="hljs-variable">$word</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$distance</span></span><span> < </span><span><span class="hljs-variable">$min_distance</span></span><span>) {
</span><span><span class="hljs-variable">$min_distance</span></span><span> = </span><span><span class="hljs-variable">$distance</span></span><span>;
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-variable">$word</span></span><span>;
}
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Les mots les plus similaires sont: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>
Dans cet exemple, nous traversons tous les mots, utilisons la fonction Levenshtein pour calculer la distance du mot entré par l'utilisateur et finalement sélectionner les mots les plus similaires.
Dans certains cas, vous voudrez peut-être correspondre d'abord certains modèles de base avec des expressions régulières, puis de faire une correspondance plus précise via Levenshtein . Par exemple, si l'utilisateur entre dans un modèle rugueux (comme un préfixe ou un suffixe), vous pouvez utiliser des expressions régulières pour filtrer les correspondances potentielles, puis utiliser Levenshtein pour trouver les résultats les plus similaires.
<span><span><span class="hljs-variable">$words</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"orange"</span></span><span>, </span><span><span class="hljs-string">"grape"</span></span><span>, </span><span><span class="hljs-string">"kiwi"</span></span><span>];
</span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-string">"applw"</span></span><span>; </span><span><span class="hljs-comment">// Mots flous entrés par l'utilisateur</span></span><span>
</span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-string">"/^ap/"</span></span><span>; </span><span><span class="hljs-comment">// Expressions régulières,Associer "ap" Le mot qui commence</span></span><span>
</span><span><span class="hljs-comment">// Utilisez des mots filtrants réguliers qui correspondent au modèle</span></span><span>
</span><span><span class="hljs-variable">$matches</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_grep</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$words</span></span><span>);
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$min_distance</span></span><span> = PHP_INT_MAX;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$matches</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$match</span></span><span>) {
</span><span><span class="hljs-variable">$distance</span></span><span> = </span><span><span class="hljs-title function_ invoke__">levenshtein</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, </span><span><span class="hljs-variable">$match</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$distance</span></span><span> < </span><span><span class="hljs-variable">$min_distance</span></span><span>) {
</span><span><span class="hljs-variable">$min_distance</span></span><span> = </span><span><span class="hljs-variable">$distance</span></span><span>;
</span><span><span class="hljs-variable">$closest_match</span></span><span> = </span><span><span class="hljs-variable">$match</span></span><span>;
}
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Les mots les plus similaires sont: <span class="hljs-subst">$closest_match</span></span></span><span>";
</span></span>
Dans cet exemple, nous filtrons d'abord tous les mots commençant par "AP" à travers des expressions régulières, puis utilisons Levenshtein pour trouver davantage les mots les plus similaires. Cette approche est particulièrement utile lorsque vous connaissez certaines conditions de correspondance (telles que les préfixes, les suffixes ou les modèles de caractères spécifiques), filtrant des options inutiles grâce à des expressions régulières, améliorant ainsi l'efficacité.
Améliorer la précision de correspondance : grâce à des expressions régulières, vous pouvez pré-filtrer les chaînes qui remplissent certaines conditions, puis calculer finement la chaîne la plus proche par levenshtein .
Optimiser les performances : si votre ensemble de données est important, le filtrage des correspondances à l'avance par des expressions régulières peut éviter les calculs de Levenshtein sur toutes les chaînes, améliorant ainsi les performances.
Flexibilité : les expressions régulières peuvent gérer l'appariement des motifs complexes, tels que la sensibilité à la casse, la correspondance de certains jeux de caractères spécifiques, etc., tandis que Levenshtein peut être utilisé pour faire davantage des comparaisons de similitude de chaînes filtrées.
Bien que Levenshtein et les expressions régulières semblent être deux outils distincts, leur combinaison peut fournir à PHP des capacités de correspondance floues plus puissantes dans le développement réel. En filtrant d'abord les expressions régulières, puis en utilisant Levenshtein pour calculer avec précision, la précision et l'efficacité de l'appariement peuvent être efficacement améliorées. Selon les besoins, vous pouvez choisir de manière flexible la combinaison de ces deux pour mieux répondre aux scénarios d'application spécifiques.