سؤال

لدينا جدول SQL Server يحتوي على اسم الشركة والعنوان واسم جهة الاتصال (من بين أشياء أخرى).

نتلقى بانتظام ملفات بيانات من مصادر خارجية تتطلب منا مطابقة هذا الجدول.ولسوء الحظ، تختلف البيانات قليلاً لأنها تأتي من نظام مختلف تمامًا.على سبيل المثال، لدينا "123 E.الشارع الرئيسي" ونستقبل "123 الشارع الرئيسي الشرقي".مثال آخر، لدينا "Acme, LLC" ويحتوي الملف على "Acme Inc.".الآخر هو أن لدينا "إد سميث" وهم لديهم "إدوارد سميث"

لدينا نظام قديم يستخدم بعض الأساليب المعقدة والمكثفة لوحدة المعالجة المركزية للتعامل مع هذه المطابقات.يتضمن بعضها SQL خالصًا والبعض الآخر يشتمل على تعليمات برمجية VBA في قاعدة بيانات Access.النظام الحالي جيد لكنه ليس مثاليا وهو مرهق ويصعب صيانته

الإدارة هنا تريد توسيع استخدامها.يريد المطورون الذين سيرثون دعم النظام استبداله بحل أكثر مرونة يتطلب صيانة أقل.

هل هناك طريقة مقبولة للتعامل مع هذا النوع من مطابقة البيانات؟

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

المحلول

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

    Public Shared Function FindMostSimilarString(ByVal toFind As String, ByVal ParamArray stringList() As String) As String
        Dim bestMatch As String = ""
        Dim bestDistance As Integer = 1000 'Almost anything should be better than that!

        For Each matchCandidate As String In stringList
            Dim candidateDistance As Integer = LevenshteinDistance(toFind, matchCandidate)
            If candidateDistance < bestDistance Then
                bestMatch = matchCandidate
                bestDistance = candidateDistance
            End If
        Next

        Return bestMatch
    End Function

    'This will be used to determine how similar strings are.  Modified from the link below...
    'Fxn from: http://ca0v.terapad.com/index.cfm?fa=contentNews.newsDetails&newsID=37030&from=list
    Public Shared Function LevenshteinDistance(ByVal s As String, ByVal t As String) As Integer
        Dim sLength As Integer = s.Length ' length of s
        Dim tLength As Integer = t.Length ' length of t
        Dim lvCost As Integer ' cost
        Dim lvDistance As Integer = 0
        Dim zeroCostCount As Integer = 0

        Try
            ' Step 1
            If tLength = 0 Then
                Return sLength
            ElseIf sLength = 0 Then
                Return tLength
            End If

            Dim lvMatrixSize As Integer = (1 + sLength) * (1 + tLength)
            Dim poBuffer() As Integer = New Integer(0 To lvMatrixSize - 1) {}

            ' fill first row
            For lvIndex As Integer = 0 To sLength
                poBuffer(lvIndex) = lvIndex
            Next

            'fill first column
            For lvIndex As Integer = 1 To tLength
                poBuffer(lvIndex * (sLength + 1)) = lvIndex
            Next

            For lvRowIndex As Integer = 0 To sLength - 1
                Dim s_i As Char = s(lvRowIndex)
                For lvColIndex As Integer = 0 To tLength - 1
                    If s_i = t(lvColIndex) Then
                        lvCost = 0
                        zeroCostCount += 1
                    Else
                        lvCost = 1
                    End If
                    ' Step 6
                    Dim lvTopLeftIndex As Integer = lvColIndex * (sLength + 1) + lvRowIndex
                    Dim lvTopLeft As Integer = poBuffer(lvTopLeftIndex)
                    Dim lvTop As Integer = poBuffer(lvTopLeftIndex + 1)
                    Dim lvLeft As Integer = poBuffer(lvTopLeftIndex + (sLength + 1))
                    lvDistance = Math.Min(lvTopLeft + lvCost, Math.Min(lvLeft, lvTop) + 1)
                    poBuffer(lvTopLeftIndex + sLength + 2) = lvDistance
                Next
            Next
        Catch ex As ThreadAbortException
            Err.Clear()
        Catch ex As Exception
            WriteDebugMessage(Application.StartupPath , [Assembly].GetExecutingAssembly().GetName.Name.ToString, MethodBase.GetCurrentMethod.Name, Err)
        End Try

        Return lvDistance - zeroCostCount
    End Function

