Làm thế nào để làm địa chỉ bưu chính phù hợp mờ?


14

Tôi muốn biết làm thế nào để khớp các địa chỉ bưu chính khi định dạng của chúng khác nhau hoặc khi một trong số chúng bị sai chính tả.

Cho đến nay tôi đã tìm thấy các giải pháp khác nhau nhưng tôi nghĩ rằng chúng khá cũ và không hiệu quả lắm. Tôi chắc chắn có một số phương pháp tốt hơn tồn tại, vì vậy nếu bạn có tài liệu tham khảo để tôi đọc, tôi chắc chắn đó là một chủ đề có thể khiến nhiều người quan tâm.

Giải pháp tôi tìm thấy (ví dụ là trong R):

  • Khoảng cách Levenshtein, bằng với số lượng ký tự bạn phải chèn, xóa hoặc thay đổi để chuyển đổi một từ thành một từ khác.

    agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE) ## [1] "accusait" "abusait"

  • Việc so sánh các âm vị

    library(RecordLinkage) soundex(x<-c('accusait','acusait','abusait')) ## [1] "A223" "A223" "A123"

  • Tôi đoán việc sử dụng một bộ sửa lỗi chính tả (cuối cùng là một người Bayes như Peter Norvig) , nhưng tôi đoán không hiệu quả lắm về địa chỉ.

  • Tôi đã nghĩ về việc sử dụng các đề xuất của Google, nhưng tương tự, nó không hiệu quả trên các địa chỉ bưu chính cá nhân.

  • Bạn có thể tưởng tượng bằng cách sử dụng phương pháp giám sát học máy nhưng bạn cần lưu trữ các yêu cầu sai chính tả của người dùng để làm điều đó không phải là một lựa chọn cho tôi.


Tôi khuyên bạn nên sử dụng một cơ sở dữ liệu thực sự hỗ trợ khớp chuỗi mờ: posgres . Nó sẽ hiệu quả.
Emre

Chỉ Mỹ, Canada, Anh, Pháp, Nhật Bản, đa quốc gia ...? Có lẽ đối với mỗi người, trước tiên bạn xác định / đoán ngôn ngữ và quốc gia đó là gì, sau đó áp dụng phân loại theo quốc gia cụ thể? Bạn có tập huấn luyện không và nếu có thì phân phối các quốc gia là gì?
smci

Nơi mà bạn đã kết thúc với điều này? Giải pháp chúng tôi đã nghĩ ra là chà và làm phong phú địa chỉ và tên địa điểm và nhấn mã địa lý google và đặt API web và sau đó thực hiện một số tính toán sơ bộ để xác định kết quả chính xác so với dữ liệu thô. Nó hơi cồng kềnh nhưng hoạt động nhưng phải có một cách thanh lịch hơn để bình thường hóa địa chỉ và địa điểm / địa điểm.
Chris Smith

Câu trả lời:


9

Khi bạn đang sử dụng R, bạn có thể muốn xem xét gói chuỗi và số liệu khoảng cách Jaro-Winkler có thể được sử dụng trong các tính toán. Điều này đã được phát triển tại Cục điều tra dân số Hoa Kỳ để liên kết.

Xem để biết thêm thông tin về khoảng cách Jaro và Jaro-Winkler trong tạp chí này .

Để so sánh các kỹ thuật kết hợp khác nhau, hãy đọc bài viết này


4

Có rất nhiều cách thông minh để mở rộng khoảng cách Levenshtein để mang lại một bức tranh đầy đủ hơn. Một đoạn giới thiệu ngắn gọn về một mô-đun khá hữu ích (dành cho trăn) có tên là ' Fuzzy Wuzzy ' có ở đây bởi nhóm tại SeatGeek.

Một vài điều bạn có thể làm là tương tự chuỗi một phần (nếu bạn có các chuỗi có độ dài khác nhau, giả sử m & n với m <n), thì bạn chỉ khớp với m ký tự. Bạn cũng có thể tách chuỗi thành các mã thông báo (các từ riêng lẻ) và xem cách các bộ mã thông báo khớp với nhau hoặc sắp xếp chúng theo thứ tự bảng chữ cái và sắp xếp chúng.


4

Một kỹ thuật phổ biến khác để phát hiện khớp chuỗi một phần (mặc dù thường ở cấp độ tài liệu) là shingling . Về bản chất, đó là một cách tiếp cận cửa sổ chuyển ra một bộ n-gram cho từ / doc đích và so sánh chúng với các bộ n-gram cho các từ / tài liệu khác thông qua hệ số Jaccard . Manning và các đồng nghiệp (2008) thảo luận về các bản sao gần và shing trong bối cảnh thu hồi thông tin.


3

Tôi đã viết một công cụ đối sánh mờ theo chế độ chung chung trong Python, công việc này sẽ thực hiện công việc hợp lý để khớp bất kỳ loại dữ liệu nào:

https://github.com/robinl/fuzzymatcher

Nó nằm trong bộ nhớ, vì vậy bạn có thể không muốn sử dụng nó để khớp với các bộ dữ liệu cao hơn khoảng 100 nghìn hàng.

Tôi cũng đã viết một dự án tương tự cụ thể cho các địa chỉ của Vương quốc Anh, nhưng điều này giả định rằng bạn có quyền truy cập vào địa chỉ Premiumbase. Cái này không có trong bộ nhớ, vì vậy đã được sử dụng để chống lại các địa chỉ Vương quốc Anh khoảng 100m. Xem tại đây:

https://github.com/RobinL/AddressMatcher

Nếu bạn muốn thực hiện việc này nhanh chóng, tôi sẽ giới thiệu lại bằng cách sử dụng libpostal để bình thường hóa địa chỉ của bạn và sau đó đưa chúng vào fuzzymatcher chung của tôi ( pip install fuzzymatcher).

Bạn có thể tìm thấy các ví dụ sử dụng ở đây .


Xin chào Robin, tôi quan tâm đến thư viện addressMatcher của bạn. Bạn có bất kỳ tài liệu về cách sử dụng nó? Tôi có vấn đề chính xác này - cần khớp 1 bộ địa chỉ (lộn xộn) với một địa chỉ khác (địa chỉ bưu chính chính thức). Cảm ơn
SCool

1
thật đáng buồn với trình so khớp địa chỉ, nó hoàn toàn không tầm thường và tôi không có tài liệu tốt. điều chính bạn cần là tải địa chỉ cao cấp, một sản phẩm thương mại, vào postgresql.
RobinL

Ok, cảm ơn vì đã trở lại với tôi. Tôi đang làm việc với tôi cho rằng phiên bản cao cấp của địa chỉ Ailen có tên là Eircode sẽ không tương thích. Bạn có nghĩ rằng trình so khớp mờ sẽ phụ thuộc vào nhiệm vụ trong việc khớp địa chỉ môi trường sản xuất không? Tôi chỉ muốn nối thêm mã bưu điện vào các địa chỉ trong dữ liệu của mình mà không có chúng, ví dụ: tìm kiếm cơ sở dữ liệu Eircode '1 Main Street, Some Town, County'và nếu tôi tìm thấy kết quả khớp - mang lại mã bưu điện.
SCool

1
diêm mờ - vâng tôi chắc chắn nghĩ rằng đáng để đi. nó nên hoạt động hợp lý tốt cho một danh sách nhỏ các địa chỉ cần tìm trong một danh sách lớn các địa chỉ có thẩm quyền (ví dụ như eircode) trên một máy mạnh mẽ. Một tùy chọn khác là nhịp nhanh liên kết trong R
RobinL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.