2009-11-12 9 views
3

Je me demande s'il existe une façon de faire une chaîne floue en PHP. Chercher un mot dans une longue chaîne, trouver une correspondance potentielle même si elle est mal orthographiée; quelque chose qui le trouverait s'il était éteint par un caractère en raison d'une erreur d'OCR.Recherche de texte floue: Générateur de recherche générique Regex?

Je pensais qu'un générateur de regex pourrait être capable de le faire. Donc, étant donné une entrée de « fou », il générerait cette regex:

.*((crazy)|(.+razy)|(c.+azy)|cr.+zy)|(cra.+y)|(craz.+)).* 

Il retournerait alors tous les matches pour ce mot ou des variations de ce mot.

Comment construire le générateur: je ne serais probablement diviser la chaîne/mot de recherche vers le haut dans un tableau de caractères et de construire l'expression regex faire un foreach le tableau nouvellement créé en remplaçant la valeur de clé (la position de la lettre dans la chaîne) avec ". +".

Est-ce un bon moyen de faire de la recherche de texte flou ou existe-t-il un meilleur moyen? Qu'en est-il de la comparaison de chaînes qui me donne un score basé sur la proximité? J'essaie de voir si un texte OCR mal converti contient un mot en un mot.

+2

Votre regex est faux - remplacer '+' 'avec .' – Amarghosh

+0

merci pour la pointe, fixe la question avec + – mikeytown2

+0

' c + azy' va correspondre 'calksjdazy' -' c' suivi d'un ou plusieurs caractères suivis de 'azy'. Pour un seul caractère, utilisez 'c.azy' – Amarghosh

Répondre

6

fonctions de distance de chaîne sont inutiles lorsque vous ne savez pas ce que le mot est. Je vous suggère de fonctions pspell:..

$p = pspell_new("en"); 
print_r(pspell_suggest($p, "crazzy")); 

http://www.php.net/manual/en/function.pspell-suggest.php

+0

Ah, ça montre que je suis novice en PHP: je n'ai jamais entendu parler de cette méthode! Excellente suggestion, cela devrait être voté. +1 –

+0

+1 pour montrer qu'il y a quelque chose de nouveau à apprendre tous les jours! Notez cependant que 'pspell_suggest', lorsqu'il reçoit un mot correctement orthographié, ne vous donnera pas d'options pour une faute d'orthographe. Par conséquent, cela ne fonctionnera pas vraiment ce dont le PO a besoin. –

1

Levenshtein est un exemple de chaîne Edit-distance. Il existe différentes métriques à des fins différentes. Familiarisez-vous avec eux et trouvez celui qui fonctionne pour vous.

1
echo generateRegex("crazy"); 
function generateRegex($word) 
{ 
    $len = strlen($word); 
    $regex = "\b((".$word.")"; 
    for($i = 0; $i < $len; $i++) 
    { 
    $temp = $word; 
    $temp[i] = '.'; 
    $regex .= "|(".$temp.")"; 
    } 
    $regex = $regex.")\b"; 
    return $regex; 
} 
+0

OP a demandé une solution basée sur PHP. –

+0

D'accord. Mais est-ce difficile de traduire cela? – Amarghosh

+0

traduit en php - cliquez sur le lien viewsource dans le diff pour voir la version java. – Amarghosh

Questions connexes