문제

회사 이름, 주소 및 연락처 이름이 포함 된 SQL Server 테이블이 있습니다.

우리는이 테이블과 일치 해야하는 외부 소스에서 데이터 파일을 정기적으로받습니다. 불행히도, 데이터는 완전히 다른 시스템에서 나오기 때문에 약간 다릅니다. 예를 들어, 우리는 "123 E. Main St."가 있습니다. 그리고 우리는 "123 East Main Street"를받습니다. 또 다른 예는 "ACME, LLC"가 있으며 파일에는 "ACME Inc."가 포함되어 있습니다. 또 다른 하나는 "Ed Smith"를 가지고 있으며 "Edward Smith"가 있습니다.

우리는 이러한 경기를 처리하기 위해 다소 복잡하고 CPU 집약적 인 방법을 활용하는 레거시 시스템이 있습니다. 일부는 순수한 SQL을 포함하고 다른 일부는 액세스 데이터베이스에 VBA 코드를 포함합니다. 현재 시스템은 좋지만 완벽하지는 않으며 번거롭고 유지하기가 어렵습니다.

여기 경영진은 사용을 확장하려고합니다. 시스템 지원을 상속받을 개발자는 유지 보수가 적은 애자일 솔루션으로 교체하려고합니다.

이러한 종류의 데이터 일치를 다루는 일반적으로 허용되는 방법이 있습니까?

도움이 되었습니까?

해결책

다음은 거의 동일한 스택을 위해 쓴 내용입니다 (하드웨어의 제조업체 이름을 표준화해야했으며 모든 종류의 변형이있었습니다). 이것은 클라이언트 측 (정확히 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) 퍼지 조회 이러한 데이터 정리 문제에 대해서만 설계되었습니다.

그 외에는 도메인 별 솔루션 만 알고 있습니다. 주소 청소, 또는 일반 문자열 일치 기술.

이런 종류의 패턴 매칭을 할 수있는 제품을 제공하는 많은 공급 업체가 있습니다. 나는 약간의 연구를 할 것입니다 훌륭하고 잘 보이는 제품을 찾고 집에서 재배 한 시스템을 긁어냅니다..

당신이 말했듯이, 당신의 제품은 단지 좋으며, 이것은 훌륭한 제품이 하나 이상 있다고 확신하는 비즈니스에 대한 일반적인 요구입니다. 라이센스에 수천 달러의 비용이 들더라도 사내에서 일하기 위해 많은 개발자를 지불하는 것보다 여전히 저렴합니다.

또한 "복잡한", "CPU 집약적", "VBA 코드"및 "액세스 데이터베이스"라는 문구가 시스템 설명에 함께 나타나는 사실은 좋은 타사 도구를 찾는 또 다른 이유입니다.

편집 : .NET에는 이런 종류의 작업을 수행하는 내장 구성 요소가있을 수도 있습니다.이 경우 비용을 지불 할 필요가 없습니다. .NET가 제공하는 도구에 여전히 가끔 놀랐습니다.

나는 정확히 같은 문제를 다루고 있습니다. 보세요:

일치하는 이름/주소 데이터를위한 도구

도움이 될 수있는 일부 도구.

액세스에는 실제로이를위한 도구가 없습니다. 이상적인 세상에서 나는 SSIS 솔루션과 함께 가서 퍼지 조회를 사용할 것입니다. 그러나 현재 액세스를 사용하고 있다면 사무실이 SQL Server Enterprise Edition을 구매할 가능성은 저에게 낮게 보입니다. 현재 환경에 갇혀 있으면 무차별 인력 접근을 시도 할 수 있습니다.

주소의 표준화 된 클렌징으로 시작하십시오. 거리, RAOD 등의 표준 약어를 선택하고 코드를 작성하여 모든 정상적인 변형을 표준 부가에 변경하십시오. 두 공간의 인스턴스를 하나의 공간으로 교체하고 모든 데이터를 다듬고 비 성격이없는 문자를 제거하십시오. 보시다시피 이것은 꽤 작업입니다.

회사 이름은 이름의 처음 5 자와 주소 또는 전화에서 일치시킬 수 있습니다. 또한 알려진 변형 테이블과 미래 파일을 정리하는 데 사용할 데이터베이스에서 관련된 내용을 만들 수도 있습니다. 따라서 ID 100으로 녹음하면 Acme, Inc.가 다음과 같은 테이블을 가질 수 있습니다.

Idfield 이름

100 Acme, Inc.

100 Acme, Inc

100 ACME, 통합

100 ACME, LLC

100 acme

이것은 작게 시작되지만 중복을 찾아서 수정할 때마다 항목을 만들면 시간이 지남에 따라 구축됩니다 (Dupping Process의 일부로 만들기). 기존 회사의 이름과 주소.

또한 Torial이 게시 된 기능을보고 도움이되는지 확인합니다.

이 모든 것은 고통스럽고 시간이 걸리지 만 새로운 변형을 찾아 코드 나 목록에 추가 할 때 시간이 지남에 따라 더 나아질 것입니다. 주소 데이터를 지식으로 결정한 경우 먼저 생산 데이터를 정리 한 다음 작업 테이블로 가져 와서 청소 한 다음 생산 데이터에 맞추고 새로운 레코드를 삽입하십시오.

방금 이것을 찾았습니다 링크 그것은 관련이 있습니다.

나는 이것을 게시하기 전에 내가 보았다고 맹세한다.

분명하지 않을 수도있는 방법을 다루는 방법이 꽤 있습니다. 가장 좋은 점은 필드 외부에서 MIS 철자 등을 일치시키는 데 사용할 수있는 고유 식별자를 찾는 것입니다.

몇 가지 생각

  1. 명백한 사회 보장 번호, 운전 면허증 등
  2. 이메일 주소
  3. 정리 전화 번호 (rremove 구두점 등)

공급 업체가가는 한 방금 비슷한 질문에 대답하고 아래를 붙여 넣고 있습니다.

각 주요 제공 업체에는 고유 한 솔루션이 있습니다. Oracle, IBM, SAS DataFlux 등은 이러한 종류의 문제에서 최고라고 주장합니다.

독립적 인 검증 평가 :

호주의 Curtin University Center for Data Linkage에서 440 만 레코드의 일치를 시뮬레이션 한 연구가 수행되었습니다. 공급자가 정확도 측면에서 무엇을했는지 확인했습니다 (사용 가능한 일치 수치 대 허위 일치 수)

Datamatch Enterprise, 최고 정확도 (> 95%), 매우 빠르고 저렴한 비용

IBM 품질 단계 , 높은 정확도 (> 90%), 매우 빠르고 높은 비용 (> $ 100K)

SAS 데이터 플럭스, 중간 정확도 (> 85%), 빠르고 높은 비용 (> 100k)이 우리가 찾을 수있는 가장 독립적 인 평가는 매우 철저했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top