سؤال

أحاول التوصل إلى طريقة لإيجاد عناوين مكررة ، بناءً على درجة التشابه. النظر في هذه العناوين المكررة:

addr_1 = '# 3 FAIRMONT LINK SOUTH'
addr_2 = '3 FAIRMONT LINK S'

addr_3 = '5703 - 48TH AVE'
adrr_4 = '5703- 48 AVENUE'

أخطط لتطبيق بعض تحويل السلسلة لجعل كلمات طويلة مختصرة ، مثل الشمال -> n ، قم بإزالة جميع المساحات والفواصل والشرطات ورموز الجنيه. الآن ، بعد هذا الإخراج ، كيف يمكنني مقارنة ADDR_3 مع بقية العناوين والاكتشاف مماثلة؟ ما هي نسبة التشابه ستكون آمنة؟ هل يمكنك تقديم رمز بيثون بسيط لهذا؟

addr_1 = '3FAIRMONTLINKS'
addr_2 = '3FAIRMONTLINKS'

addr_3 = '570348THAV'
adrr_4 = '570348AV'

ممتن ،

إدواردو

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

المحلول

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

adr = " ".join(adr.tolower().split())

بعد ذلك ، كنت أقوم بتجريد أشياء مثل "ST" في "41 Street" أو "ND" في "42nd Street":

adr = re.sub("1st(\b|$)", r'1', adr)
adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)

لاحظ أن Sub Sub () الثاني ستعمل مع مساحة بين "2" و "ND" ، لكنني لم أقم بتعيين أول واحد للقيام بذلك ؛ لأنني لست متأكدًا من كيفية معرفة الفرق بين "41 St Ave" و "41 ST" (هذا الثاني هو "41 Street" مختصر).

تأكد من قراءة كل المساعدة لوحدة Re ؛ إنه قوي ولكنه خفي.

بعد ذلك ، أود أن أقسم ما تركته في قائمة الكلمات ، وأطبق خوارزمية Soundex لسرد العناصر التي لا تشبه الأرقام:

http://en.wikipedia.org/wiki/Soundex

http://wwwhomes.uni-bielefeld.de/gibbon/forms/python/search/soundex.html

adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]

ثم يمكنك العمل مع القائمة أو الانضمام إليها مرة أخرى إلى سلسلة كما تعتقد بشكل أفضل.

الفكرة الكاملة لشيء Soundex هي التعامل مع العناوين المبذولة. قد لا يكون هذا ما تريد ، وفي هذه الحالة فقط تجاهل فكرة Soundex هذه.

حظا طيبا وفقك الله.

نصائح أخرى

ستكون إزالة المساحات والفواصل والشرطات غامضة. سيكون من الأفضل استبدالها بمساحة واحدة.

خذ على سبيل المثال هذا العنوان

56 5th avenue

وهذا

5, 65th avenue

مع طريقتك سيكون كلاهما:

565THAV

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

يمكن أن تذهب الخوارزمية مثل هذا:

  1. استبدل جميع شرطات الفواصل بالمساحات. استخدم هو يترجم طريقة لذلك.
  2. بناء قاموس مع الكلمات وشكلها المختصر
  3. مسح ال TH جزء إذا كان يتبع رقم.

يجب أن يكون هذا مفيدًا في بناء قاموس الاختصارات الخاص بك:

http://www.usps.com/ncsc/lookups/usps_abbreviations.html

من أجل القيام بذلك بشكل صحيح ، تحتاج إلى توحيد عناوينك وفقًا لمعايير USPS (يبدو أن أمثلة عنوانك مقرها). هناك العديد من مقدمي خدمات التسويق المباشر الذين يقدمون كاس (نظام دعم دقة الترميز) شهادة العناوين البريدية. ستقوم عملية CASS بتوحيد جميع عناوينك وإلحاق ZIP + 4 بها. سيتم وضع علامة على أي عناوين غير قابلة للتسليم مما يزيد من تكاليف البريد البريدي ، إذا كان هذا هو نيتك. بمجرد توحيد جميع عناوينك ، سيكون التخلص من التكرارات تافهة.

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

ستحتاج إلى استخدام تطبيق Levenshtein في C بدلاً من Python إذا كان لديك مجموعة بيانات كبيرة. كان منجم بضعة عشرات من الآلاف واستغرق جزءًا أفضل من يوم الجري ، على ما أعتقد.

أتفقد عناوين التكرار بانتظام حيث أعمل ، ويجب أن أقول ، أجد Soundex غير مناسب للغاية. كلاهما بطيء للغاية وحريص جدًا على مطابقة الأشياء. لدي مشكلات مماثلة مع مسافة Levenshtein.

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

من المفيد بالتأكيد القيام ببعض التغيير والتبديل ، مثل استبدال بعض الاختصارات الشائعة. تساعد USPS ، على الرغم من أنني لن أذهب إلى محاولة تنفيذها جميعًا ، وبعض البدائل الأكثر قيمة ليست على تلك القوائم. على سبيل المثال ، يجب أن تكون "JFK" مباراة لـ "John F Kennedy" ، وهناك عدد من الطرق الشائعة لتقصير "Martin Luther King Jr".

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

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

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