Thật không may, làm điều này trong PHP là tốn kém Tuy nhiên, bạn hoàn toàn có thể áp dụng các thuật toán để tập hợp dữ liệu nhỏ (CPU cao và sử dụng bộ nhớ.).
Để mở rộng cụ thể về cách bạn có thể tạo ra một cuộc khủng hoảng server: cặp vợ chồng được xây dựng trong chức năng PHP sẽ xác định "khoảng cách" giữa chuỗi: Levenshtein và similar_text.
Dummy dữ liệu: (giả vờ họ đang 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, $ danh hiệu chỉ nên là một mảng các chuỗi. Bây giờ, hãy tạo ma trận và so sánh từng dòng tiêu đề với MỌI tiêu đề khác cho tương tự. 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.) Đó 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ể á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, về cơ bản bạn có 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 tế) nó trông giống như bảng dưới đây. Lưu ý cách có một tập hợp các giá trị 0 theo đường chéo - điều đó có nghĩa là trong vòng lặp khớp nhau, hai từ giống hệt nhau là - 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
Các $ thực tế phù hợp với mảng trông loại như thế này (cắt ngắn):
Array
(
[Apple] => Array
(
[Apple] => 0
[Apples] => 1
[Orange] => 5
[Banana] => 6
[Oranges] => 6
)
[Apples] => Array
(
...
Nhưng dù sao, đó là tùy thuộc vào bạn để (bằng cách thử nghiệm) xác định những khoảng cách số tốt cắt sức mạnh chủ yếu là trận đấu - và sau đó áp dụng nó. Nếu không, hãy đọc về tìm kiếm nhân sư và sử dụng nó - vì nó có các thư viện PHP.
Cam bạn vui vì bạn đã hỏi về điều này?
Bạn có chắc chắn rằng chúng không chỉ phù hợp với tiêu đề hoặc url? .. Tôi đã thành công lớn với công thức Levenshtein, nhưng tôi chắc chắn nó sẽ bắt đầu thất bại với các tập dữ liệu lớn. – Fosco
Tôi đang thử nó ngay bây giờ, nhưng tôi nghĩ rằng nó sẽ làm tan chảy một tài khoản lưu trữ giá rẻ với bất kỳ loại lực kéo nào – chris