6
votes

Analyse des adresses de rue à Ruby

Je suis en train de traiter des adresses dans leur format de champ respectif pour la base de données. Je peux obtenir le numéro de la maison et le type de rue, mais essayant de déterminer la meilleure méthode pour obtenir la rue sans numéro et dernier mot. Une adresse de rue standard reçue serait:

    house = res[:address].gsub(/\D/, '')
    street_type = res[:address].split(/\s+/).last


3 commentaires

Simple, ne fais pas ça! Demandez les champs individuellement ou les stocker dans son ensemble. L'analyse ne sera jamais précise à 100% car la quantité de variation est supérieure à celle que vous ne pouvez comprendre. Si vous voulez un champ Numéro de maison (lequel vous ne devriez pas) avoir un champ House_Number dans le formulaire.


BTW: Il y a une API avec USPS. USPS.com/business/web-Tools-apis/welcome.htm < / a> Ils peuvent vérifier votre adresse et éventuellement vous donner une meilleure information détaillée.


La base de données de propriétés de base que je modifie avec les champs séparés de cette manière, c'est pourquoi la maison de terrain et le type de rue. J'ai aussi une adresse de rue complète. Je fais cela pour la cohérence dans les données dans la mesure du possible


5 Réponses :


11
votes

Je recommanderais d'utiliser une bibliothèque pour cela si possible, car l'analyse d'adresses peut être difficile. Découvrez le Indirizzo Ruby Gem, ce qui facilite la tâche:

address = Indirizzo::Address.new("7707 Foo Bar Blvd", :expand_streets => false)
address.street.map {|street| street.gsub(Indirizzo::Suffix_Type.regexp, '').strip }
 => ["foo bar"]


4 commentaires

Stuart J'ai regardé ce joyau mais je n'ai pas vu où il traitait de l'adresse de la rue sans le type de rue. À nouveau, il suffit de traiter d'essayer de faire correspondre les champs de données. J'ai une adresse de rue complète aussi bien pour rendre les choses plus faciles à tirer


Indirizzo ne semble pas avoir une méthode intégrée de séparation de la rue nom de son suffixe (par exemple "" blvd "). Mais il a ces suffixes comme des constantes (telles que indirizzo :: suffixe_type de constantes.rb . Vous pouvez les utiliser pour analyser les suffixes. J'ai mis à jour ma réponse. J'ai mis à jour ma réponse avec une suggestion sur la façon de faire ça.


Stuart Je vais donner que j'essaye, mais cela prendra un peu de temps pour vérifier la gemme au-delà de ce que j'ai fait auparavant. On dirait que cela pourrait fonctionner et peut-être je vais simplement éteindre mon code précédent. Rendra correct une fois testé. Pour le moment. Merci


Super. Faites-moi savoir si vous avez d'autres problèmes / questions et si cela finit par travailler pour que vous envisagez de marquer la question comme acceptée, THX.



1
votes

Vous pouvez peut-être utiliser quelque chose comme:

^ \ s + (. +?) \ s + $

\ s correspond à n'importe quel caractère d'espace non blanc

^ correspond au début de la chaîne

$ correspond à la fin de la chaîne

et (. +?) capture quoi que ce soit entre les deux.


0 commentaires

2
votes

Vous pouvez jouer rapidement et lâcher avec des groupes de capture nommés dans une regex xxx

ou si votre regex soit un peu plus précis avec le type que vous pourriez remplacer. (? . *) avec (? (BLVD | AVE | RD | ST)) et ajoutez toutes les différentes options que vous souhaitez


0 commentaires

0
votes

Vérifiez soigneusement votre jeu de données pour vous assurer que si ce problème ne vous a pas déjà été manipulé pour vous.

J'ai passé beaucoup de temps à créer une taxe de taxonomie de Nom de la rue probablement, à l'aide de conditionnels RegexP pour essayer de sortir le numéro de rue à partir des chaînes d'adresses complètes et de tout et il s'est avéré que la table des attributs de mes fichiers de formes avait déjà forte> segmente ces composants. P>

Avant de passer de l'avant avec le processus de Analyse des cordes d'adresse, qui est toujours un peu de corvée en raison des variations inévitablement étranges (certaines adresses de colis sont pour les colis sans littoral et ont des adresses étranges, etc.), assurez-vous que votre jeu de données ne l'a pas déjà fait pour vous !!! / p>


mais si vous ne le faites pas, exécutez les chaînes d'adresse, adresse.split ("") code> crée un tableau de "mots". Dans la plupart des cas, le premier "mot" est le numéro de rue. Cela a fonctionné pendant environ 95% de mes adresses. (Note: Mes: Adresse Strings ne contenait pas de ville, de comté, d'état, de zip, ils n'étaient que les adresses locales) p>

J'ai parcouru toute la population d'adresses et cueillies le dernier "mot" de chaque adresse & examiné ce tableau et cueilli tous les "mots" qui n'étaient pas "lane", "route", "rd" ou autre chose. Dans cette liste des terminaisons d'adresse J'ai créé cet énorme objet REGEXP correspondant P>

parcels.each do |p|
  remainder = p.address.split(" ")
  p.streetnum = remainder.shift
  p.streetname = remainder.join(" ").gsub(endings_matches, "")
  p.save
end


0 commentaires

0
votes

Je passe actuellement tout ce que je suis donné à GoogleMaps et que je vous amène à renvoyer une adresse de rue formatée très facile à analyser. XXX

Après cela, je viens de le diviser en rubis . avec .split (',') et .split ('')


0 commentaires