2008-09-24 46 views
5

Chúng tôi có một bảng SQL Server có chứa tên công ty, địa chỉ, và tên liên lạc (trong số những người khác).So sánh dữ liệu

Chúng tôi thường xuyên nhận tệp dữ liệu từ các nguồn bên ngoài yêu cầu chúng tôi đối sánh với bảng này. Thật không may, dữ liệu hơi khác vì dữ liệu đến từ một hệ thống hoàn toàn khác. Ví dụ: chúng tôi có "123 E. Main St." và chúng tôi nhận được "123 East Main Street". Một ví dụ khác, chúng tôi có "Acme, LLC" và tệp chứa "Acme Inc.". Một điều khác là, chúng tôi có "Ed Smith" và họ có "Edward Smith"

Chúng tôi có một hệ thống kế thừa sử dụng một số phương pháp chuyên sâu và phức tạp để xử lý các kết quả phù hợp này. Một số liên quan đến SQL thuần túy và những người khác liên quan đến mã VBA trong cơ sở dữ liệu Access. Hệ thống hiện tại tốt nhưng không hoàn hảo và rất cồng kềnh và khó bảo trì

Quản lý ở đây muốn mở rộng việc sử dụng nó. Các nhà phát triển sẽ kế thừa sự hỗ trợ của hệ thống muốn thay thế nó bằng một giải pháp nhanh nhẹn hơn đòi hỏi phải bảo trì ít hơn.

Có cách nào được chấp nhận phổ biến để xử lý loại đối sánh dữ liệu này không?

Trả lời

4

Đây là thứ tôi đã viết cho một chồng gần giống nhau (chúng tôi cần chuẩn hóa tên nhà sản xuất phần cứng và có tất cả các loại biến thể). Đây là mặt hàng mặc dù (VB.Net để được chính xác) - và sử dụng các thuật toán khoảng cách Levenshtein (sửa đổi cho kết quả tốt hơn):

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 
+0

Điều này có vẻ tuyệt vời! Cám ơn vì đã chia sẻ. – wcm

2

SSIS (trong SQL 2005 + Doanh nghiệp) có Fuzzy Lookup được thiết kế chỉ các vấn đề làm sạch dữ liệu như vậy.

Ngoài ra, tôi chỉ biết các giải pháp cụ thể của miền - chẳng hạn như address cleaning hoặc chung string matching techniques.

+0

Đó là những liên kết tuyệt vời và Tra cứu Fuzzy trông hấp dẫn. Cảm ơn – wcm

2

Có nhiều nhà cung cấp ở đó cung cấp sản phẩm để thực hiện loại đối sánh mẫu này. Tôi sẽ làm một số nghiên cứu và tìm thấy một sản phẩm tốt, có uy tín và phế liệu hệ thống trồng tại nhà.

Như bạn nói, sản phẩm của bạn chỉ tốt và đây là nhu cầu phổ biến cho các doanh nghiệp mà tôi chắc chắn có nhiều sản phẩm tuyệt vời. Ngay cả khi chi phí vài nghìn đô la cho một giấy phép, nó vẫn sẽ rẻ hơn so với việc trả một loạt các nhà phát triển để làm việc trên một cái gì đó trong nhà.

Ngoài ra, thực tế là cụm từ "phức tạp", "CPU chuyên sâu", "mã VBA" và "Cơ sở dữ liệu Access" xuất hiện cùng nhau trong mô tả của hệ thống là một lý do khác để tìm một công cụ tốt của bên thứ ba.

EDIT: cũng có thể .NET có một thành phần tích hợp thực hiện loại điều này, trong trường hợp đó bạn sẽ không phải trả tiền cho nó. Tôi vẫn nhận được ngạc nhiên một lần trong một thời gian bởi các công cụ mà NET cung cấp.

+0

Điều đó có vẻ như là lời khuyên tốt về âm thanh. Tôi sẽ phải nói rằng hệ thống chỉ tăng trưởng trong vài năm qua. Đó là tại chỗ khi tôi đến đây và nó luôn hoạt động tốt. Các từ khóa "Truy cập" và "VBA" làm cho tôi rìa một chút: o) Cảm ơn! – wcm

+0

Lắng nghe một lập trình viên nói về ứng dụng Access mà họ vừa kế thừa giống như lắng nghe nạn nhân ung thư nói về hóa trị. Tôi thông cảm, nhưng tôi chắc chắn sẽ không muốn là bạn. – MusiGenesis

2

Tôi đang xử lý chính xác cùng một vấn đề. Hãy xem:

Tools for matching name/address data

cho một số công cụ có thể hữu ích.

+0

Tôi đã thực hiện tìm kiếm trước khi thêm câu hỏi. Tôi thề. Câu hỏi đó có một số câu trả lời thực sự tốt. Cảm ơn bạn – wcm

1

