Parse usable स्ट्रीट एड्रेस, सिटी, स्टेट, जिप एक स्ट्रिंग से [बंद]


131

समस्या: मेरे पास एक एक्सेस डेटाबेस से एक पता फ़ील्ड है जिसे Sql Server 2005 में बदल दिया गया है। इस फ़ील्ड में सब कुछ एक फ़ील्ड में है। मुझे एक सामान्यीकृत तालिका में पते के अलग-अलग वर्गों को उनके उपयुक्त क्षेत्रों में पार्स करने की आवश्यकता है। मुझे लगभग 4,000 रिकॉर्ड के लिए ऐसा करने की आवश्यकता है और इसे दोहराने योग्य होना चाहिए।

मान्यताओं:

  1. अमेरिका में एक पता मान लें (अभी के लिए)

  2. मान लें कि इनपुट स्ट्रिंग में कभी-कभी एक पताका (जिस व्यक्ति को संबोधित किया जा रहा है) और / या दूसरी सड़क का पता होगा (यानी सूट बी)

  3. राज्यों को संक्षिप्त किया जा सकता है

  4. ज़िप कोड मानक 5 अंक या ज़िप + 4 हो सकता है

  5. कुछ उदाहरणों में टाइपो हैं

अद्यतन: सवालों के जवाब में, मानकों का सार्वभौमिक रूप से पालन नहीं किया गया था, मुझे व्यक्तिगत मूल्यों को संग्रहीत करने की आवश्यकता है, न कि केवल जियोकोड और त्रुटियों का मतलब टाइपो (ऊपर सही)

नमूना डेटा:

  • एपी क्रोल एंड सन 2299 लुईस-जॉर्जटाउन ह्वाय, जॉर्जटाउन, डीई 19947

  • 11522 शॉनी रोड, ग्रीनवुड डे 19950

  • 144 किंग्स हाईवे, SW Dover, DE 19901

  • इंटरग्रेटेड कॉन्सट। सेवाएं 2 क्वेस्ट वे सुइट 405 न्यू कैसल, डे 19720

  • ह्यूमस रियल्टी 33 ब्रिजल रिज कोर्ट, लुईस, डे 19958

  • निकोल्स खुदाई 2742 पुलस्की हवी नेवार्क, डीई 19711

  • 2284 ब्रायन ज़ियन रोड, स्मिर्ना, डे 19904

  • वीईआई डोवर चौराहा, एलएलसी 1500 सर्पेन्टाइन रोड, सुइट 100 बाल्टीमोर एमडी 21

  • 580 उत्तर ड्यूपॉन्ट राजमार्ग डोवर, डीई 19901

  • पीओ बॉक्स 778 डोवर, डे 19903


सवालों के जोड़े: 1. किसी भी सीमांकक? 2. स्ट्रिंग में फील्ड ऑर्डर क्या है? 3. डेटा त्रुटि के मामले में आप क्या व्यवहार चाहते हैं (SQL तालिका में एक ही फ़ील्ड में ईजी शव पता, दूसरों को खाली छोड़ दें)
Jay Mooney

अच्छा सवाल और बहुत दिलचस्प जवाब। ज़िप से पीछे की ओर काम करना एक सामान्य विषय लगता है, लेकिन अगर आप ग्राहकों से कच्चा डेटा ले रहे हैं तो ज़िप सटीक नहीं हो सकता है। मुझे लगता है कि ज्यादातर साइटों उदाहरण के लिए 90210 में पते की एक विषम संख्या है।
केविन विलियम्स

4
@ केविन: हाँ, क्योंकि आप अमेरिकियों को "ज़िप" कोड की आवश्यकता के द्वारा हमें कनाडाई बंद करना पसंद करते हैं, और हमारे डाक कोड स्वीकार नहीं करते हैं, इस प्रकार हमें सिस्टम को बायपास करने के लिए कुछ जिबरिश दर्ज करने के लिए मजबूर किया जाता है .... दुर्भाग्य से, एकमात्र ज़िप मैं पता है 90210 :-) संपादित करें: कोई बात नहीं ... आप जाहिरा तौर पर बीसी में मुझसे कुछ किलोमीटर दूर रहते हैं। आप शायद ऐसा ही करते हैं:
एमपीएन

2
इस के एक विस्तृत अवलोकन के लिए यह SO प्रश्न देखें ।
मैट

जवाबों:


118

मैंने इस तरह के पार्सिंग पर बहुत काम किया है। क्योंकि ऐसी त्रुटियां हैं जिनसे आपको 100% सटीकता प्राप्त नहीं होगी, लेकिन कुछ चीजें हैं जो आप कर सकते हैं ताकि अधिकांश तरीके से वहां पहुंच सकें, और फिर एक विज़ुअल बीएस टेस्ट करें। यहाँ इसके बारे में जाने का सामान्य तरीका है। यह कोड नहीं है, क्योंकि यह लिखने के लिए बहुत ही अकादमिक है, कोई अजीब नहीं है, बस बहुत सारे स्ट्रिंग हैंडलिंग हैं।

