تحليل عنوان الشارع القابل للاستخدام، المدينة، الولاية، الرمز البريدي من سلسلة [مغلق]

StackOverflow https://stackoverflow.com/questions/16413

سؤال

مشكلة:لدي حقل عنوان من قاعدة بيانات Access تم تحويله إلى Sql Server 2005.هذا المجال فيه كل شيء في مجال واحد.أحتاج إلى تحليل الأقسام الفردية للعنوان في الحقول المناسبة لها في جدول عادي.أحتاج إلى القيام بذلك لما يقرب من 4000 سجل ويجب أن يكون قابلاً للتكرار.

الافتراضات:

  1. افترض عنوانًا في الولايات المتحدة (في الوقت الحالي)

  2. افترض أن سلسلة الإدخال ستحتوي في بعض الأحيان على المرسل إليه (الشخص الذي تتم مخاطبته) و/أو عنوان الشارع الثاني (أي عنوان الشارع).الجناح ب)

  3. يمكن اختصار الدول

  4. يمكن أن يكون الرمز البريدي قياسيًا مكونًا من 5 أرقام أو الرمز البريدي +4

  5. هناك أخطاء مطبعية في بعض الحالات

تحديث:ردًا على الأسئلة المطروحة، لم يتم اتباع المعايير عالميًا، ولست بحاجة لتخزين القيم الفردية، وليس فقط الرمز الجغرافي والأخطاء تعني الخطأ المطبعي (تم التصحيح أعلاه)

بيانات العينة:

  • أ.ص.كرول آند سون 2299 Lewes-Georgetown Hwy, جورج تاون, DE 19947

  • 11522 طريق شاوني، جرينوود دي إي 19950

  • 144 طريق الملوك السريع، جنوب غرب.دوفر، دي 19901

  • البناء المتكامل.الخدمات 2 Penns Way Suite 405 نيو كاسل، DE 19720

  • هيومز ريالتي 33 بريدل ريدج كورت، لويس، DE 19958

  • نيكولز للتنقيب 2742 بولاسكي هوي نيوارك، DE 19711

  • 2284 طريق برين زيون، سميرنا، DE 19904

  • VEI Dover Crossroads, LLC 1500 طريق سيربنتين، جناح 100 بالتيمور إم دي 21

  • 580 طريق شمال دوبونت السريع، دوفر، DE 19901

  • ص.ب.صندوق بريد 778 دوفر، DE 19903

هل كانت مفيدة؟

المحلول

لقد قمت بالكثير من العمل على هذا النوع من التحليل.نظرًا لوجود أخطاء، فلن تحصل على دقة بنسبة 100%، ولكن هناك بعض الأشياء التي يمكنك القيام بها لقطع معظم الطريق، ثم إجراء اختبار BS مرئي.وإليك الطريقة العامة للقيام بذلك.إنه ليس رمزًا، لأنه أمر أكاديمي جدًا لكتابته، وليس هناك غرابة، فقط الكثير من التعامل مع السلسلة.

(الآن بعد أن قمت بنشر بعض نماذج البيانات، قمت بإجراء بعض التغييرات الطفيفة)

  1. العمل إلى الوراء.ابدأ من الرمز البريدي، الذي سيكون قريبًا من النهاية، وبأحد التنسيقين المعروفين:XXXX أو XXXX-XXXX.إذا لم يظهر هذا، فيمكنك أن تفترض أنك في المدينة، جزء الولاية، أدناه.
  2. الشيء التالي، قبل الرمز البريدي، سيكون الحالة، وسيكون إما بتنسيق مكون من حرفين، أو ككلمات.أنت تعرف ماذا ستكون هذه أيضًا، هناك 50 منها فقط.يمكنك أيضًا نطق الكلمات للمساعدة في تعويض الأخطاء الإملائية.
  3. قبل أن تكون المدينة، وانها من المحتمل على نفس خط الدولة.يمكنك استخدام أ قاعدة بيانات الرمز البريدي للتحقق من المدينة والولاية بناءً على الرمز البريدي، أو على الأقل استخدامه ككاشف BS.
  4. سيكون عنوان الشارع بشكل عام عبارة عن سطر أو سطرين.سيكون السطر الثاني بشكل عام هو رقم الجناح إذا كان هناك واحد، ولكن من الممكن أن يكون أيضًا صندوق بريد.
  5. سيكون من المستحيل تقريبًا اكتشاف اسم في السطر الأول أو الثاني، على الرغم من أنه إذا لم يكن مسبوقًا برقم (أو إذا كان مسبوقًا بـ "attn:" أو "attention to:" فقد يعطيك تلميحًا كما يلي: سواء كان اسمًا أو سطر عنوان.

آمل أن يساعد هذا إلى حد ما.

نصائح أخرى

أعتقد أن الاستعانة بمصادر خارجية لحل المشكلة هو أفضل رهان:أرسله إلى المشفر الجغرافي Google (أو Yahoo).لا يُرجع المُكود الجغرافي خط العرض/الطول فقط (وهو ما لا يهم هنا)، بل يُرجع أيضًا تحليلًا غنيًا للعنوان، مع الحقول المملوءة التي لم ترسلها (بما في ذلك ZIP+4 والمقاطعة).

على سبيل المثال، يؤدي تحليل "1600 Amphitheatre Parkway, Mountain View, CA" إلى الحصول على نتائج

{
  "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]
      }
    }
  ]
}

