2010-10-15 35 views
14

Je vais expliquer mon problème:Comment trouver un mot similaire pour un mot mal orthographié en PHP?

J'ai une table de base de données appelée country. Il a deux colonnes: ID et name.

Quand je veux chercher 'paris', mais mal orthographié le mot: 'pares' ('e' au lieu de 'i'), je ne vais pas tout résultat de DB.

Je veux que le système suggère des mots similaires qui pourraient aider à la recherche.

Donc, je suis à la recherche de l'aide à écrire un script qui fait des suggestions de la base de données qui contiennent des mots similaires comme: paris, paredes, etc ...

Répondre

20

En PHP, vous devez utiliser metaphone il est plus précis que soundex.

Mais votre problème est d'obtenir les données de la base de données. Vous n'avez pas mentionné la DB. En MySQL, vous pouvez utiliser la fonction SOUNDEX. Vous avez juste besoin de changer votre clause where dans la requête de

...where city = '$input_city' 

à

... where soundex(city) = soundex('$input_city') 

ou mieux encore, vous pouvez utiliser l'opérateur SOUNDS LIKE comme

... where city sounds like '$input_city' 
+0

** Note **: 'soundex' est bon pour Mots et entiers anglais, mais problème d'autres langues. – Eray

+0

@codaddict Y a-t-il un moyen de commander par pertinence? –

4

Fondamentalement, vous devez vérifier la similarité contre un tableau valide de noms lorsque vous avez obtenu aucun résultat de votre DB.

Mon idée:

  • utilisateur recherche un nom
  • Aucun résultat exact
  • Fetch tous les noms de db
  • En utilisant levenshtein calculer la pointe la plus exacte pour l'utilisateur de retourner
9

soundex retournera un code numérique pour un mot qui représente son son. Les mots qui semblent similaires auront le même code soundex. Vous pourriez avoir une table avec des mots et leurs codes soundex que vous pourriez utiliser pour rechercher des mots de sondage similaires. Vous pouvez ensuite les trier en utilisant leur distance levenshtein.

Si vous cherchez quelque chose de plus simple et vous voulez juste gérer les fautes de frappe dans vos requêtes DB, vous pouvez faire

select * from country where city SOUNDS LIKE 'Paris' au lieu de select * from country where city='Paris'

2

Si vous utilisez MySQL, vous aurez besoin d'utiliser une instruction MATCH() AGAINST(), où MATCH() reçoit une liste délimitée par des virgules des colonnes FULLTEXT et AGAINST() en votre chaîne pour faire correspondre. L'instruction renvoie la pertinence de votre correspondance (entre 0 et 1) que vous pouvez utiliser pour déterminer si vous souhaitez ou non renvoyer des lignes.

Plus d'informations sur le MySQL site.Éditer: les suggestions sonores sont de bonnes idées, cependant certaines fautes d'orthographe changeront complètement la prononciation d'un mot et ainsi vous ne pourrez peut-être pas fournir de bonnes suggestions si vous utilisez cette méthode.