Truy cập không thực sự có các công cụ cho việc này. Trong một thế giới lý tưởng, tôi sẽ đi với giải pháp SSIS và sử dụng tra cứu mờ. Nhưng nếu bạn hiện đang sử dụng truy cập, cơ hội của văn phòng của bạn mua phiên bản SQL Server Enterprise có vẻ thấp với tôi. Nếu bạn đang mắc kẹt với môi trường hiện tại, bạn có thể thử một cách tiếp cận vũ phu.

Bắt đầu với các địa chỉ làm sạch được chuẩn hóa. Các chữ viết tắt chuẩn của PIck cho Đường phố, raod, v.v. và viết mã để thay đổi tất cả các biến thể thông thường thành các phụ trang chuẩn. Thay thế bất kỳ phiên bản nào của hai dấu cách bằng một dấu cách, cắt tất cả dữ liệu và xóa mọi ký tự không phải chữ và số. Như bạn có thể thấy đây là một nhiệm vụ khá.

Đối với tên công ty, có thể bạn có thể thử khớp với 5 ký tự đầu tiên của tên và địa chỉ hoặc số điện thoại. Bạn cũng có thể tạo một bảng các biến thể đã biết và những gì chúng sẽ liên quan đến trong cơ sở dữ liệu của bạn để sử dụng để làm sạch các tệp trong tương lai. Vì vậy, nếu bạn ghi lại với id 100 được Acme, Inc. bạn có thể có một bảng như thế này:

idfield Tên

100 Acme, Inc.

100 Acme, Inc

100 Acme, kết hợp

100 Acme, LLC

100 Acme

Điều này sẽ bắt đầu nhỏ nhưng xây dựng theo thời gian nếu bạn thực hiện một mục nhập mỗi khi bạn tìm và sửa một bản sao (làm cho nó trở thành một phần của quá trình tách bỏ) và nếu bạn thực hiện mục nhập mỗi khi bạn có thể khớp phần đầu tiên của tên và địa chỉ cho một công ty hiện có.

Tôi cũng xem xét chức năng Torial đã đăng và xem liệu nó có giúp ích hay không.

Tất cả điều này sẽ gây đau đớn và thời gian, nhưng sẽ tốt hơn theo thời gian khi bạn tìm các biến thể mới và thêm chúng vào mã hoặc danh sách. Nếu bạn quyết định stardardize địa chỉ của bạn, hãy chắc chắn để làm sạch dữ liệu sản xuất đầu tiên, sau đó làm bất kỳ nhập khẩu vào một bảng làm việc và làm sạch nó, sau đó cố gắng để phù hợp với dữ liệu sản xuất và chèn bản ghi mới.

+0

Cảm ơn bạn đã trả lời chu đáo. Dữ liệu sống trên máy chủ SQL Server 2000 Enterprise. Chúng tôi có acces đến năm 2005. Đây chỉ là cách mà các nhà thầu quyết định giải quyết vấn đề này cụ thể tại thời điểm đó. Đây là lý do tại sao bạn KHÔNG BAO GIỜ sử dụng quyền truy cập ngay cả đối với các nhiệm vụ dường như không quan trọng. – wcm

+0

Bạn luôn có thể thay đổi chương trình phụ trợ cho máy chủ SQL, tất cả các giao diện người dùng đều hoạt động và cho phép bạn dọn dẹp trong phần cuối. – HLGEM

0

Tôi vừa tìm thấy điều này link có liên quan.

Tôi thề rằng tôi đã xem trước khi đăng nội dung này.

0

Có một số cách để giải quyết vấn đề này có thể không rõ ràng. Điều tốt nhất là tìm định danh duy nhất mà bạn có thể sử dụng cho phù hợp với bên ngoài của các trường với mis đánh vần vv

Vài suy nghĩ

  1. Rõ ràng, số an sinh xã hội, bằng lái xe, vv
  2. Địa chỉ email
  3. Cleansed số điện thoại (Rremove chấm câu, vv)

theo như các nhà cung cấp đi tôi chỉ trả lời một câu hỏi tương tự và đang dán bên dưới.

Mỗi nhà cung cấp chính không có giải pháp riêng của họ. Oracle, IBM, SAS Dataflux, vv và mỗi tuyên bố là tốt nhất ở loại vấn đề này.

độc lập đánh giá xác nhận:

Có một nghiên cứu thực hiện tại Trung tâm Đại học Curtin cho Dữ liệu Mối liên hệ tại Úc mà mô phỏng sự kết hợp của 4,4 triệu hồ sơ.Xác định những gì nhà cung cấp đã về độ chính xác (Số đối sánh tìm thấy vs sẵn. Số đối sánh false)

DataMatch Enterprise, Độ chính xác cao nhất (> 95%), Rất nhanh, Low Cost

IBM Quality Stage, độ chính xác cao (> 90 %), Rất nhanh, Chi phí cao (> $ 100K)

Dữ liệu SAS, độ chính xác trung bình (> 85%), nhanh, chi phí cao (> 100K) Đó là đánh giá độc lập tốt nhất mà chúng tôi có thể tìm thấy triệt để.

Các vấn đề liên quan