الآن هذا قابل للتحليل!

من المحتمل أن يكون الملصق الأصلي قد مضى وقت طويل، لكنني حاولت نقل لغة Perl الموقع الجغرافي::StreetAddress:US الوحدة المستخدمة من قبل Geocoder.us إلى C#، وألقيته على CodePlex، وأعتقد أن الأشخاص الذين يتعثرون في هذا السؤال في المستقبل قد يجدونه مفيدًا:

محلل عنوان الولايات المتحدة

على الصفحة الرئيسية للمشروع، أحاول التحدث عن حدوده (الحقيقية جدًا).نظرًا لأنه غير مدعوم بقاعدة بيانات USPS لعناوين الشوارع الصالحة، فقد يكون التحليل غامضًا ولا يمكنه تأكيد أو رفض صحة عنوان معين.يمكنه فقط محاولة سحب البيانات من السلسلة.

إنه مخصص للحالة التي تحتاج فيها إلى الحصول على مجموعة من البيانات معظمها في الحقول الصحيحة، أو تريد توفير اختصار لإدخال البيانات (السماح للمستخدمين بلصق عنوان في مربع نص بدلاً من التنقل بين حقول متعددة).إنها لا يعني للتحقق من إمكانية تسليم عنوان.

إنه لا يحاول تحليل أي شيء فوق خط الشارع، ولكن ربما يمكن للمرء أن يتلاعب بالتعبير العادي للحصول على شيء قريب بشكل معقول - ربما سأفصله عند رقم المنزل.

لقد فعلت هذا في الماضي.

إما أن تفعل ذلك يدويًا (قم بإنشاء واجهة مستخدم لطيفة تساعد المستخدم على القيام بذلك بسرعة) أو اجعلها آلية وتحقق من قاعدة بيانات العناوين الحديثة (عليك شراء ذلك) ومعالجة الأخطاء يدويًا.

ستستغرق المعالجة اليدوية حوالي 10 ثوانٍ لكل منها، مما يعني أنه يمكنك إجراء 3600/10 = 360 في الساعة، لذلك يجب أن يستغرق 4000 ما يقرب من 11-12 ساعة.سيعطيك هذا نسبة عالية من الدقة.

للأتمتة، أنت يحتاج قاعدة بيانات حديثة للعناوين الأمريكية، وقم بتعديل القواعد الخاصة بك وفقًا لذلك.أقترح عدم استخدام التعبير العادي (يصعب الحفاظ عليه على المدى الطويل، وهناك الكثير من الاستثناءات).قم بالمطابقة بنسبة 90% مع قاعدة البيانات، وقم بالباقي يدويًا.

احصل على نسخة من معايير العناوين البريدية (USPS) على http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf ولاحظ أن طوله يزيد عن 130 صفحة.Regexes لتنفيذ ذلك من شأنه أن يكون المكسرات.

بالنسبة للعناوين الدولية، كل الرهانات متوقفة.لن يتمكن العمال المقيمون في الولايات المتحدة من التحقق من صحتها.

وبدلاً من ذلك، استخدم خدمة البيانات.ومع ذلك، ليس لدي أي توصيات.