(अब जब आपने कुछ नमूना डेटा पोस्ट किया है, तो मैंने कुछ छोटे बदलाव किए हैं)

  1. पिछड़े काम करते हैं। ज़िप कोड से शुरू करें, जो अंत के पास होगा, और दो ज्ञात प्रारूपों में से एक: XXXXX या XXXXX-XXXX। यदि यह प्रकट नहीं होता है, तो आप मान सकते हैं कि आप शहर, राज्य के हिस्से में, नीचे हैं।
  2. अगली बात, जिप से पहले, राज्य होने जा रहा है, और यह या तो दो-अक्षर के प्रारूप में होगा, या शब्दों के रूप में। तुम्हें पता है कि ये क्या होंगे, भी - उनमें से केवल 50 हैं। इसके अलावा, आप वर्तनी की त्रुटियों की भरपाई में मदद करने के लिए शब्दों को ध्वनिबद्ध कर सकते हैं।
  3. इससे पहले कि शहर है, और यह शायद राज्य के रूप में एक ही पंक्ति पर है। आप ज़िप के आधार पर शहर और राज्य की जांच करने के लिए एक ज़िप-कोड डेटाबेस का उपयोग कर सकते हैं , या कम से कम बीएस डिटेक्टर के रूप में इसका उपयोग कर सकते हैं।
  4. सड़क का पता आमतौर पर एक या दो लाइनों का होगा। दूसरी पंक्ति आम तौर पर सुइट संख्या होगी यदि एक है, लेकिन यह पीओ बॉक्स भी हो सकता है।
  5. यह पहली या दूसरी पंक्ति पर एक नाम का पता लगाने के लिए लगभग असंभव है, हालांकि अगर यह एक संख्या के साथ उपसर्ग नहीं है (या यदि यह "attn:" या "ध्यान:" के साथ उपसर्ग है) तो यह आपको संकेत दे सकता है चाहे वह नाम या पता रेखा हो।

मुझे उम्मीद है कि यह कुछ हद तक मदद करता है।


14
हालांकि यह सच है कि 50 राज्य हैं, यूएसपीएस का कहना है कि संयुक्त राज्य अमेरिका डाक सेवा, 65 के डोमेन के भीतर 59 दो अक्षर हैं, यदि आप अमेरिकी सशस्त्र बलों की गिनती करते हैं। usps.com/send/official-abirectations.htm
माइक शेरिल 'कैट रिकॉल'

17
"केवल 50" यह इंगित करने के लिए था कि एक बहुत छोटी संख्या है। यह "केवल 65" हो सकता है, लेकिन यह समस्या को हल करने के लिए महत्वपूर्ण नहीं है।
टिम सुलिवन

4
यह एल्गोरिथ्म USPS पब्लिकेशन 28
मैट

92

मुझे लगता है कि समस्या को आउटसोर्सिंग करना सबसे अच्छा शर्त है: इसे Google (या याहू) जियोकोडर को भेजें। जियोकोडर न केवल लैट / लॉन्ग (जो यहां रुचि का नहीं है) लौटाता है, बल्कि पते की एक समृद्ध पार्सिंग भी है, जिसमें आपके द्वारा भरे गए फ़ील्ड (ज़िप + 4 और काउंटी सहित) नहीं भेजे गए हैं।

उदाहरण के लिए, "1600 एम्फीथिएटर पार्कवे, माउंटेन व्यू, सीए" पैडिंग

{
  "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [
    {
      "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "AddressDetails": {
        "Country": {
          "CountryNameCode": "US",
          "AdministrativeArea": {
            "AdministrativeAreaName": "CA",
            "SubAdministrativeArea": {
              "SubAdministrativeAreaName": "Santa Clara",
              "Locality": {
                "LocalityName": "Mountain View",
                "Thoroughfare": {
                  "ThoroughfareName": "1600 Amphitheatre Pkwy"
                },
                "PostalCode": {
                  "PostalCodeNumber": "94043"
                }
              }
            }
          }
        },
        "Accuracy": 8
      },
      "Point": {
        "coordinates": [-122.083739, 37.423021, 0]
      }
    }
  ]
}

अब तो वह पारगम्य है!


4
चूंकि यह एक बैच प्रक्रिया है, मैं जियोकोडिंग करने के लिए एक थ्रेड पूल का उपयोग करने का सुझाव दूंगा ताकि आप एक ही बार में कई पते प्रस्तुत कर सकें (क्या गूगल किसी भी तरह के बैच इंटरफ़ेस का समर्थन करता है?)
डेविड

