2010-05-20 11 views
5

Je travaille sur un programme de sondage où les gens recevront des considérations promotionnelles la première fois qu'ils remplissent un sondage. Dans de nombreux scénarios, la seule façon d'empêcher les gens de tromper le système et d'obtenir une promotion qu'ils ne méritent pas est de vérifier les chaînes d'adresses. Je cherchais à utiliser la distance levenshtein pour me donner un nombre pour mesurer la similarité, et considérer ceux en dessous d'un certain seuil un doublon. Cependant, si quelqu'un cherchait à jouer le système, ils pourraient facilement écrire "S 5th St" au lieu de "South Fifth Street", et levenshtein considérerait ces chaînes comme très différentes. Alors je pensais convertir toutes les chaînes en une forme d'adresse standard, c'est-à-dire que 'Sud' devient 's', 'Cinquième' devient '5ème', etc.algorithme de vérification des adresses pour les correspondances?

Puis je pensais que c'était sans espoir, et trop effort pour le faire fonctionner de manière robuste. Est-ce?

Je travaille avec PHP/MySql, donc j'ai les limitations inhérentes à ce système.

+1

Et si à la place de "S. 5th St." quelqu'un entre "S. 4th St."? Cela ne pourrait pas être utilisé pour jouer le système (en supposant que vous envoyez les choses promotionnelles), mais cela pourrait disqualifier les gens pour vivre un bloc plus. Juste un cas de bord à tester. –

+0

@Bill ce scénario n'est pas un problème car alors ils ne recevraient pas leur considération promotionnelle. À moins qu'ils ne soient de mèche avec les gens qui habitent à l'adresse de cette maison sur la 4e rue, mais il y a seulement tellement de foyers avec lesquels ils peuvent conspirer. C'est auto-limitant, je pense :) – user151841

+0

@ user15841: Non, je veux dire que si ces deux personnes s'inscrivent légitimement indépendamment les uns des autres? Votre algorithme doit être assez intelligent pour voir la différence entre ces deux adresses, mais aussi assez intelligent pour que les exemples originaux que vous avez donnés soient les mêmes. –

Répondre

3

Je pense que votre deuxième idée est meilleure que l'utilisation de la distance de Levenshtein. Si vous essayez de comparer les adresses pour similitude, alors deux personnes différentes qui vivent à proximité les uns des autres pourraient accidentellement "tricher" les uns les autres hors de leur prix. Si je vis à "S. 4th St." mais mon voisin à "S. 5th St." déjà inscrit, ces deux adresses peuvent sembler trop proches de la distance Lev.

Vous pourriez réduire (mais probablement pas éliminer) beaucoup de tricherie potentielle en exécutant des adresses via un normalisateur de synonymes. Avant de vérifier l'égalité, juste convertir

Nord -> N.
Est -> E.
...
Première -> 1er
Deuxième -> 2ème
Troisième -> 3ème
. ..
Rue -> Rue
Avenue -> Ave.

Plus la liste de synonymes proposée est longue, plus il sera facile d'attraper des correspondances. Ce sera un peu plus lent au traitement, mais les adresses sont minuscules.

Ceci est similaire à la conversion de chaînes à tous les cas inférieur (ou supérieur) avant de les comparer. (Ce que je recommande également, naturellement.)

+0

Oh, enfin je comprends ce que vous dites! Je n'ai pas utilisé levenshtein, donc je n'étais pas assez familier avec ça pour prévoir comment cette situation se produirait :) – user151841

+0

En outre, il faut noter que plusieurs résidents peuvent vivre dans le même bâtiment ... C'est là que ça devient difficile , même après la normalisation. Par exemple "511 N 15ème Rue, Unité 123" contre "511 NORD 15ème Rue, Apt 124" –

+1

Vous devriez aussi utiliser la comparaison de distance de corde sur les synonymes. Sinon "Sud" deviendra "S", mais "Soith" (typo) ne le sera pas, et "Soith" -> "S" ne sera pas similaire. Sachez également que des milliers de caractères Unicode produisent des caractères qui ressemblent à des caractères z, mais ne le sont pas. En outre, "Street" -> "St." peut conduire à un faux positif pour l'abréviation "Saint". –

0

Vous pouvez utiliser l'API Google Map (ou toute autre API de mappage) pour normaliser les adresses en tant que géolocalisation (lat/long).

+1

Ne fonctionnerait pas parce que la majorité de ces API géospatiales ne tiennent pas compte des numéros d'appartement (par exemple, 12e étage 6e chambre). – code4life

+0

Oui, une telle normalisation ne serait pas exacte à 100% et vous devrez également effectuer des vérifications supplémentaires. –

0

Voir thesequestions pour une discussion connexe.

  • Normaliser d'abord vos données autant que possible:

    avenue -> ave route -> e Rd.-> e

    premier -> 1 1er -> 1

Vous pouvez regarder dans SOUNDEX ou quelque chose de similaire pour attraper les cas où les mots sonores identiques, mais ont une orthographe différente (par exemple, Schmitt, Schmitd, Smith) . SOUNDEX fonctionne au niveau des mots, vous devez donc d'abord scinder l'adresse en mots et comparer les valeurs de SOUNDEX.


Vous pouvez également alimenter les adresses à un service de géo-localisation tels que Google Maps, magasin longitude et la latitude résultant de votre base de données. Quand une nouvelle adresse est entrée, vous obtenez juste sa longitude/latitude et la comparez aux emplacements existants dans votre base de données. See this question pour plus de détails.

Questions connexes