بالإضافة إلى:عندما ترسل الأشياء في البريد (هذا هو الغرض منها، أليس كذلك؟) تأكد من وضع عبارة "طلب تصحيح العنوان" على الظرف (في المكان الصحيح) و تحديث قاعدة البيانات.(لقد قمنا بإعداد واجهة مستخدم بسيطة لموظف مكتب الاستقبال للقيام بذلك؛الشخص الذي يقوم بالفعل بفرز البريد)

أخيرًا، عندما تقوم بتنقيح البيانات، ابحث عن التكرارات.

بعد النصيحة هنا، ابتكرت الوظيفة التالية في VB والتي تنشئ بيانات قابلة للاستخدام، على الرغم من أنها ليست مثالية دائمًا (إذا تم تقديم اسم الشركة وخط المجموعة، فهي تجمع بين المجموعة والمدينة).من فضلك لا تتردد في التعليق/إعادة البناء/الصراخ في وجهي لخرق إحدى القواعد الخاصة بي، وما إلى ذلك:

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 Lewes-Georgetown Hwy, Georgetown, DE 19947" يعود:

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

أنا أعمل في مجال معالجة العناوين منذ حوالي 5 سنوات، ولا يوجد حل سحري حقًا.الحل الصحيح سوف يعتمد على قيمة البيانات.إذا لم تكن ذات قيمة كبيرة، فقم بإلقائها عبر محلل كما تقترح الإجابات الأخرى.إذا كان الأمر ذا قيمة إلى حد ما، فستحتاج بالتأكيد إلى إجراء تقييم بشري/تصحيح جميع نتائج المحلل اللغوي.إذا كنت تبحث عن حل مؤتمت بالكامل وقابل للتكرار، فمن المحتمل أنك تريد التحدث إلى أحد موردي تصحيح العناوين مثل Group1 أو Trillium.

لدى SmartyStreets ميزة جديدة تستخرج العناوين من سلاسل الإدخال العشوائية.(ملحوظة:أنا لا أعمل في SmartyStreets.)

لقد نجح في استخراج جميع العناوين من نموذج الإدخال الوارد في السؤال أعلاه.(بالمناسبة، 9 فقط من تلك العناوين العشرة صالحة.)

وهنا بعض من الإخراج:enter image description here

وإليك الإخراج بتنسيق 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,

لقد كنت المطور الذي كتب الخدمة في الأصل.تختلف الخوارزمية التي قمنا بتنفيذها قليلاً عن أي إجابات محددة هنا، ولكن يتم التحقق من كل عنوان مستخرج مقابل واجهة برمجة تطبيقات البحث عن العنوان، لذلك يمكنك التأكد مما إذا كان صالحًا أم لا.يتم ضمان كل نتيجة تم التحقق منها، ولكننا نعلم أن النتائج الأخرى لن تكون مثالية، كما تم إحرازه واضحة للغاية في هذا الموضوع، لا يمكن التنبؤ بالعناوين، حتى بالنسبة للبشر في بعض الأحيان.

لن يحل هذا مشكلتك ، ولكن إذا كنت بحاجة فقط إلى بيانات LAT/Long لهذه العناوين ، فستجعل واجهة برمجة تطبيقات Google Maps عناوين غير تنسيق جيدًا.

اقتراح جيد، وبدلاً من ذلك يمكنك تنفيذ طلب CURL لكل عنوان إلى خرائط Google وسيقوم بإرجاع العنوان المنسق بشكل صحيح.من ذلك، يمكنك التعبير عن محتوى قلبك.

+1 على جيمس أ.الحل الذي اقترحه روزن قد نجح بشكل جيد بالنسبة لي، ولكن بالنسبة للمكملين، يعد هذا الموقع قراءة رائعة وأفضل محاولة رأيتها في توثيق العناوين في جميع أنحاء العالم: http://www.columbia.edu/kermit/postal.html

هل هناك أي معايير على الإطلاق في طريقة تسجيل العناوين؟على سبيل المثال:

  1. هل هناك دائمًا فواصل أو خطوط جديدة تفصل الشارع 1 عن الشارع 2 عن المدينة عن الولاية عن الرمز البريدي؟
  2. هل يتم توضيح أنواع العناوين (طريق، شارع، جادة، إلخ) دائمًا؟مختصرة دائما؟بعض من كل؟
  3. تعريف "الخطأ".