نصائح أخرى

SSIS (في Sql 2005+ Enterprise) لديه بحث غامض والذي تم تصميمه لمثل هذه المشكلات المتعلقة بتنظيف البيانات.

بخلاف ذلك، لا أعرف سوى الحلول الخاصة بالمجال - مثل تنظيف العنوان, ، أو عام تقنيات مطابقة السلسلة.

هناك العديد من البائعين الذين يقدمون منتجات للقيام بهذا النوع من مطابقة الأنماط.سأقوم ببعض الأبحاث و ابحث عن منتج جيد وذو سمعة طيبة وقم بإلغاء النظام المحلي.

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

كما أن حقيقة ظهور العبارات "معقدة" و"مكثفة لوحدة المعالجة المركزية" و"رمز VBA" و"قاعدة بيانات الوصول" معًا في وصف نظامك هي سبب آخر للعثور على أداة جيدة تابعة لجهة خارجية.

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

أنا أتعامل مع نفس المشكلة بالضبط.ألق نظرة على:

أدوات لمطابقة بيانات الاسم/العنوان

لبعض الأدوات التي قد تساعد.

لا يمتلك Access حقًا الأدوات اللازمة لذلك.في عالم مثالي سأختار حل SSIS وأستخدم البحث الغامض.ولكن إذا كنت تستخدم Access حاليًا، فإن فرص شراء مكتبك لإصدار SQL Server Enterprise تبدو منخفضة بالنسبة لي.إذا كنت عالقًا في البيئة الحالية، فيمكنك تجربة نهج القوة الغاشمة.

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

أما بالنسبة لأسماء الشركات، فربما يمكنك تجربة مطابقة الأحرف الخمسة الأولى من الاسم والعنوان أو الهاتف.يمكنك أيضًا إنشاء جدول يتضمن الاختلافات المعروفة وما سترتبط به في قاعدة بياناتك لاستخدامه في تنظيف الملفات المستقبلية.لذا، إذا قمت بالتسجيل بالمعرف 100، فهذا يعني أن شركة Acme, Inc.يمكن أن يكون لديك جدول مثل هذا:

اسم ايدفيلد

100 ذروة، وشركة

100 ذروة، وشركة

100 ذروة، إنكوربوريتد

100 ذروة، ذ م م

100 قمة

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

سألقي نظرة أيضًا على هذه الوظيفة التي نشرها Torial وأرى ما إذا كانت مفيدة.

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

لقد وجدت هذا للتو وصلة هذا مرتبط.

أقسم أنني نظرت قبل أن أنشر هذا.

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

بعض الأفكار

  1. الرقم الواضح، رقم الضمان الاجتماعي، رخصة القيادة، وما إلى ذلك
  2. عنوان البريد الإلكتروني
  3. رقم الهاتف الذي تم تنظيفه (إزالة علامات الترقيم، وما إلى ذلك)

بقدر ما يذهب البائعون، فقد أجبت للتو على سؤال مماثل وأقوم بلصقه أدناه.

كل مزود رئيسي لديه الحل الخاص به.Oracle وIBM وSAS Dataflux وما إلى ذلك، وكل منهم يدعي أنه الأفضل في هذا النوع من المشكلات.

تقييم مستقل تم التحقق منه:

كانت هناك دراسة أجريت في مركز جامعة كيرتن لربط البيانات في أستراليا والتي قامت بمحاكاة مطابقة 4.4 مليون سجل.حدد ما لدى مقدمي الخدمة من حيث الدقة (عدد التطابقات التي تم العثور عليها مقابل المتاحة.عدد المطابقات الخاطئة)

مؤسسة داتا ماتش, أعلى دقة (> 95%)، سريعة جدًا، منخفضة التكلفة

مرحلة الجودة في آي بي إم دقة عالية (> 90%)، سريعة جدًا، عالية التكلفة (> 100 ألف دولار)

كان تدفق بيانات SAS ، دقة متوسطة (> 85 ٪) ، سريع التكلفة (> 100K) التي كانت أفضل تقييم مستقل يمكن أن نجده ، شاملًا للغاية.

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