algorithme pour la vérification des adresses pour les matchs?
Je suis en train de travailler sur un programme d'enquête où les gens seront de promotion des considérations la première fois qu'ils remplir un sondage. Dans beaucoup de scénarios, la seule façon que nous pouvons empêcher les gens de tricher le système et d'obtenir une promotion qu'ils ne méritent pas est de vérifier l'adresse de la rue chaînes de caractères les uns contre les autres.
J'ai été à la recherche à l'aide de levenshtein pour me donner un numéro à mesure de similarité, et de considérer ceux-dessous d'un certain seuil d'un duplicata.
Cependant, si quelqu'un était à la recherche de jeu, le système, ils pourraient facilement écrire "S 5th St" au lieu de "South Fifth Street", et de levenshtein examinera les chaînes de caractères très différents. Alors j'ai été pensée pour convertir toutes les cordes pour un "standard de l'adresse' c'est à dire dans le " Sud "devient " s", "Cinquième" devient "5ème", etc.
Alors je me disais que c'est sans espoir, et trop d'effort pour le faire fonctionner de manière fiable. S'agit-il?
Je travaille avec PHP/MySql, j'ai donc les limites inhérentes à ce système.
ce scénario n'est pas un problème, car alors ils ne seraient pas recevoir leurs offres promotionnelles. Sauf s'ils sont de connivence avec les gens qui habitent cette maison d'adresse sur la 4e rue, mais il ya seulement donc beaucoup de ménages, ils peuvent conspirer avec. C'est l'auto-limitation, je pense 🙂
Non, je veux dire que si ces deux personnes légitimement inscrire indépendamment les uns des autres? Votre algorithme doit être assez intelligent pour voir la différence entre ces deux adresses, mais également assez intelligent qu'il voit l'origine des exemples que vous avez donné comme le même.
Tu veux dire, si quelqu'un a accidentellement donne une autre adresse? Ouais, c'est un problème, mais je ne vois pas comment le système pouvait l'aborder sans être ouverte à d'autres jeux ("Êtes-vous sûr que vous avez voulu dire, 4e rue? Nous en avons déjà un pour cette adresse. Soin d'essayer de nouveau?" )
Non, je voulais dire que si deux personnes vivant à de très similaire, mais différent des adresses de signer tous les deux, l'un d'entre eux risquent de ne pas obtenir leur prix.
OriginalL'auteur user151841 | 2010-05-20
Vous devez vous connecter pour publier un commentaire.
Je pense que ta deuxième idée, c'est mieux que d'utiliser la distance de Levenshtein. Si vous essayez de comparer les adresses pour similitude, puis deux personnes différentes qui vivent à proximité les uns des autres peut accidentellement "tricher" l'un l'autre de leur prix. Si je vis à "S. 4e Saint" mais mon voisin à "S. 5e Saint" déjà signé, ces deux adresses peuvent sembler trop similaire par Lev de la distance.
Vous pouvez réduire (mais probablement pas à l'éliminer), beaucoup de potentiel de la tricherie par l'exécution des adresses par le biais d'un synonyme normalisateur. Avant de vérifier l'égalité, il suffit de convertir
Nord -> N.
Est -> E.
...
Premier -> 1
Deuxième -> 2e
Troisième -> 3e
...
Rue -> Saint
Avenue -> Ave.
Plus la liste des synonymes, vous venez avec, le mieux ce sera pour attraper les matchs. Il sera un peu plus lent au traitement, mais les adresses sont minuscules.
Ceci est similaire à la conversion de chaînes en bas (ou en haut) avant de les comparer. (Qui, je vous le recommande, naturellement.)
En outre, il doit être noté que plusieurs résidents peuvent vivre dans le même bâtiment... c'est là Que ça devient délicat, même après normalisation. Par exemple, "511 N 15th St, Unit 123" vs "511 NORD 15e de Saint, Apt 124"
Vous devriez envisager d'utiliser la chaîne de la distance de comparaison sur la synonymes de trop. Sinon "Sud" se transforme en "S", mais "Soith" (faute de frappe) ne sera pas, et "Soith"->"S" n'est pas similaire. Aussi, soyez conscient qu'il ya des milliers de caractères unicode qui produira des personnages qui ressemblent a-z personnages, mais ne le sont pas. En outre, "la Rue"->"Saint" peut conduire à un faux positif pour le 'Saint' abréviation de "Saint".
En outre, il contribue de manière significative à extraire le nombre de pièces et le texte des pièces, et le poids des nombres similaires de plus que dissemblables des jetons de texte. (Dans cette situation, je considère le Jaro-Winkler distance d'édition sur la distance de Levenshtein pour comparer les jetons de texte, depuis 'Ave'-'Avenue' est dans un bon seuil, tandis que ce ne serait pas pour lev. distance.)
OriginalL'auteur Bill the Lizard
Vous pouvez utiliser l'API Google Map (ou tout autre mappage API) afin de normaliser les adresses que la géo-localisation (latitude/longitude).
Oui, cette normalisation ne pas être précis à 100% et vous aurez besoin de faire des vérifications supplémentaires.
OriginalL'auteur Franci Penov
Voir ces questions pour la discussion à ce sujet.
Normaliser vos données d'abord, autant que possible:
avenue -> ave
route -> rd
Rd. -> rd
premier -> 1
1er -> 1
Vous pourriez regarder dans SOUNDEX ou quelque chose de similaire pour attraper les cas où les mots semblent identiques, mais présentent orthographe différente (par exemple, Schmitt, Schmitd, Smith). SOUNDEX travaux sur word de niveau, de sorte que vous aurez besoin de diviser adresse à des mots d'abord, et de comparer les SOUNDEX valeurs.
Vous pouvez également nourrir les adresses de certains géo-localisation des services tels que Google Maps, magasin résultant de la longitude et de la latitude de votre base de données. Quand une nouvelle adresse est entré, vous venez juste d'obtenir sa longitude/latitude et de comparer avec les sites existants dans votre base de données.
Voir cette question pour plus de détails.
OriginalL'auteur Juha Syrjälä