2009-04-27 20 views
11

Tôi đang tìm cách triển khai một trình chỉ mục chuyển tiếp đơn giản trong PHP. Có, tôi hiểu rằng PHP không phải là công cụ tốt nhất cho công việc, nhưng tôi vẫn muốn làm điều đó. Lý do đằng sau nó là đơn giản: tôi muốn một, và trong PHP.Làm thế nào người ta có thể đi về việc thực hiện một chỉ số chuyển tiếp trong PHP?

Chúng ta hãy thực hiện một vài giả định cơ bản:

  1. Toàn bộ interweb gồm chừng năm ngàn HTML và/hoặc tài liệu văn bản đơn giản. Mỗi tài liệu nằm trong một miền cụ thể (UID). Không có định dạng độc quyền/đa dạng khác tồn tại trong Interweb cavemanesque tưởng tượng của chúng ta.

  2. Kết quả của thuật toán dựa trên PHP mong indexing tuyệt vời của chúng tôi nên được dọc theo dòng:

    UID1 -> index.html -> helen, cô, là, vô địch, với, tàn nhang

    UID1 -> foo.html -> gà, nông dân, đi, về nhà, ăn, cừu

    UID2 -> blah.html -> tiếp theo, tuần, trên, badgerwatch

    UID2 -> gah.txt -> một, một, và, một, là, không, numberwang

Lý tưởng nhất, tôi rất thích xem các giải pháp đưa vào tài khoản, ngay cả ở tiểu học nhất của họ, khái niệm về mã thông báo/ranh giới từ định hướng/gắn thẻ một phần của lời nói. Tất nhiên, tôi nhận thấy đây là mơ tưởng, và do đó sẽ hạ bất kỳ nỗ lực xứng đáng tại phân tích cho biết các văn bản tưởng tượng theo:

  1. Trích xuất nội dung thứ văn bản thực trong tài liệu như một danh sách các từ theo thứ tự trong số mà chúng được trình bày.
  2. Đồng thời, bỏ qua mọi rác chẳng hạn như <script><html> thẻ để tính toán danh sách UID (có thể là, ví dụ), theo sau là tên tài liệu (tài nguyên trong tên miền) và cuối cùng là danh sách các từ cho tài liệu đó. Tôi nhận ra rằng các thẻ HTML đóng một vai trò quan trọng trong vị trí ngữ nghĩa của văn bản trong một tài liệu, nhưng ở giai đoạn này tôi không quan tâm.
  3. Ghi nhớ một giải pháp có thể xây dựng danh sách của từ WHILE khi đọc tài liệu thì lạnh hơn là cần phải đọc trong toàn bộ tài liệu trước.

Ở giai đoạn này, tôi không quan tâm đến vị trí hoặc lưu trữ của lưu trữ. Ngay cả một tập hợp thô sơ của các câu lệnh 'in' sẽ là đủ.

Xin cảm ơn trước, hy vọng điều này là đủ rõ ràng.

+1

+1 cho văn bản mẫu tuyệt vời – Artelius

+0

Đây có phải là bài tập về nhà của bạn không? Có vẻ như bạn chỉ muốn một trình phân tích cú pháp tệp đơn giản .. – Louis

+4

@Làm bài tập về nhà? Hãy truy cập – karim79

Trả lời

7

Hãy xem

http://simplehtmldom.sourceforge.net/

Bạn làm somthing như

$p = new Simple_dom_parser(); 
$p->load("www.page.com"); 
$p->find("body")->plaintext; 

Và đó sẽ cung cấp cho bạn tất cả các văn bản. Muốn để lặp qua chỉ là liên kết

foreach ($p->find("a") as $link) 
{ 
    echo $link->innerText; 
} 

Nó rất hữu ích và mạnh mẽ. Kiểm tra.

+0

câu hỏi nhanh: chúng tôi có xóa mục nhập trong chỉ mục tiến sau khi chúng tôi đã tiêu thụ và biến nó thành chỉ mục đảo ngược không? – Roylee

5

Tôi không nghĩ rằng tôi là hoàn toàn rõ ràng về những gì bạn đang cố gắng để làm, nhưng bạn có thể có được một kết quả đơn giản khá dễ dàng:

  1. Chạy trang thông qua Tidy (a good introduction) để đảm bảo nó sẽ có HTML hợp lệ.
  2. Vứt bỏ mọi thứ trước (và bao gồm) <body>.
  3. Vượt qua từng tài liệu một lần.
    1. Nếu nhân vật là một '<', không làm bất cứ điều gì với các ký tự sau cho đến khi bạn nhìn thấy một '>' (bỏ qua HTML)
    2. Nếu nhân vật là một "nhân vật từ" (chữ và số, dấu gạch ngang , có thể nhiều hơn) thêm nó vào "từ hiện tại".
    3. Nếu ký tự là "ký tự không phải từ" (dấu chấm câu, dấu cách, có thể nhiều hơn), thêm "từ hiện tại" vào danh sách từ trong chỉ mục tiến lên và xóa "từ hiện tại".
  4. Thực hiện các bước trên cho đến khi bạn nhấn </body>.

Thực sự là về nó, bạn có thể phải thêm một số ngoại lệ để xử lý những thứ như <script> thẻ (bạn không muốn xem javascript là từ nên được lập chỉ mục), nhưng điều đó sẽ cung cấp cho bạn chỉ số tiến lên.

+0

Cảm ơn Chad, điều đó thực sự hữu ích :) – karim79

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