यह वास्तव में पता पंक्ति दो (सवाल में 5 पिंट) के साथ मदद नहीं करेगा
क्रिस्टोफर महान

71
सेवा की शर्तें अक्सर वाणिज्यिक और / या गैर-गणराज्य उपयोगों के लिए एक सीमित कारक होती हैं।
जे

यह एक अच्छा समाधान है लेकिन ऐसे किनारे मामले हैं जिनके लिए Google / Yahoo परिणाम वापस नहीं करता है, उदाहरण के लिए नए पते और पते जो बस अपने डेटाबेस में गायब हैं।
पीटर डेविस

यह एक अच्छा समाधान होगा "IF" google ने अपने MAPS api के लिए बैच कॉल को सीमित नहीं किया है
Hector

25

मूल पोस्टर की संभावना लंबे समय से चली आ रही है, लेकिन मैंने पर्ल जियो को पोर्ट करने में एक कड़ी ले ली है :: StreetAddress: US मॉड्यूल का उपयोग geocoder.us द्वारा C # के लिए किया गया , इसे CodePlex पर डंप किया, और लगता है कि लोग भविष्य में इस सवाल पर ठोकर खा सकते हैं। इसे उपयोगी पाएं:

अमेरिका का पता पार्सर

प्रोजेक्ट के होम पेज पर, मैं इसकी (बहुत वास्तविक) सीमाओं के बारे में बात करने की कोशिश करता हूं। चूंकि यह मान्य सड़क पते के यूएसपीएस डेटाबेस द्वारा समर्थित नहीं है, पार्सिंग अस्पष्ट हो सकती है और यह किसी दिए गए पते की वैधता की पुष्टि नहीं कर सकता है और न ही इनकार कर सकता है। यह सिर्फ स्ट्रिंग से डेटा को खींचने की कोशिश कर सकता है।

यह उस स्थिति के लिए है जब आपको डेटा का एक सेट ज्यादातर सही क्षेत्रों में प्राप्त करने की आवश्यकता होती है, या डेटा प्रविष्टि के लिए एक शॉर्टकट प्रदान करना चाहता है (उपयोगकर्ताओं को कई क्षेत्रों में टैब करने के बजाय एक टेक्स्टबॉक्स में एक पता पेस्ट करने की अनुमति देता है)। यह एक पते की सुपुर्दगी की पुष्टि करने के लिए नहीं है

यह सड़क की रेखा के ऊपर कुछ भी बाहर पार्स करने का प्रयास नहीं करता है, लेकिन एक रेगेक्स के साथ संभवतः कुछ करीब पाने के लिए डगल कर सकता है - मैं शायद इसे घर के नंबर पर बंद कर दूंगा।


17

SmartyStreets में एक नई सुविधा है जो मनमाने ढंग से इनपुट स्ट्रिंग्स से पते निकालती है। (नोट: मैं स्मार्टस्ट्रीट पर काम नहीं करता हूं।)

यह ऊपर दिए गए प्रश्न में दिए गए नमूना इनपुट से सभी पतों को सफलतापूर्वक निकालता है। (वैसे, उन 10 पतों में से केवल 9 ही वैध हैं।)

यहाँ कुछ उत्पादन है:यहाँ छवि विवरण दर्ज करें

और यहाँ उसी अनुरोध के CSV-स्वरूपित आउटपुट हैं:

