2013-10-06 7 views
3

1 nécessitant l'analyse des documents juridiques pour trouver une adresse à l'intérieur. Ci-dessous un exempleRails pour motif regex domicile

test = « 9999 les carottes lorem de ipsum, des rabais améliorés, mais ils le temps et la vitalité occaecat, comme le travail et l'obésité. Au fil des ans viennent, qui nostrud exercice, le travail du district scolaire 123 un oiseau 12 e, une ville, NY, 10005, mais à aliquip ex ea commodo consequat. Duis, cependant, cupidatat douleur à trouver dans le plaisir d'un désir d'être 124 une grêle, 12 e, une ville, NY, 10005cillum et dolore magna fuir ne produit pas obtenu. Excepteur ils sont noirs cupidatat pas excepteur sont à blâmer pour ces services ne esprit doux qui est la fatigue. carottes Lorem ipsum, des rabais améliorés sed125 un oiseau 12 st, une ville, NY, 10005 donner le temps de occaecat et de vitalité au travail 126 quelque chose quelque chose, une ville, New York et dolore magna aliqua. enim ad minim Ut, je viendrai, qui sera nostrud exercice, aliquip hors de son l'avantage des efforts de relance si le district scolaire comme un problème. Vous voulez être une douleur dans le cupidatat cillum a été critiqué dans le Duis et dolore magna fuyez ne produit aucun plaisir résultant. Excepteur sont noirs cupidatat pas excepteur sont à blâmer pour ces services ne esprits doux que cela va changer. «

tmp = test.scan(/(\d{3,6})(.*?)(\d{5})/) 
tmp.each do |t| 
    puts t.join() 
end 

Normalement, les adresses commencerait par un numéro et se terminer par un code postal, mais dans ces documents est pas toujours le cas

le problème est que certains 1 manquez et d'obtenir des résultats indésirables comme:.

9999 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris 123 some ave 12 st, some city, NY, 10005 
124 some ave 12 st, some city, NY, 10005 
125 some ave 12 st, some city, NY, 10005 
126 SOMETHING SOMETHING, SOME CITY, NEW YORK et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum 11111 

ce que 1 voudrait est un tableau des 4 éléments suivants:

123 some ave 12 st, some city, NY, 10005 
124 some ave 12 st, some city, NY, 10005 
125 some ave 12 st, some city, NY, 10005 
126 SOMETHING SOMETHING, SOME CITY, NEW YORK 

Quant au dernier élément 1 suis assez sûr que toutes les adresses au format comme celui-ci finiraient soit « New York » ou « NY ».

pense que mon motif cible est 1:

/(ANY DIGITS BETWEEN 3 AND 6)(AT LEAST 3 WORDS BUT NOT MORE THAN 10)((TRY FIRST ZIPCODE)|(IF NO ZIP CODE THEN TRY "NEW YORK" OR "NY"))/i 

Toute aide serait grandement apprécié.

+1

Voir cette question et la réponse de Matt: http://stackoverflow.com/questions/9397485/regex-street -address-match – michaelmichael

+0

Regardé l'application smarty street, génial, mais il déduit mon compte par plus d'adresses qu'il ne le trouve donc lors de l'analyse d'un document réel qui devrait produire 3 adresses valides, il a consommé 7 demandes. À ce rythme, cela coûterait trop cher. De plus, il manque des adresses qui ressemblent à "someText127 some street, some city, NY, 10005", notez qu'il n'y a pas d'espace entre le texte et le début du numéro de la maison. – pcasa

+0

Droite. Comme l'indique la réponse liée, les adresses de rue ne sont pas une langue régulière. Extraire de manière fiable des adresses de rue à partir de documents juridiques en utilisant simplement des expressions régulières n'est pas réalisable. Il sera très sujet aux erreurs. – michaelmichael

Répondre

0

michaelmichael et stackoverflow.com/questions/9397485/regex-street-address-match Comme indiqué, il n'y a vraiment aucun moyen de scanner pour traiter correctement, peu moins lorsque les documents ont d'énormes quantités de caractères comme l'exemple d'origine montre.Donc, je l'ai cassé en 2 parties. Tout d'abord, une fonction qui analyse les modèles ressemblant à une adresse.

# First scan for possible addresses 
def look_for_address_patterns(txt) 
    resp = [] 
    # this looks for a number that is between 2-6 digits long (similar to house address) 
    # Second part adds an anchor to the next character following it and grabs the next 1-15 items (space or txt) 
    # proceeding to either 5 digits (zip code) or ending with State Name/abbrev 
    scan = txt.scan(\d{2,6})(\s*(\S+\s+){1,15})((?:\d{5})|(?:NEW YORK|NY)) 
    scan.each do |s| 
    resp.push s.join() 
    end 
    # Go to step 2 for verifying address before returning anything 
    verify_address(resp) 
end 

Maintenant, nous utilisons un service comme Google, Yahoo ou Mapquest pour vérifier les adresses

def verify_address(arry) 
    verified = [] 
    arry.each do |addr| 
    url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + addr 
    response = JSON.parse(open(url).read) 
    # compare that we got something similar in address response, remove SW and from Lane to ln is ok, but anything else is probably a different address 
    matched = addr.downcase[0..8] == response['results']['formatted_address'].downcase[0..8] 
    # should be storing more info like lat/lng but that is for a later project 
    verified.push(response['results']['formatted_address']) if matched 
    end 
    return verified 
end 

Ce que je sais à ce jour. La première partie fonctionne plutôt bien, mais donne des faux positifs aussi bien que des faux négatifs (dans certains cas, elle rate complètement une adresse). La deuxième partie aide à éliminer les faux positifs et donne un meilleur format d'adresse (les adresses légales ne sont pas toujours meilleur).

Les résultats capturent @ 85% de toutes les adresses du document qui, pour mon projet, sont acceptables. Je suis sûr qu'avec quelques ajustements je peux apporter ceci, ainsi des maîtres de Regex s'il vous plaît n'hésitez pas à briller.

1

Voici ce que m'a travaillé pour analyser les informations de textes juridiques:

  1. Briser la tâche compliquée vers le bas dans les plus simples. Écrire un regex (ou d'une fonction utilisant l'expression rationnelle) pour chaque variation d'adresses que vous voulez capturer.

  2. cas de test d'écriture pour chaque variation. Voici les tests couple 1 a écrites pour une analyse syntaxique du numéro à titre d'exemple.

 
    test '554' do                     
     assert_equal 554, number_parser.parse('five hundred fifty-four')        
    end                        

    test '1301' do                     
     assert_equal 1301, number_parser.parse('thirteen hundred one')         
    end                        
  1. Puisque vous savez ce que la gamme est d'une valeur telle que les abréviations de l'État et de l'État, vous pouvez intégrer ces connaissances dans vos fonctions pour analyser les variations.
+0

Ecrire une fonction pour analyser les informations est correct, mais c'est ce que je suis en train de créer. Sur la base de votre réponse, j'ai été en mesure d'obtenir un flux de travail acceptable pour obtenir ce dont j'avais besoin, alors j'ai corrigé votre réponse et vous fournirai exactement ce que j'ai fait. – pcasa