إجابتي العامة هي سلسلة من التعبيرات العادية، على الرغم من أن مدى تعقيدها يعتمد على الإجابة.وإذا لم يكن هناك اتساق على الإطلاق، فقد لا تتمكن إلا من تحقيق نجاح جزئي باستخدام Regex (على سبيل المثال:تصفية الرمز البريدي والحالة) وسيتعين عليك القيام بالباقي يدويًا (أو على الأقل مراجعة الباقي بعناية شديدة للتأكد من اكتشاف الأخطاء).

طلب آخر لعينة البيانات.

كما ذكرنا سابقًا، سأعمل بشكل عكسي من الرمز البريدي.

بمجرد حصولك على ملف مضغوط، سأقوم بالاستعلام عن قاعدة بيانات مضغوطة، وتخزين النتائج، وإزالتها والملف المضغوط من السلسلة.

وهذا سوف يتركك مع فوضى العنوان.ستبدأ معظم العناوين (الكل؟) برقم، لذا ابحث عن التواجد الأول لرقم في السلسلة المتبقية والتقط كل شيء منه إلى النهاية (الجديدة) للسلسلة.وهذا سيكون عنوانك.أي شيء على يسار هذا الرقم هو على الأرجح مرسل إليه.

يجب أن يكون لديك الآن المدينة والولاية والرمز البريدي المخزن في جدول وربما سلسلتين، المرسل إليه والعنوان.بالنسبة للعنوان ، تحقق من وجود "جناح" أو "apt". إلخ.وتقسيم ذلك إلى قيمتين (سطر العنوان 1 و 2).

بالنسبة للمرسل إليه، أود أن أقوم بالتقاط الكلمة الأخيرة من تلك السلسلة كاسم أخير ووضع الباقي في حقل الاسم الأول.إذا كنت لا ترغب في القيام بذلك، فسوف تحتاج إلى التحقق من التحية (السيد، السيدة، الدكتور، وما إلى ذلك) في البداية ووضع بعض الافتراضات بناءً على عدد المسافات فيما يتعلق بكيفية كتابة الاسم تتكون من.

لا أعتقد أن هناك أي طريقة يمكنك من خلالها التحليل بدقة 100%.

يحاول www.address-parser.com.نحن نستخدم خدمة الويب الخاصة بهم، والتي يمكنك اختبارها عبر الإنترنت

بناءً على بيانات العينة:

  1. سأبدأ في نهاية السلسلة.تحليل الرمز البريدي (بأي من التنسيقين).قراءة النهاية إلى المساحة الأولى.إذا لم يتم العثور على الرمز البريدي خطأ.

  2. قم بقص النهاية ثم للمسافات والأحرف الخاصة (الفواصل)

  3. ثم انتقل إلى الحالة، واستخدم المسافة مرة أخرى كمحدد.ربما استخدم قائمة بحث للتحقق من صحة رموز الحالة المكونة من حرفين وأسماء الحالات الكاملة.إذا لم يتم العثور على حالة صالحة، فسيكون هناك خطأ.

  4. قم بقص المسافات والفواصل من النهاية مرة أخرى.

  5. تصبح المدينة صعبة، وأود في الواقع استخدام فاصلة هنا، مع المخاطرة بالحصول على الكثير من البيانات في المدينة.ابحث عن الفاصلة، أو بداية السطر.

  6. إذا كان لا يزال لديك أحرف متبقية في السلسلة، فقم بإدخال كل ذلك في حقل العنوان.

هذه ليست مثالية، ولكن يجب أن تكون نقطة انطلاق جيدة جدًا.

إذا كانت بيانات تم إدخالها بواسطة الإنسان، فسوف تقضي الكثير من الوقت في محاولة البرمجة حول الاستثناءات.

يحاول:

  1. التعبير العادي لاستخراج الرمز البريدي

  2. البحث عن الرمز البريدي (عبر قاعدة البيانات الحكومية المناسبة) للحصول على العنوان الصحيح

  3. احصل على متدرب للتحقق يدويًا من تطابق البيانات الجديدة مع البيانات القديمة

لن يحل هذا مشكلتك، ولكن إذا كنت تحتاج فقط إلى بيانات خطوط العرض/الطول لهذه العناوين، فستقوم واجهة برمجة تطبيقات خرائط Google بتحليل العناوين غير المنسقة بشكل جيد.