ID,Start,End,Segment,Verified,Candidate,Firm,FirstLine,SecondLine,LastLine,City,State,ZIPCode,County,DpvFootnotes,DeliveryPointBarcode,Active,Vacant,CMRA,MatchCode,Latitude,Longitude,Precision,RDI,RecordType,BuildingDefaultIndicator,CongressionalDistrict,Footnotes
1,32,79,"2299 Lewes-Georgetown Hwy, Georgetown, DE 19947",N,,,,,,,,,,,,,,,,,,,,,,
2,81,119,"11522 Shawnee Road, Greenwood DE 19950",Y,0,,11522 Shawnee Rd,,Greenwood DE 19950-5209,Greenwood,DE,19950,Sussex,AABB,199505209226,Y,N,N,Y,38.82865,-75.54907,Zip9,Residential,S,,AL,N#
3,121,160,"144 Kings Highway, S.W. Dover, DE 19901",Y,0,,144 Kings Hwy,,Dover DE 19901-7308,Dover,DE,19901,Kent,AABB,199017308444,Y,N,N,Y,39.16081,-75.52377,Zip9,Commercial,S,,AL,L#
4,190,232,"2 Penns Way Suite 405 New Castle, DE 19720",Y,0,,2 Penns Way Ste 405,,New Castle DE 19720-2407,New Castle,DE,19720,New Castle,AABB,197202407053,Y,N,N,Y,39.68332,-75.61043,Zip9,Commercial,H,,AL,N#
5,247,285,"33 Bridle Ridge Court, Lewes, DE 19958",Y,0,,33 Bridle Ridge Cir,,Lewes DE 19958-8961,Lewes,DE,19958,Sussex,AABB,199588961338,Y,N,N,Y,38.72749,-75.17055,Zip7,Residential,S,,AL,L#
6,306,339,"2742 Pulaski Hwy Newark, DE 19711",Y,0,,2742 Pulaski Hwy,,Newark DE 19702-3911,Newark,DE,19702,New Castle,AABB,197023911421,Y,N,N,Y,39.60328,-75.75869,Zip9,Commercial,S,,AL,A#
7,341,378,"2284 Bryn Zion Road, Smyrna, DE 19904",Y,0,,2284 Bryn Zion Rd,,Smyrna DE 19977-3895,Smyrna,DE,19977,Kent,AABB,199773895840,Y,N,N,Y,39.23937,-75.64065,Zip7,Residential,S,,AL,A#N#
8,406,450,"1500 Serpentine Road, Suite 100 Baltimore MD",Y,0,,1500 Serpentine Rd Ste 100,,Baltimore MD 21209-2034,Baltimore,MD,21209,Baltimore,AABB,212092034250,Y,N,N,Y,39.38194,-76.65856,Zip9,Commercial,H,,03,N#
9,455,495,"580 North Dupont Highway Dover, DE 19901",Y,0,,580 N DuPont Hwy,,Dover DE 19901-3961,Dover,DE,19901,Kent,AABB,199013961803,Y,N,N,Y,39.17576,-75.5241,Zip9,Commercial,S,,AL,N#
10,497,525,"P.O. Box 778 Dover, DE 19903",Y,0,,PO Box 778,,Dover DE 19903-0778,Dover,DE,19903,Kent,AABB,199030778781,Y,N,N,Y,39.20946,-75.57012,Zip5,Residential,P,,AL,

मैं डेवलपर था जिसने मूल रूप से सेवा लिखी थी। हमारे द्वारा लागू किया गया एल्गोरिदम यहां के किसी भी विशिष्ट उत्तर से थोड़ा अलग है, लेकिन प्रत्येक निकाले गए पते को पता लुकअप एपीआई के खिलाफ सत्यापित किया गया है, इसलिए आप सुनिश्चित कर सकते हैं कि यह मान्य है या नहीं। प्रत्येक सत्यापित परिणाम की गारंटी है, लेकिन हम जानते हैं कि अन्य परिणाम सही नहीं होंगे, क्योंकि जैसा कि इस धागे में प्रचुरता से स्पष्ट किया गया है , पते अप्रत्याशित हैं, यहां तक ​​कि कभी-कभी मनुष्यों के लिए भी।


2
वे क्या करते हैं, स्मार्टस्टाइक अविश्वसनीय रूप से अच्छा है। यह सुनकर बहुत खुशी हुई कि यह एक एपीआई है जिसका वे समर्थन करते हैं।
क्लेरोटेटर

16

मैंने अतीत में ऐसा किया है।

या तो इसे मैन्युअल रूप से करें, (एक अच्छा गुई बनाएं जो उपयोगकर्ता को इसे जल्दी करने में मदद करता है) या यह स्वचालित है और हाल के पते के डेटाबेस (आपको इसे खरीदना होगा) के खिलाफ जांचें और मैन्युअल रूप से त्रुटियों को संभालना होगा।

मैनुअल हैंडलिंग में प्रत्येक 10 सेकंड लगेंगे, जिसका अर्थ है कि आप 3600/10 = 360 प्रति घंटे कर सकते हैं, इसलिए 4000 को आपको लगभग 11-12 घंटे लगने चाहिए। यह आपको सटीकता की उच्च दर देगा।

स्वचालन के लिए, आपको एक हाल ही के अमेरिकी पते के डेटाबेस की आवश्यकता होती है, और उसी के खिलाफ अपने नियमों को मोड़ दें। मेरा सुझाव है कि रेगेक्स (लंबे समय तक बनाए रखने के लिए कठिन, इतने सारे अपवाद) पर कल्पना नहीं की जाएगी। डेटाबेस के खिलाफ 90% मैच के लिए जाएं, बाकी मैन्युअल रूप से करें।

Http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf पर पोस्टल एड्रेसिंग स्टैंडर्ड्स (USPS) की एक प्रति प्राप्त करें और ध्यान दें कि यह 130+ पृष्ठ लंबा है। कि पागल हो जाएगा लागू करने के लिए Regexes।

अंतरराष्ट्रीय पतों के लिए, सभी दांव बंद हैं। अमेरिका स्थित श्रमिक मान्य नहीं कर पाएंगे।

