2010-05-20 24 views
5

Tôi đang làm việc trên một chương trình khảo sát nơi mọi người sẽ được xem xét quảng cáo lần đầu tiên họ điền vào bản khảo sát. Trong rất nhiều kịch bản, cách duy nhất chúng ta có thể ngăn chặn mọi người lừa dối hệ thống và nhận được một chương trình khuyến mãi mà họ không xứng đáng là kiểm tra các chuỗi địa chỉ đường phố với nhau.để kiểm tra địa chỉ cho phù hợp?

Tôi đã xem xét việc sử dụng khoảng cách levenshtein để cho tôi một số để đo lường sự tương đồng và xem xét những con số dưới một ngưỡng nhất định trùng lặp.

Tuy nhiên, nếu ai đó đang tìm cách chơi trò chơi hệ thống, họ có thể dễ dàng viết "S 5th St" thay vì "South Fifth Street" và levenshtein sẽ coi những chuỗi đó rất khác nhau. Vì vậy, sau đó tôi đã suy nghĩ để chuyển đổi tất cả các chuỗi thành một 'mẫu địa chỉ tiêu chuẩn' tức là 'Nam' trở thành 's', 'Thứ năm' trở thành '5', v.v.

Sau đó, tôi đã nghĩ điều này là vô vọng, và quá nhiều nỗ lực để làm cho nó hoạt động mạnh mẽ. Là nó?

Tôi đang làm việc với PHP/MySql, vì vậy tôi có những hạn chế vốn có trong hệ thống đó.

+1

Nếu thay vì "S. 5th St." ai đó vào "S. 4th St."? Điều này không thể được sử dụng để chơi game cho hệ thống (giả sử bạn đang gửi thư cho các công cụ quảng cáo), nhưng nó có thể loại bỏ những người sống chung một khối. Chỉ cần một trường hợp cạnh để kiểm tra. –

+0

@Bill kịch bản đó không phải là một vấn đề bởi vì sau đó họ sẽ không nhận được xem xét quảng cáo của họ. Trừ khi họ đang ở trong cahoots với những người cư trú trên địa chỉ nhà đó trên đường phố thứ 4, nhưng chỉ có rất nhiều hộ gia đình họ có thể âm mưu với. Đó là tự giới hạn, tôi nghĩ :) – user151841

+0

@ user15841: Không, ý tôi là sao nếu hai người đó đăng ký hợp pháp độc lập với nhau? Thuật toán của bạn cần phải đủ thông minh để thấy sự khác biệt giữa hai địa chỉ đó, nhưng cũng đủ thông minh để thấy các ví dụ ban đầu mà bạn đã cung cấp giống nhau. –

Trả lời

3

Tôi nghĩ ý tưởng thứ hai của bạn tốt hơn là sử dụng khoảng cách Levenshtein. Nếu bạn cố so sánh các địa chỉ cho số tương tự , thì hai người khác nhau sống gần nhau có thể vô tình "lừa" nhau trong số tiền thưởng của họ. Nếu tôi sống ở "S. 4th St." nhưng hàng xóm của tôi ở "S. 5th St." đã đăng ký, hai địa chỉ đó có vẻ quá giống với khoảng cách Lev.

Bạn có thể giảm (nhưng có thể không loại bỏ) nhiều gian lận tiềm năng bằng cách chạy các địa chỉ thông qua một trình bình thường hóa từ đồng nghĩa. Trước khi bạn kiểm tra xem có sự bình đẳng, chỉ cần chuyển đổi

Bắc -> N.
Đông -> E.
...
Đệ Nhất -> 1st
Thứ hai -> 2
Thứ ba -> 3
. ..
Đường phố -> St.
Đại lộ -> Ave.

Danh sách các từ đồng nghĩa mà bạn tìm ra càng dài thì càng tốt khi bắt các kết quả phù hợp. Nó sẽ chậm hơn một chút khi xử lý, nhưng các địa chỉ rất nhỏ.

Điều này tương tự như chuyển đổi chuỗi thành tất cả trường hợp thấp hơn (hoặc cao hơn) trước khi so sánh chúng. (Tôi cũng khuyên bạn nên tự nhiên).

+0

Ồ, cuối cùng tôi hiểu những gì bạn đang nói! Tôi đã không sử dụng levenshtein, vì vậy tôi đã không quen thuộc với nó để xem làm thế nào mà tình hình sẽ phát sinh :) – user151841

+0

Ngoài ra, nó phải được lưu ý rằng nhiều cư dân có thể sống trong cùng một tòa nhà ... Đó là nơi nó được khôn lanh , ngay cả sau khi tiêu chuẩn hóa. Ví dụ: "511 N 15th St, Unit 123" vs "511 NORTH 15th St, Apt 124" –

+1

Bạn nên cân nhắc sử dụng so sánh khoảng cách chuỗi trên các từ đồng nghĩa. Nếu không, "South" sẽ trở thành "S", nhưng "Soith" (typo) sẽ không, và "Soith" -> "S" không giống nhau. Ngoài ra, hãy lưu ý rằng có hàng nghìn ký tự unicode sẽ tạo ra các ký tự trông giống như ký tự z nhưng không. Hơn nữa, "Street" -> "St." có thể dẫn đến dương tính giả cho chữ viết tắt 'Saint' 'St.'. –

0

Bạn có thể sử dụng Google Map API (hoặc bất kỳ API ánh xạ nào khác) để chuẩn hóa địa chỉ dưới dạng vị trí địa lý (lat/long).

+1

Sẽ không hoạt động vì phần lớn các địa chỉ liên lạc không gian địa lý này không xem xét số căn hộ (ví dụ: phòng thứ 6 tầng 6). – code4life

+0

Có, việc chuẩn hóa như vậy sẽ không chính xác 100% và bạn cũng cần phải thực hiện kiểm tra bổ sung. –

0

Xem thesequestions để thảo luận liên quan.

  • chuẩn hóa dữ liệu đầu tiên càng nhiều càng tốt:

    đường -> ave đường -> thứ Rd.-> thứ

    đầu tiên -> 1 1 -> 1

Bạn có thể nhìn vào SOUNDEX hoặc một cái gì đó tương tự để bắt Trường hợp từ âm thanh giống nhau nhưng có cách viết khác nhau (ví dụ Schmitt, Schmitd, Smith) . SOUNDEX hoạt động ở cấp độ từ, vì vậy trước tiên bạn cần tách địa chỉ thành các từ và so sánh các giá trị SOUNDEX.


Bạn cũng có thể cấp địa chỉ cho một số dịch vụ vị trí địa lý như Google Maps, lưu trữ kinh độ và vĩ độ. Khi một địa chỉ mới được nhập vào, bạn chỉ nhận được kinh độ/vĩ độ của nó và so sánh với các vị trí hiện tại trong cơ sở dữ liệu của bạn. See this question để biết chi tiết.

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