2013-10-06 20 views
3

1需要通過一些法律文件解析到裏面找到他們的任何地址。下面是一個例子Rails的正則表達式的家庭住址

測試=「9999個Lorem存有胡蘿蔔,增強回扣,但他們occaecat時間和活力,如勞動力和肥胖。多年來來,誰nostrud鍛鍊,學區工作123一些鳥12日,一些城市,NY,10005,但要aliquip前EA commodo consequat。DUIS,然而,cupidatat痛苦的慾望的快感發現是124的一些冰雹,12日,一些城市,NY,10005cillum等dolore麥格納逃離不產生任何結果。Excepteur他們是黑人cupidatat不excepteur都歸咎於這些服務不能軟的頭腦,是疲勞。Lorem存有胡蘿蔔,增強回扣sed125一些鳥類12日,一些市,NY,10005給occaecat時間和活力的工作126一些東西,一些城市,新紐約等dolore麥格納aliqua。UT enim廣告微量我會來,誰應nostrud鍛鍊, aliquip了她刺激計劃的優勢,如果學區是一個問題。想成爲在cupidatat cillum疼痛已經在DUIS等dolore麥格納被批評逃離產生任何結果的樂趣。 Excepteur是黑人cupidatat不excepteur都歸咎於這些服務故障弱化的頭腦,它會改變。「

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

通常情況下,這些地址將開始以數字和一個郵政編碼結束,但在這些文檔並非總是如此

問題是,一些1次錯過,並得到一些不想要的結果一樣:

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 

想什麼1是以下4個項目的數組:

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 

至於最後一個項目,1個敢肯定,此格式的所有地址會最終無論是「紐約」或「NY」。

覺得我的目標模式是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 

任何幫助將不勝感激。

+1

看到這個問題和馬特的答案:http://stackoverflow.com/questions/9397485/regex-street地址匹配 – michaelmichael

+0

看着聰明的街道,真棒應用程序,但它比我們發現的地址多得多地扣除我的帳戶,所以當解析實際的文檔時,它應該產生3個有效地址,它消耗了7個請求。以這樣的速度,它會花費太多。此外,它忽略了「SomeText127 some street,some city,NY,10005」的地址,注意文本和房屋號碼開始之間沒有間隔。 – pcasa

+0

對。正如鏈接的答案所述,街道地址不是常規語言。僅使用正則表達式從法律文檔中可靠地提取街道地址是不可行的。這將很容易出錯。 – michaelmichael

回答

0

michaelmichael和stackoverflow.com/questions/9397485/regex-street-address-match如前所述,實在沒辦法掃描妥善解決,少一點文件的時候有巨大數量的字符作爲最初的例子顯示。

所以我把它分成兩部分。

首先,掃描類似於地址的模式的函數。

# 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 

現在我們使用像谷歌,Mapquest服務或雅虎的服務來驗證地址

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 

我所知道的這麼遠。第一部分工作得很好,但給出了假陽性和假陰性(在某些情況下,它完全錯過了一個地址)。第二部分有助於清除假陽性,並提供更好的地址格式(合法地址並不總是最好)。

結果正在捕獲文檔中所有地址的85%,這對我的項目來說是可以接受的。我肯定有一些微調我可以提出這個,所以正則表達式大師請隨時發光。

1

這裏是爲我工作了,從法律文本解析信息:

  1. 向下打破複雜的任務成簡單的。寫一個正則表達式(或使用正則表達式的功能),你想捕捉每個地址的變化。

  2. 編寫測試用例每個變化。這裏有幾個測試1寫了一些語法作爲一個例子。

 
    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. 既然你知道的範圍是一些值,比如狀態和狀態的縮寫是什麼,你可以將這些知識到您的函數解析的變化。
+0

編寫函數來解析信息是正確的,但這正是我正在創建的過程。基於你的回答,我能夠達到一個可以接受的工作流程,讓我得到我所需要的東西,所以我確定了你的答案,並提供了我所做的。 – pcasa