Frage

Wir haben eine SQL Server-Tabelle, die (unter anderem) Firmennamen, Adresse und Kontaktnamen enthält.

Wir erhalten regelmäßig Datendateien von externen Quellen, die einen Abgleich mit dieser Tabelle erfordern.Leider unterscheiden sich die Daten geringfügig, da sie aus einem völlig anderen System stammen.Zum Beispiel haben wir „123 E.Main St.“ und wir erhalten „123 East Main Street“.Ein weiteres Beispiel: Wir haben „Acme, LLC“ und die Datei enthält „Acme Inc.“.Eine andere ist, wir haben „Ed Smith“ und sie haben „Edward Smith“

Wir verfügen über ein Legacy-System, das einige ziemlich komplizierte und CPU-intensive Methoden zur Handhabung dieser Spiele verwendet.Bei einigen handelt es sich um reines SQL, bei anderen um VBA-Code in einer Access-Datenbank.Das aktuelle System ist gut, aber nicht perfekt, außerdem ist es umständlich und schwierig zu warten

Hier will das Management die Nutzung ausbauen.Die Entwickler, die die Unterstützung des Systems übernehmen, möchten es durch eine agilere Lösung ersetzen, die weniger Wartung erfordert.

Gibt es eine allgemein akzeptierte Möglichkeit, mit dieser Art des Datenabgleichs umzugehen?

War es hilfreich?

Lösung

Hier ist etwas, was ich für einen fast identischen Stack geschrieben (wir benötigt, um die Herstellernamen für die Hardware zu standardisieren und es gab alle möglichen Variationen). Dies ist Client-Seite, obwohl (VB.Net genau zu sein) - und den Algorithmus Levenshtein Abstand verwenden (für bessere Ergebnisse modifiziert):

    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

Andere Tipps

SSIS (in Sql 2005+ Enterprise) hat Fuzzysuche das für nur solche Datenbereinigung Probleme entwickelt.

Other than that, ich weiß nur von domänenspezifischen Lösungen - wie zum Beispiel Adresse Reinigung oder allgemeinen String-Matching-Techniken .

Es gibt viele Anbieter, die Produkte für diese Art des Mustervergleichs anbieten.Ich würde etwas recherchieren und Finden Sie ein gutes, renommiertes Produkt und verwerfen Sie das selbst entwickelte System.

Wie Sie sagen, ist Ihr Produkt einfach nur gut, und das ist ein weit verbreitetes Bedürfnis von Unternehmen, sodass ich mir sicher bin, dass es mehr als ein hervorragendes Produkt gibt.Selbst wenn eine Lizenz ein paar tausend Dollar kostet, ist sie immer noch günstiger, als eine Gruppe von Entwicklern dafür zu bezahlen, dass sie intern an etwas arbeiten.

Auch die Tatsache, dass die Begriffe „kompliziert“, „CPU-intensiv“, „VBA-Code“ und „Access-Datenbank“ in der Beschreibung Ihres Systems zusammen vorkommen, ist ein weiterer Grund, ein gutes Tool eines Drittanbieters zu finden.

BEARBEITEN:Es ist auch möglich, dass .NET über eine integrierte Komponente verfügt, die so etwas erledigt. In diesem Fall müssten Sie nicht dafür bezahlen.Ich bin immer noch hin und wieder von den Tools überrascht, die .NET bietet.

Ich bin der Umgang mit genau dem gleichen Problem. Schauen Sie sich auf:

Tools für die passenden Namen / Adressdaten

für einige Werkzeuge, die helfen können.

Der Zugang hat nicht wirklich die Werkzeuge dafür. In einer idealen Welt würde ich mit der SSIS-Lösung gehen und Fuzzy-Suche verwenden. Aber wenn Sie zur Zeit Zugang verwenden, scheinen die Chancen für Ihr Büro Kauf SQL Server Enterprise Edition mir gering. Wenn Sie mit der aktuellen Umgebung steckt, könnten Sie einen Brute-Force-Ansatz versuchen.