वैकल्पिक रूप से, डेटा सेवा का उपयोग करें। हालांकि, मेरी कोई सिफारिश नहीं है।

इसके अलावा: जब आप मेल में सामान बाहर भेजते हैं (यह वही है, जिसके लिए सही है?) सुनिश्चित करें कि आपने लिफाफे पर (सही जगह पर) "पता सुधार का अनुरोध" किया है और डेटाबेस को अपडेट करें। (हमने ऐसा करने के लिए फ्रंट डेस्क व्यक्ति के लिए एक सरल गुई बनाई है; वह व्यक्ति जो मेल के माध्यम से वास्तव में छांटता है)

अंत में, जब आपने डेटा स्क्रब किया है, तो डुप्लिकेट देखें।


14

यहां सलाह के बाद, मैंने वीबी में निम्नलिखित फ़ंक्शन को तैयार किया है जो निष्क्रिय बनाता है, हालांकि हमेशा सही नहीं (यदि एक कंपनी का नाम और एक सूट लाइन दी जाती है, तो यह सूट और शहर को जोड़ती है) उपयोगी डेटा। कृपया अपने किसी नियम आदि को तोड़ने के लिए मुझ पर टिप्पणी / रिफ्लेक्टर / चिल्लाना बेझिझक करें।

Public Function parseAddress(ByVal input As String) As Collection
    input = input.Replace(",", "")
    input = input.Replace("  ", " ")
    Dim splitString() As String = Split(input)
    Dim streetMarker() As String = New String() {"street", "st", "st.", "avenue", "ave", "ave.", "blvd", "blvd.", "highway", "hwy", "hwy.", "box", "road", "rd", "rd.", "lane", "ln", "ln.", "circle", "circ", "circ.", "court", "ct", "ct."}
    Dim address1 As String
    Dim address2 As String = ""
    Dim city As String
    Dim state As String
    Dim zip As String
    Dim streetMarkerIndex As Integer

    zip = splitString(splitString.Length - 1).ToString()
    state = splitString(splitString.Length - 2).ToString()
    streetMarkerIndex = getLastIndexOf(splitString, streetMarker) + 1
    Dim sb As New StringBuilder

    For counter As Integer = streetMarkerIndex To splitString.Length - 3
        sb.Append(splitString(counter) + " ")
    Next counter
    city = RTrim(sb.ToString())
    Dim addressIndex As Integer = 0

    For counter As Integer = 0 To streetMarkerIndex
        If IsNumeric(splitString(counter)) _
            Or splitString(counter).ToString.ToLower = "po" _
            Or splitString(counter).ToString().ToLower().Replace(".", "") = "po" Then
                addressIndex = counter
            Exit For
        End If
    Next counter

    sb = New StringBuilder
    For counter As Integer = addressIndex To streetMarkerIndex - 1
        sb.Append(splitString(counter) + " ")
    Next counter

    address1 = RTrim(sb.ToString())

    sb = New StringBuilder

    If addressIndex = 0 Then
        If splitString(splitString.Length - 2).ToString() <> splitString(streetMarkerIndex + 1) Then
            For counter As Integer = streetMarkerIndex To splitString.Length - 2
                sb.Append(splitString(counter) + " ")
            Next counter
        End If
    Else
        For counter As Integer = 0 To addressIndex - 1
            sb.Append(splitString(counter) + " ")
        Next counter
    End If
    address2 = RTrim(sb.ToString())

    Dim output As New Collection
    output.Add(address1, "Address1")
    output.Add(address2, "Address2")
    output.Add(city, "City")
    output.Add(state, "State")
    output.Add(zip, "Zip")
    Return output
End Function

Private Function getLastIndexOf(ByVal sArray As String(), ByVal checkArray As String()) As Integer
    Dim sourceIndex As Integer = 0
    Dim outputIndex As Integer = 0
    For Each item As String In checkArray
        For Each source As String In sArray
            If source.ToLower = item.ToLower Then
                outputIndex = sourceIndex
                If item.ToLower = "box" Then
                    outputIndex = outputIndex + 1
                End If
            End If
            sourceIndex = sourceIndex + 1
        Next
        sourceIndex = 0
    Next
    Return outputIndex
End Function

parseAddressसमारोह को पारित करते हुए "एपी क्रॉल एंड सन 2299 लुईस-जॉर्जटाउन ह्वी, जॉर्जटाउन, डीई 19947" रिटर्न:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947

13

