2010-07-08 37 views
6

nếu có ai đó đã từng gửi câu chuyện lên digg, nó sẽ kiểm tra xem câu chuyện đã được gửi chưa, tôi giả định bằng tìm kiếm mờ.Kết hợp tìm kiếm php (mờ)

Tôi muốn thực hiện điều gì đó tương tự và muốn biết liệu họ có đang sử dụng lớp php là nguồn mở không?

Soundex isnt làm việc đó, câu/dây có thể lên đến 250chars dài

+1

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

+0

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

Trả lời

0

Bạn có thể (tùy thuộc vào kích thước của bộ dữ liệu của bạn) sử dụng tìm kiếm toàn văn mySQL, và tìm kiếm mục (s) có mức cao ghi điểm và nằm trong một khoảng thời gian nhất định và đề xuất điều này cho người dùng.

Thông tin thêm về điểm ở đây: MySQL Fulltext Search Score Explained

+0

Toán học không phải là điểm mạnh của tôi – chris

+0

Thật không may, lập trình rất liên quan đến toán học. – Pete

5

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: Levenshteinsimilar_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?

2

Tôi khuyên bạn nên lấy URL của người dùng đã gửi và lưu trữ chúng trong nhiều phần; tên miền, đường dẫn và chuỗi truy vấn. Sử dụng hàm PHP parse_url() để lấy được các phần của URL đã gửi.

Lập chỉ mục ít nhất tên miền và đường dẫn. Sau đó, khi người dùng mới gửi URL, bạn tìm kiếm cơ sở dữ liệu của mình để có bản ghi khớp với tên miền và đường dẫn. Vì các cột được lập chỉ mục, bạn sẽ lọc ra tất cả các bản ghi đầu tiên không có trong cùng một tên miền, và sau đó tìm kiếm thông qua các bản ghi còn lại. Tùy thuộc vào tập dữ liệu của bạn, điều này sẽ nhanh hơn mà chỉ cần lập chỉ mục toàn bộ URL. Đảm bảo mệnh đề WHERE của bạn được thiết lập theo đúng thứ tự.

Nếu điều đó không đáp ứng nhu cầu của bạn, tôi khuyên bạn nên thử Sphinx. Sphinx là một công cụ tìm kiếm toàn văn bản nguồn mở SQL nhanh hơn rất nhiều so với việc tìm kiếm toàn văn bản của MySQL. Nó hỗ trợ xuất phát và một số tính năng đẹp khác.

http://sphinxsearch.com/

Bạn cũng có thể lấy tiêu đề hoặc nội dung văn bản của trình người dùng, chạy nó thông qua một chức năng để tạo các từ khóa và tìm kiếm cơ sở dữ liệu cho bản ghi hiện có với mọi người hoặc các từ khóa tương tự.

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