Thật không may, thực hiện điều này trong PHP rất tốn kém (sử dụng CPU và bộ nhớ cao.) Tuy nhiên, bạn chắc chắn có thể áp dụng thuật toán cho các tập dữ liệu nhỏ.
Để mở rộng cụ thể về cách bạn có thể tạo sự cố máy chủ:một số hàm PHP tích hợp sẵn sẽ xác định "khoảng cách" giữa các chuỗi: levenshtein và same_text .
Dữ liệu giả:(giả sử chúng là tiêu đề tin tức)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles );
Tại thời điểm này, $ title chỉ nên là một mảng các chuỗi. Bây giờ, hãy tạo một ma trận và so sánh từng dòng tiêu đề với MỌI dòng tiêu đề khác để có sự giống nhau. Nói cách khác, đối với 5 dòng tiêu đề, bạn sẽ nhận được ma trận 5 x 5 (25 mục nhập.) Đó là nơi CPU và bộ nhớ chìm đi vào.
Đó là lý do tại sao phương pháp này (thông qua PHP) không thể được áp dụng cho hàng nghìn mục nhập. Nhưng nếu bạn muốn:
$matches = array(); foreach( $titles as $title ) { $matches[$title] = array(); foreach( $titles as $compare_to ) { $matches[$title][$compare_to] = levenshtein( $compare_to, $title ); } asort( $matches[$title], SORT_NUMERIC ); }
Tại thời điểm này, những gì bạn có về cơ bản là một ma trận với "khoảng cách văn bản". Trong khái niệm (không phải trong dữ liệu thực), nó giống như bảng dưới đây. Lưu ý cách có một tập hợp các giá trị 0 đi theo đường chéo - điều đó có nghĩa là trong vòng lặp đối sánh, hai từ giống hệt nhau - tốt, giống hệt nhau.
Apple Apples Orange Oranges Banana Apple 0 1 5 6 6 Apples 1 0 6 5 6 Orange 5 6 0 1 5 Oranges 6 5 1 0 5 Banana 6 6 5 5 0
Mảng $ so khớp thực tế trông giống như thế này (bị cắt bớt):
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
Nhưng dù sao, việc (bằng thử nghiệm) tùy thuộc vào bạn để xác định mức giới hạn khoảng cách số tốt hầu như có thể phù hợp - và sau đó áp dụng nó. Nếu không, hãy đọc trên sphinx-search và sử dụng nó - vì nó có các thư viện PHP.
Orange, bạn có vui vì bạn đã hỏi về điều này?