मैं अब लगभग 5 वर्षों के लिए एड्रेस प्रोसेसिंग डोमेन में काम कर रहा हूं, और वास्तव में कोई चांदी की गोली नहीं है। सही समाधान डेटा के मूल्य पर निर्भर करने वाला है। यदि यह बहुत मूल्यवान नहीं है, तो इसे पार्सर के माध्यम से फेंक दें क्योंकि अन्य उत्तर सुझाते हैं। अगर यह कुछ हद तक मूल्यवान है, तो आपको निश्चित रूप से मानव मूल्यांकन / पार्सर के सभी परिणामों को सही करने की आवश्यकता होगी। यदि आप पूरी तरह से स्वचालित, दोहराए जाने वाले समाधान की तलाश में हैं, तो आप शायद Group1 या Trillium जैसे एड्रेस करेक्शन विक्रेता से बात करना चाहते हैं।


8

यह आपकी समस्या का समाधान नहीं करेगा, लेकिन अगर आपको इन पतों के लिए केवल लम्बे / लंबे डेटा की आवश्यकता है, तो Google मैप्स एपीआई गैर-स्वरूपित पतों को बहुत अच्छी तरह से पार्स कर देगा।

अच्छा सुझाव, वैकल्पिक रूप से आप Google मानचित्र के प्रत्येक पते के लिए एक CURL अनुरोध निष्पादित कर सकते हैं और यह ठीक से स्वरूपित पता वापस कर देगा। उस से, आप अपने दिल की सामग्री के लिए regex कर सकते हैं।


7

जेम्स ए। रोसेन के सुझाए गए समाधान पर +1, क्योंकि इसने मेरे लिए अच्छा काम किया है, हालांकि इस साइट को पूरा करने के लिए यह एक आकर्षक रीड है और मैंने दुनिया भर के पते का दस्तावेजीकरण करने में जो सबसे अच्छा प्रयास किया है, वह है: http://www.columbia.edu/kermit /postal.html


6

क्या इस तरह से कोई भी मानक हैं जो पते दर्ज किए गए हैं? उदाहरण के लिए:

  1. क्या शहर से सड़क से सड़क 2 को हमेशा ज़िप से अलग करने वाले कॉमा या नई-नई लाइनें हैं?
  2. क्या पता प्रकार (सड़क, सड़क, बुलेवार्ड, आदि) हमेशा वर्तनी में होते हैं? हमेशा संक्षिप्त? प्रत्येक के कुछ?
  3. "त्रुटि" को परिभाषित करें।

मेरा सामान्य उत्तर रेगुलर एक्सप्रेशंस की एक श्रृंखला है, हालांकि इस की जटिलता उत्तर पर निर्भर करती है। और अगर इसमें कोई निरंतरता नहीं है, तो आप केवल एक रेगेक्स (यानी ज़िप कोड और राज्य को फ़िल्टर करना) के साथ आंशिक सफलता प्राप्त करने में सक्षम हो सकते हैं और बाकी को हाथ से करना होगा (या कम से कम बाकी के माध्यम से जाना होगा) यह सुनिश्चित करने के लिए कि आप त्रुटियां जानते हैं)।


6

नमूना डेटा के लिए एक और अनुरोध।

जैसा कि उल्लेख किया गया है कि मैं ज़िप से पीछे की ओर काम करूंगा।

एक बार जब आपके पास एक ज़िप होता है तो मैं एक ज़िप डेटाबेस को क्वेरी करता हूं, परिणामों को संग्रहीत करता हूं, और स्ट्रिंग से उन्हें और ज़िप हटा देता हूं।

जो आपको पता गड़बड़ के साथ छोड़ देगा। MOST (सभी?) पते एक संख्या के साथ शुरू होंगे इसलिए शेष स्ट्रिंग में एक संख्या की पहली घटना का पता लगाएं और उससे सब कुछ हड़पने के लिए (नए) स्ट्रिंग के अंत में। वह आपका पता होगा। उस नंबर के बाईं ओर कुछ भी एक संभावना है।

अब आपके पास शहर, राज्य और ज़िप एक टेबल में संग्रहित होना चाहिए और संभवतः दो तार, पता और पता होना चाहिए। पते के लिए, "सूट" या "Apt" के अस्तित्व की जांच करें। आदि और दो मूल्यों में विभाजित (पता लाइनें 1 और 2)।

संबोधन के लिए मैं उस स्ट्रिंग के अंतिम शब्द को अंतिम नाम के रूप में लिखूंगा और बाकी को पहले नाम फ़ील्ड में डालूँगा। यदि आप ऐसा नहीं करना चाहते हैं, तो आपको शुरुआत में नमस्कार (श्री, सुश्री, डॉ।, आदि) की जांच करनी होगी और नाम के आधार पर रिक्त स्थान की संख्या के आधार पर कुछ धारणाएं बनानी होंगी। बना।

मुझे नहीं लगता कि 100% सटीकता के साथ आप किसी भी तरह से पार्स कर सकते हैं।


6

Www.address-parser.com आज़माएं । हम उनकी वेब सेवा का उपयोग करते हैं, जिसे आप ऑनलाइन परीक्षण कर सकते हैं