Starten Sie mit standardisierter Reinigung von Adressen. PICK Standardabkürzungen für Street, raod usw. und schreiben Code alle normalen Variationen zu diesen Standard addesses zu ändern. Ersetzen alle Instanzen von zwei Räume mit einem Raum, schneiden alle Daten und entfernen Sie alle nicht-alphanumerischen Zeichen. Wie Sie sehen dies ist eine schwierige Aufgabe.

Wie bei den Firmennamen, vielleicht können Sie versuchen, auf den ersten 5 Zeichen des Namens und der Adresse oder Telefon entsprechen. Sie können auch eine Tabelle von bekannten Variationen erstellen und was sie beziehen in Ihrer Datenbank für cleanising Zukunft Dateien zu verwenden. Also, wenn Sie mit der ID aufnehmen 100 ist Acme, Inc. Sie eine Tabelle wie diese haben könnte:

idfield Name

100 Acme, Inc.

100 Acme, Inc

100 Acme, Incorporated

100 Acme, LLC

100 Acme

Dies wird klein anfangen, aber im Laufe der Zeit bauen, wenn Sie einen Eintrag jedes Mal, wenn ein Duplikat finden machen und beheben (es de-dupping Prozess ein Teil von Ihnen machen), und wenn Sie einen Eintrag jedes Mal machen Sie sind in der Lage, die erste übereinstimmen Teil des Namens und Adresse eines bestehenden Unternehmens.

Ich würde auch in dieser Funktion sehen Torial geschrieben und sehen, ob es hilft.

All dies wäre schmerzhaft und zeitraubend sein, aber wäre besser im Laufe der Zeit, wie Sie neue Variationen finden und sie auf den Code oder Liste hinzuzufügen. Wenn Sie sich entscheiden, Ihre Address stardardize, stellen Sie sicher, erste Produktionsdaten zu reinigen, tun dann alle Importe an einem Arbeitstisch und reinigen, dann versuchen zu Produktionsdaten entsprechen und neue Datensätze einzufügen.

Ich habe gerade dieser Link dass in Zusammenhang steht.

Ich schwöre, dass ich sehe, bevor ich gepostet.

Es gibt durchaus ein paar Möglichkeiten, dies zu bewältigen, die nicht offensichtlich sein können. Das beste ist das Auffinden eindeutige Kennungen, die Sie für den Abgleich außerhalb der Felder mit mis Schreibweisen verwenden können, etc.

Einige Gedanken

  1. Die offensichtliche, Sozialversicherungsnummer, Führerschein, usw.
  2. E-Mail-Adresse
  3. Gereinigt Telefonnummer (Rremove Zeichensetzung, etc.)

Soweit Anbieter gehen, antwortete ich nur eine ähnliche Frage und sind Einfügen unten.

Jeder größerer Anbieter ihre eigene Lösung hat. Oracle, IBM, SAS DataFlux, etc. und jeder Anspruch die besten in dieser Art von Problem zu sein.

Unabhängig verifiziert Auswertung:

Es wurde eine Studie an der Curtin University Center for Data Linkage in Australien durchgeführt, die die Anpassung von 4,4 Millionen Datensätze simuliert. Das identifizieren, was Anbieter in Bezug auf Genauigkeit hatte (Anzahl Spiele vs verfügbar gefunden. Anzahl der falschen Ursachen)

Datamatch Unternehmen, Höchste Genauigkeit (> 95%), sehr schnell, Low Cost

IBM Qualität Bühne , hohe Genauigkeit (> 90 %), sehr schnell, hohen Kosten (> $ 100K)

SAS Datenstrom, Mittel Genauigkeit (> 85%), Schnell, hohen Kosten (> 100 K) Das war die beste unabhängige Bewertung die wir finden konnten, war sehr gründlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top