RecogniContact هو كائن Windows COM يقوم بتوزيع العناوين الأمريكية والأوروبية.يمكنك تجربتها بشكل صحيحhttp://www.loquisoft.com/index.php?page=8

قد ترغب في التحقق من ذلك!! http://jgeocoder.sourceforge.net/parser.htmlعملت مثل السحر بالنسبة لي.

يصعب حل هذا النوع من المشاكل بسبب الغموض الأساسي في البيانات.

فيما يلي حل قائم على لغة Perl يحدد شجرة قواعد النسب العودية استنادًا إلى التعبيرات العادية لتحليل العديد من المجموعات الصالحة لعناوين الشوارع: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua/EN/AddressParse.pm .يتضمن ذلك خصائص فرعية ضمن عنوان مثل:12 1st Avenue N Suite # 2 في مكان ما CA 12345 الولايات المتحدة الأمريكية

انه ايضا مشابه http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm المذكور أعلاه، ولكنه يعمل أيضًا مع العناوين التي ليست من الولايات المتحدة الأمريكية، مثل المملكة المتحدة وأستراليا وكندا.

هنا هو الناتج لأحد عناوين العينة الخاصة بك.لاحظ أنه يجب إزالة قسم الاسم أولاً من "A.ص.Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" لتقليله إلى "2299 Lewes-Georgetown Hwy, Georgetown, DE 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'

نظرًا لوجود احتمال حدوث خطأ في الكلمة، فكر في استخدام SOUNDEX مع خوارزمية LCS لمقارنة السلاسل، وهذا سيساعد كثيرًا!

باستخدام جوجل 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);

بالنسبة لمطوري روبي أو ريلز، هناك جوهرة جميلة متاحة تسمى عنوان الشارع.لقد كنت أستخدم هذا في أحد مشاريعي وهو يقوم بالعمل الذي أحتاجه.

المشكلة الوحيدة التي واجهتني كانت عندما يكون العنوان بهذا التنسيق P. O. Box 1410 Durham, NC 27702 لقد عاد صفرًا وبالتالي اضطررت إلى استبدال "P.يا.Box" مع "" وبعد ذلك تمكن من تحليله.

هناك خدمات بيانات توفر لك الرمز البريدي قائمة بأسماء الشوارع في هذا الرمز البريدي.

استخدم التعبير العادي لاستخراج الرمز البريدي أو حالة المدينة - ابحث عن الرمز الصحيح أو في حالة حدوث خطأ، احصل على كليهما.اسحب قائمة الشوارع من أ مصدر البيانات قم بتصحيح المدينة والدولة، ثم عنوان الشارع.بمجرد حصولك على سطر العنوان 1 والمدينة والولاية والرمز البريدي الصالح، يمكنك بعد ذلك إجراء افتراضات على سطر العنوان 2..3

لا أعرف مدى جدوى ذلك، لكنني لم أر هذا مذكورًا لذلك اعتقدت أنني سأمضي قدمًا وأقترح هذا:

إذا كنت في الولايات المتحدة بشكل صارم ...احصل على قاعدة بيانات ضخمة لجميع الرموز البريدية والولايات والمدن والشوارع.الآن ابحث عن هذه في عناوينك.يمكنك التحقق من صحة ما وجدته عن طريق اختبار ما إذا كانت المدينة التي وجدتها موجودة في الولاية التي وجدتها، أو عن طريق التحقق مما إذا كان الشارع الذي وجدته موجودًا في المدينة التي وجدتها.إذا لم يكن الأمر كذلك، فمن المحتمل أن جون ليس لشارع جون، ولكنه اسم المرسل إليه...في الأساس، احصل على أكبر قدر ممكن من المعلومات وتحقق من عناوينك مقابلها.أحد الأمثلة المتطرفة هو الحصول على قائمة بجميع العناوين الموجودة في الولايات المتحدة لـ A ثم العثور على العنوان الذي لديه التطابق الأكثر صلة بكل عنوان من عناوينك...

يوجد منفذ جافا سكريبت لـ Perl Geo::StreetAddress::US package: https://github.com/hassansin/parse-address .إنه يعتمد على regex ويعمل بشكل جيد إلى حد ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top