1
यह एक बड़े HTML दस्तावेज़ में एक पते की तरह कुछ के लिए अच्छी तरह से काम करता है। मैं सिर्फ यही चाहता हूं कि उनका एक REST इंटरफ़ेस हो, न कि SOAP। इस लिंक को साझा करने के लिए Thx।
18 जून को jspooner

1
यदि आप उनके साथ संबद्ध हैं, तो आपको इसका खुलासा करना होगा।
मैट

1
यह अच्छा होगा यदि वे मांग करने के बजाय एक मूल्य अनुमान देते हैं कि मैं उन्हें बताता हूं कि मूल्य देने से पहले उनकी सेवा कितनी मूल्यवान है।
टोस्टर

5

नमूना डेटा के आधार पर:

  1. मैं स्ट्रिंग के अंत में शुरू करूंगा। एक ज़िप-कोड पार्स (या तो प्रारूप)। पहली जगह के लिए अंत पढ़ें। यदि कोई ज़िप कोड त्रुटि नहीं मिली।

  2. रिक्त स्थान और विशेष वर्ण के लिए अंत ट्रिम करें (अल्पविराम)

  3. फिर राज्य पर जाएं, फिर से सीमांकक के रूप में अंतरिक्ष का उपयोग करें। हो सकता है कि 2 पत्र राज्य कोड, और पूर्ण राज्य नामों को मान्य करने के लिए एक लुकअप सूची का उपयोग करें। यदि कोई मान्य स्थिति नहीं मिली, तो त्रुटि।

  4. अंत से फिर से रिक्त स्थान और अल्पविराम ट्रिम करें।

  5. शहर मुश्किल हो जाता है, मैं वास्तव में शहर में बहुत अधिक डेटा प्राप्त करने के जोखिम पर यहां एक अल्पविराम का उपयोग करूंगा। अल्पविराम, या पंक्ति की शुरुआत के लिए देखें।

  6. यदि आपके पास अभी भी तार में स्ट्रिंग है, तो उस सभी को एक पता फ़ील्ड में भेज दें।

यह सही नहीं है, लेकिन यह एक बहुत अच्छा शुरुआती बिंदु होना चाहिए।


4

यदि यह मानव डेटा दर्ज किया गया है, तो आप अपवादों को कोड करने के लिए बहुत अधिक समय बिताएंगे।

प्रयत्न:

  1. ज़िप कोड निकालने के लिए नियमित अभिव्यक्ति

  2. सही पता प्राप्त करने के लिए ज़िप कोड लुकअप (उपयुक्त डीबी के माध्यम से)

  3. पुराने से मेल खाते नए डेटा को मैन्युअल रूप से सत्यापित करने के लिए एक इंटर्न प्राप्त करें


3

यह आपकी समस्या का समाधान नहीं करेगा, लेकिन अगर आपको इन पतों के लिए केवल लम्बे / लंबे डेटा की आवश्यकता है, तो Google मैप्स एपीआई गैर-स्वरूपित पतों को बहुत अच्छी तरह से पार्स कर देगा।


3

RecogniContact एक विंडोज COM ऑब्जेक्ट है जो यूएस और यूरोपीय पतों को पार्स करता है। आप इसे http://www.loquisoft.com/index.php?page=8 पर सही तरीके से आज़मा सकते हैं


मान्यता को जनता के लिए बंद किया जा रहा है। एक्सेस के लिए संपर्क फ़ॉर्म सबमिट करना आवश्यक है, लेकिन कोई उत्तर नहीं है। शायद किसी और को पता है कि उनके साथ कैसे संपर्क किया जाए।
ल्यूक वैन


3

डेटा में अंतर्निहित अस्पष्टताओं के कारण इस प्रकार की समस्या को हल करना मुश्किल है।

यहां एक पर्ल आधारित समाधान है जो सड़क के पते के कई वैध संयोजन को पार्स करने के लिए नियमित अभिव्यक्तियों पर आधारित एक पुनरावर्ती वंशीय व्याकरण वृक्ष को परिभाषित करता है: http://search.cpan.org/~kimryan/Lingua-EN-Addressararse-1.20/lib/Lingua /EN/AddressParse.pm । इसमें एक पते के भीतर उप-गुण शामिल हैं जैसे: 12 1 एवेन्यू एन सूट # 2 कहीं सीए 12345 यूएसए

यह ऊपर वर्णित http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm के समान है , लेकिन यह उन पतों के लिए भी काम करता है जो संयुक्त राज्य अमेरिका से नहीं हैं, जैसे कि यूके, ऑस्ट्रेलिया और कनाडा।

