2011-07-13 18 views
41

Tôi đang cố gắng dọn sạch một cơ sở dữ liệu, trong nhiều năm, đã có nhiều bản ghi trùng lặp, với các tên hơi khác nhau. Ví dụ, trong bảng công ty, có những cái tên như "Some Company Limited" và "MỘT SỐ CÔNG TY TNHH!". Kế hoạch của tôi là xuất các bảng vi phạm thành R, chuyển đổi tên thành chữ thường, thay thế các từ đồng nghĩa chung (như "limited" -> "ltd"), loại bỏ các ký tự không phải chữ cái và sau đó sử dụng agrep để xem giống.Các kỹ thuật tìm kiếm các bản ghi trùng lặp gần

Vấn đề đầu tiên của tôi là agrep chỉ chấp nhận một mẫu duy nhất để khớp và lặp lại mọi tên công ty để khớp với tên công ty khác chậm. (Một số bàn sẽ được làm sạch sẽ có hàng chục, có thể là hàng trăm nghìn tên để kiểm tra.)

Tôi đã xem qua gói tm (JSS article) và có vẻ rất mạnh mẽ nhưng hướng tới phân tích các khối lớn văn bản, chứ không chỉ là tên.

Tôi có một số câu hỏi liên quan:

  1. là thích hợp tm gói cho loại nhiệm vụ?

  2. Có giải pháp thay thế nhanh hơn cho agrep không? (Said chức năng sử dụng Levenshtein chỉnh sửa khoảng cách đó là giai thoại chậm.)

  3. Có các công cụ thích hợp khác trong R, ngoài agreptm?

  4. Tôi có nên làm điều này trong R hay không, hoặc loại điều này có phải là được thực hiện trực tiếp trong cơ sở dữ liệu không? (Đây là một cơ sở dữ liệu truy cập, vì vậy tôi muốn thay vì tránh chạm vào nó nếu có thể.)

+5

Liên quan đến [Làm thế nào để đo lường sự tương đồng giữa các chuỗi?] (http://stackoverflow.com/questions/6044112/r-how-to-measure-similarity-between-strings) –

Trả lời

29

Nếu bạn chỉ cần làm theo lô nhỏ được tương đối tốt được hình thành, thì compare.linkage() hoặc compare.dedup() chức năng trong RecordLinkage package nên là một điểm khởi đầu tuyệt vời. Nhưng nếu bạn có lô lớn, thì bạn có thể phải làm thêm một số tinkering.

tôi sử dụng các chức năng jarowinkler(), levenshteinSim(), và soundex() trong RecordLinkage để viết chức năng riêng của tôi có sử dụng chương trình trọng của riêng tôi (cũng như nó có, bạn có thể không sử dụng soundex() cho các tập dữ liệu lớn với RecordLinkage).

Nếu tôi có hai danh sách tên mà tôi muốn khớp ("liên kết ghi"), thì tôi thường chuyển đổi cả hai thành chữ thường và xóa tất cả các dấu chấm câu. Để chăm sóc "Limited" so với "LTD", tôi thường tạo một vectơ khác của từ đầu tiên từ mỗi danh sách, cho phép thêm trọng số vào từ đầu tiên. Nếu tôi nghĩ rằng một danh sách có thể chứa từ viết tắt (có thể là ATT hoặc IBM) thì tôi sẽ viết tắt danh sách khác. Đối với mỗi danh sách, tôi kết thúc với một khung dữ liệu của các chuỗi mà tôi muốn so sánh mà tôi viết dưới dạng các bảng riêng biệt trong cơ sở dữ liệu MySQL.

Vì vậy mà tôi không kết thúc với quá nhiều ứng cử viên, tôi LEFT OUTER JOIN hai bảng này trên một cái gì đó để phù hợp giữa hai danh sách (có thể đó là ba chữ cái đầu tiên trong mỗi danh sách hoặc ba người đầu tiên chữ cái và ba chữ cái đầu tiên trong từ viết tắt).Sau đó, tôi tính toán điểm số trận đấu bằng cách sử dụng các chức năng trên.

Bạn vẫn phải thực hiện rất nhiều kiểm tra thủ công, nhưng bạn có thể sắp xếp điểm số để nhanh chóng loại trừ các kết quả không phù hợp.

+4

+1 để giải thích cách chuẩn hóa văn bản. Tất cả thường bị bỏ qua "bước đầu tiên". tolower(), gsub(). Tôi làm một cái gì đó rất giống nhau bằng cách nhìn vào tóm tắt (as.factor (my_vector)) và nhìn thấy những gì không phù hợp. Đôi khi nó thực sự rất đơn giản và viết ra các dòng có thể được sạch hơn rất nhiều so với cố gắng để được ưa thích với regex. –

+2

@AndrewMedico có, có vẻ như gói không còn hoạt động trong CRAN nữa. Bạn có thể tải xuống các phiên bản trước đây từ lưu trữ. Tôi có phải trở thành người bảo trì gói không? –

+0

@RichardHerron cảm ơn bạn đã chỉ vào các gói, giờ đây là trên CRAN. Bạn có một clude phải làm gì nếu tôi chỉ có các cột số và chúng khác nhau bởi các biến ngẫu nhiên và tôi muốn tìm các kết quả phù hợp trong dữ liệu số? – Richard

9

Có thể google refine có thể hữu ích. Nó trông có vẻ được trang bị nhiều hơn nếu bạn có rất nhiều ngoại lệ và bạn chưa biết tất cả chúng.

+0

Cảm ơn bạn đã chỉ ra công cụ đó. Có vẻ rất hữu ích! –

+0

Tôi đã không sử dụng tinh chỉnh google nhưng tôi đã bị ấn tượng bởi các video. Dường như việc xử lý phù hợp mờ và tốt nhất, nó xuất hiện như thể người ta có thể lưu mã con để người ta có thể chạy nó nếu cần một lần nữa hoặc nếu người ta muốn chạy cùng một thuật toán trên dữ liệu tương tự. – Farrel

5

Những gì bạn đang làm được gọi là record linkage và đây là một lĩnh vực nghiên cứu rất lớn trong nhiều thập kỷ rồi. May mắn cho bạn, có một loạt các công cụ hiện có mà sẵn sàng thực hiện cho loại điều này. Về cơ bản, bạn có thể chỉ cho họ cơ sở dữ liệu của bạn, thiết lập một số làm sạch và so sánh (như Levenshtein hoặc Jaro-Winkler hoặc ...), và họ sẽ đi và làm công việc cho bạn.

Những công cụ này thường có các tính năng để giải quyết các vấn đề hiệu suất, vì vậy mặc dù Levenshtein chậm nhưng chúng có thể chạy nhanh vì hầu hết các cặp bản ghi không bao giờ được so sánh.

Liên kết Wikipedia ở trên có liên kết đến một số công cụ liên kết bản ghi mà bạn có thể sử dụng. Cá nhân tôi đã viết một tên gọi là Duke trong Java, mà tôi đã sử dụng thành công cho chính xác điều này. Nếu bạn muốn một cái gì đó lớn và đắt tiền, bạn có thể mua một công cụ Quản lý dữ liệu chính.

0

Trong trường hợp của bạn có lẽ là một cái gì đó giống như tính toán chỉnh sửa khoảng cách sẽ làm việc, nhưng nếu bạn cần phải tìm gần bản sao trong tài liệu văn bản dựa lớn hơn, bạn có thể thử http://www.softcorporation.com/products/neardup/