यहाँ आपके एक नमूना पते के लिए आउटपुट है। ध्यान दें कि नाम अनुभाग को पहले "एपी क्रॉल एंड सन 2299 लुइस-जॉर्जटाउन ह्वाई, जॉर्जटाउन, डीई 19947" से हटाकर इसे "2299 लुइस-जॉर्जटाउन ह्वाई, जॉर्जटाउन, डीई 19947" करना होगा। यह आसानी से स्ट्रिंग में पाए गए पहले नंबर तक के सभी डेटा को हटाकर प्राप्त किया जाता है।

Non matching part       ''
Error                   '0'
Error descriptions      ''
Case all                '2299 Lewes-Georgetown Hwy Georgetown DE 19947'
COMPONENTS              ''
country                 ''
po_box_type             ''
post_box                ''
post_code               '19947'
pre_cursor              ''
property_identifier     '2299'
property_name           ''
road_box                ''
street                  'Lewes-Georgetown'
street_direction        ''
street_type             'Hwy'
sub_property_identifier ''
subcountry              'DE'
suburb                  'Georgetown'

2

चूंकि शब्द में त्रुटि की संभावना है, तार की तुलना करने के लिए LCS एल्गोरिथ्म के साथ संयुक्त SOUNDEX का उपयोग करने के बारे में सोचें, इससे बहुत मदद मिलेगी!


2

google API का उपयोग करना

$d=str_replace(" ", "+", $address_url);
$completeurl ="http://maps.googleapis.com/maps/api/geocode/xml?address=".$d."&sensor=true"; 
$phpobject = simplexml_load_file($completeurl);
print_r($phpobject);

1
यह शायद ToS के खिलाफ है, लेकिन ऐसा लगता है कि यह काम करना चाहिए - हालांकि प्रश्न को फिर से पढ़ना, यह आवश्यकताओं को बिल्कुल फिट नहीं करता है।
जेमी बैल

2

रूबी या रेल डेवलपर्स के लिए एक अच्छा रत्न उपलब्ध है जिसे स्ट्रीट_ड्रेस कहा जाता है । मैं अपने एक प्रोजेक्ट पर इसका इस्तेमाल कर रहा हूं और यह मेरे लिए जरूरी काम है।

एकमात्र मुद्दा जो मेरे पास था, जब भी कोई पता इस प्रारूप में होता था तो P. O. Box 1410 Durham, NC 27702 वह वापस आ जाता था और इसलिए मुझे "PO बॉक्स" को '' से बदलना था और इसके बाद इसे पार्स करने में सक्षम था।


उपरोक्त मॉड्यूल का लिंक टूट गया है, इसके बजाय इसका उपयोग करें: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan

1

ऐसी डेटा सेवाएँ हैं जो ज़िप कोड दिया गया है, आपको उस ज़िप कोड में सड़क के नामों की सूची दी जाएगी।

ज़िप या सिटी स्टेट निकालने के लिए एक regex का उपयोग करें - सही एक ढूंढें या यदि कोई त्रुटि दोनों मिलती है। डेटा स्रोत से सड़कों की सूची खींचना शहर और राज्य को सही करें, और फिर सड़क का पता। एक बार जब आप एक मान्य पता पंक्ति 1, शहर, राज्य, और ज़िप प्राप्त कर लेते हैं तो आप पता पंक्ति 2..3 पर अनुमान लगा सकते हैं


1

मुझे नहीं पता कि यह कैसे होगा, लेकिन मैंने इस उल्लेख को नहीं देखा है इसलिए मुझे लगा कि मैं आगे जाऊंगा और यह सुझाव दूंगा:

यदि आप अमेरिका में कड़ाई से हैं ... सभी ज़िप कोड, राज्यों, शहरों और सड़कों का एक विशाल डेटाबेस प्राप्त करें। अब इन्हें अपने पते में देखें। आप यह सत्यापित कर सकते हैं कि आपको परीक्षण के द्वारा क्या मिला, यदि आप कहते हैं कि आपके द्वारा पाया गया शहर मौजूद है, या जाँच करें कि क्या आपके द्वारा पाई गई सड़क आपके द्वारा पाए गए शहर में मौजूद है। यदि नहीं, तो संभावना है कि जॉन जॉन की सड़क के लिए नहीं है, लेकिन पतेदार का नाम है ... मूल रूप से, सबसे अधिक जानकारी प्राप्त करें जो आप कर सकते हैं और इसके खिलाफ अपने पते की जांच कर सकते हैं। एक चरम उदाहरण अमेरिका के सभी राज्यों में एक सूची प्राप्त करना होगा और फिर यह पता लगाना होगा कि आपके प्रत्येक पते के लिए सबसे अधिक प्रासंगिक मैच कौन सा है ...


1

पर्ल जियो का जावास्क्रिप्ट पोर्ट है :: StreetAddress :: US पैकेज: https://github.com/hassansin/parse-address । यह रेगेक्स-आधारित है और काफी अच्छी तरह से काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.