Đề tài Nghiên cứu máy tìm kiếm và xây dựng thử nghiệm mô phỏng máy tìm kiếm

Cùng với chức năng lưu công việc dở dang. Thì chức năng thực hiện lại công việc cũ cũng được phát triển. Khi được yêu cầu chương trình sẽ nạp tất cả các liên kết có trạng thái WAITING vào hàng đợi. Mỗi liên kết giờ đây đóng vai trò như là một trang web gốc. Và chương trình tạo ra các tiến trình dành thực thi công việc này.

doc87 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2387 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đề tài Nghiên cứu máy tìm kiếm và xây dựng thử nghiệm mô phỏng máy tìm kiếm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ng ngôn ngữ Java Giới thiệu lớp java.lang.Thread Trong ngôn ngữ lập trình Java định nghĩa lớp java.lang.Thread dùng để tạo và điều khiển Thread. Khi một Thread được tạo ra nghĩa là một đối tượng của lớp java.lang.Thread được khởi tạo. Và khi hàm Thread.start() được gọi thì lúc đó Thread mới thực sự hoạt động, nó sẽ thực thi hàm run(). Có hai cách khởi tạo Thread: Thứ nhất là tạo lớp kế thừa từ lớp Thread, và lớp này sẽ thực thi hàm run() của riêng nó. Thứ hai là thực thi Runable Interface. Trong Java không có đa kế thừa, nên khi một lớp đã kế thừa từ một lớp khác thì nó không thể kế thừa lớp Thread được nên lúc này thì cần phải tạo theo cách này. Hình 8 Vòng đời của một Thread Các hàm khởi tạo: Thread() Thread(Runnable) Thread(ThreadGroup) Thread(String) Thread(ThreadGroup,String) Thread(Runnable,String) Thread(ThreadGroup,Runnable,String) Tham số kiểu String là tên của Thread. Tham số kiểu Runable là đối tượng thực thi lớp Runable. Tham số GroupThread là nhóm Thread dùng để dễ quản lý Thread. Các phương thức của Thread: start() phương thức này bắt đầu chạy Thread, thực thi hàm run() của lớp Runable đích. Hàm này chỉ được gọi một lần suspend() phương thức này treo một phương thức đang chạy, nó sẽ bị treo cho đến khi hàm resume() được gọi resume() lớp này sẽ thực thi Thread bị treo stop() lớp này dừng và chấm dứt một Thread, nhưng muốn chấm dứt một thread bị treo thì ta phải resume Thread vì stop() chỉ có tác dụng trên các Thread đang chạy sleep() Thread sẽ tạm dừng trong khoảng thời gian, thời gian được đưa vào trong tham số của Thread Đồng bộ hóa các Thread Cách ngăn chặn dữ liệu không bị hỏng bởi nhiều Thread tác động vào nó cùng lúc ta dùng kỹ thuật “critical region” tạm gọi là vùng “gay cấn”. Tức là khi đã có một Thread đi vào vùng này rồi thì các Thread khác sẽ không được vào vùng này nữa. Chỉ khi Thread ra khỏi cùng này thì Thread khác mới được vào. Trong ngôn ngữ Java dùng từ khóa synchronized để định nghĩa vùng critical region. Phân tích HTML Hầu hết các nguồn thông tin lưu trên Internet đều ở dạng html. Ta cần phải hiểu rõ cấu trúc của một trang html để xây dựng một chương trình crawler. Bốn thành phần cơ bản của Html Text Comment Simple Tag Beginning Tag và Ending Tag Text Text là văn bản là những từ mà chúng hiển thị trên một trình duyệt web. Ngoại trừ những đoạn code còn phần văn bản nào không là tag thì được xem là văn bản. Phần văn bản thì được điểu khiển bởi các tag bao nó. Ví dụ như ta có hai tag và phần văn bản như: Hello World Như đã đề cập trước đó, có một trường hợp dữ liệu nằm bên ngoài một tag nhưng không được xem là văn bản đó là script code. Hầu hết các đoạn mã hay gặp trong trang html là JavaScript. JavaScript là một chương trình nhỏ nằm bên trong các trang html giữa các tag Đoạn mã JavaScript Crawler cần phải phân biệt giữa text và mã JavaScipt . Ví dụ ta có đoạn mã sau: var wpop_; function myfunct(para) { if(wpop_&&!wpop_.closed) { wpop_.location.href=para; } wpop_.focus(); } Trình duyệt web chỉ thực thi đoạn mã trên và dĩ nhiên chúng không được hiển thị trên trang web. Comments Comments (phần chú thích) cũng là một thành phần của trang html nhưng không được hiển thị cho người dùng. Phần chú thích thường nằm bên trái ở dưới bên trong hai tag sau tag chẳng hạn như: Comment cũng còn được dùng để giấu các đoạn mã JavaScript đối với các trình duyệt không hỗ trợ JavaScript. Ví dụ: <!-- var wpop_; function myfunct(para) { if(wpop_&&!wpop_.closed) { wpop_.location.href=para; } wpop_.focus(); } //--> Bởi vì mục đích của crawler là tìm ra phần text nên phải cần phân biệt giữa text và phần chú thích để crawler sẽ bỏ qua phần chú thích khi gặp. Simple Tag Simple Tag là phần tag trong html mà chỉ có một tag duy nhất. Chẳng hạn như những Simple Tag phổ biến như break và image những tag này không có tag kết thúc và . Ví dụ: First line of text Second line of text Third line of text Beginning Tag và Ending Tag Hầu hết các html Tag đều bao hàm Beginning Tag và Ending Tag. Sự khác nhau giữa Simple Tag và Beginning Tag là Beginning Tag sẽ có Ending Tag để kết thúc. Ending Tag giống như Beginning Tag nhưng có thêm dấu gạch / ở phía trước. Ví dụ: Ở trên là Beginning Tag còn là Ending Tag Thành phần mà crawler phân tích Navigating with HyperLinks Siêu liên kết HyperLinks hay Links được định nghĩa để kết nối các tài liệu trên Internet với nhau. Crawler sẽ đi theo các links này để tìm kiếm thông tin. Nhờ các links này mà Crawler có thể hoạt động liên tục đi từ tài liệu này đến tài liệu khác vậy nên crawler cần phải nhận ra chúng. Click Here Trong đoạn mã trên thì chỉ có phần text Click Here được hiển thị lên cho người truy cập. Thuộc tính alt dùng để khi người dùng lướt chuột vào phần text Click Here sẽ xuất hiện một “popup” nhỏ như là một phần chú thích mang dòng chữ Go Here. Đây là thuộc tính không cần thiết lúc nào cũng phải có nhưng nếu có thì nó sẽ giúp cho crawler dễ dàng nhận ra các liên kết. Thuộc tính href sẽ chứa các liên kết. Crawler cần phải truy xuất được nội dung của các liên kết này và phân tích để có thể đến được một trang web khác. Sở dĩ phải phân tích bởi vì không phải lúc nào cũng nhận được liên kết là có thể tới trang web đích ngay mà crawler cần phải phân tích giữa liên kết tuyệt đối và liên tương đối. Địa chỉ tương đối và địa chỉ tuyệt đối đã được trình bày ở phần HyperText Protocol. Image Maps Đôi khi hình ảnh cũng được dùng để cho công việc liên kết các trang web với nhau. Khi người dùng click chuột vào một hình ảnh sẽ dẫn tới một trang web khác. Ví dụ: Parsing Form Nhiều trang web chứa một thành phần gọi là form mở đầu bằng và kết thúc . Phía trong form thì có các thành phần khác thường là các tag . Với form người dùng sẽ điền thông tin vào và gửi lên server, server sẽ xử lý các yêu cầu này và trả về thông tin. Nội dung trả về có thể đưa đến một trang web khác. User ID Password Crawler cũng cần phải nhận ra các liên kết dạng như trên. Table Bảng là thành phần quan trọng trong các trang Html. Nhờ bảng dữ liệu sẽ được hiển thị đẹp hơn và đây là phần mà chứa phần văn bản nhiều trong một trang html. Trong bảng có các tag : định nghĩa một bảng. định nghĩa một tiêu đề trong bảng. định nghĩa các dòng định nghĩa các ô trong một dòng Ví dụ : Header 1Header 2Header 3 col1,row1col2,row1col3,row1 col1,row2col2,row2col3,row2 col1,row3col2,row3col3,row3 Với đoạn mã trên ta sẽ có bảng như sau : Hình 9 Bảng trong Html Trong quá trình phân tích đánh chỉ mục cho các trang html thì cần phải chú ý đến các bảng. Vì nội dung bằng văn bản thường được nằm nhều trong phần này. Vấn đề cần xử lý Xử lý với JavaScript Thử thách mà các crawler gặp khi đối mặt với mã JavaScript thể hiện ở hai khía cạnh. Thứ nhất crawler không được nhầm lẫn mã JavaScript với các nội dung text thực sự. Thứ hai thỉnh thoảng mã JavaScript cũng dùng để chuyển hướng đến một địa chỉ khác. Crawler cần phải nhận biết được hai khó khăn này. Bởi vì mã JavaScript thường nằm giữa các HTML chú thích, như đã được thảo luận trước, các chương trình spider đơn giản thường sẽ lọc bỏ mã JavaScript và không đối phó với nó, quá trình xử lý này là tương đối dễ dàng. Để thực hiện điều này, chương trình spider cần phải được biết rõ về cấu trúc các HTML chú thích để nhận ra mã Javascript, và nó phải biết không cần xử lý dữ liệu bên trong các chú thích này. Bởi vì JavaScript luôn luôn được chứa giữa các thẻ , spider cần nạp tri thức để nhận biết các thẻ này và bỏ qua chúng nếu gặp phải. Đối phó với mã JavaScript mà được sử dụng để chuyển hướng tới một trang khác là đặc biệt phiền hà cho crawler. Lúc này JavaScript được dùng để tạo ra một liên kết sẽ chuyển đến một trang kế tiếp. Ví dụ: Trợ giúp Spider sẽ thấy những dòng này và cố gắng phân tích thuộc tính href để lấy giá trị csssủa thuộc tính. Tuy nhiên, giá trị bên trong thuộc tính href là một hàm JavaScript thay vì thật sự là một URL. Hàm JavaScript được gọi là sẽ đưa người dùng đến một cửa sổ mới, nhưng không có cách nào để spider có thể thực hiện lần theo liên kết này. Để thực hiện khả năng theo các liên kết dạng này, các spider phải có khả năng thông dịch mã JavaScript. Có hai cách để giải quyết vấn đề. Đầu tiên là dành cho người lập trình, người lập trình sẽ giải quyết đích mà các liên kết chỉ đến. Sau đó, người lập trình sẽ thêm các trang đích này như là một phần của mã chương trình. Thật không may, cách thức giải quyết vấn đề là không mềm dẻo bởi vì nếu liên kết có bị thay đổi trên trang web, spider sẽ vẫn sử dụng các liên kết cũ, và do đó, nó sẽ không thể tìm thấy những điểm đến mới. Nhưng trong trường hợp gặp các liên kết JavaScript, ta thường không có nhiều sự lựa chọn. Đây là một ví dụ về cách làm việc này. Ví dụ nếu ta biết rằng khi ta nhấp chuột vào một liên kết, ta sẽ được gửi đến một tập tin có tên target.jsp, sau đó ta có thể xây dựng thực tế này vào chương trình. Mỗi lần theo các liên kết JavaScript , chương trình của ta chỉ cần chèn liên kết target.jsp chứ không phải cố gắng để giải quyết mã JavaScript. Dưới đây là hàm mà sẽ tìm kiếm bất kì liên kết nào bắt đầu bằng "javacript:", cho thấy cách thức này được thực hiện như thế nào: String resolveLink (String url) ( / / Kiểm tra xem nếu các liên kết là một Javascript   nếu (url.beginsWith ( "javascript:"))   return "target.jsp";   khác   return url; ) Một cách khác để giải quyết vấn đề phức tạp hơn. Về cơ bản, giải quyết bằng cách sử dụng Rhino, một mã nguồn mở thực thi các mã JavaScript mà được viết hoàn toàn bằng Java, spider được mở rộng (extends) từ nó thì có thể nhận ra mã JavaScript. Rhino thường nhúng vào các ứng dụng Java để cung cấp các cho người sử dụng cuối. Xử lý Frame Có thể nói Frame là một kẻ đối địch của crawler bởi các frame che dấu hoàn toàn các thông tin chứa trong nó. Một trang html có sử dụng Frame như sau : Untitled <frame name="logo" src="logo.htm" FRAMEBORDER="0" marginheight="0" marginwidth="0"> <frame name="sidenav" src="nav.htm" FRAMEBORDER="0" marginheight="0" marginwidth="0"> Đoạn mã HTML trên có thể hiển thị là một trang web phong phú về nội dung. Nhưng không có bất kì nội dung nào mà spider có thể tìm thấy bởi nó được giấu bên trong các khung. Về cơ bản Frame trình diễn kết hợp nhiều hiển thị của các đoạn mã HTML. Điều đó có nghĩa là trang web có dùng Frame có thể hiển thị nhiều trang đồng thời. Điều này thường gặp khi ta muốn tạo các header, footer, hay navigation thống nhất cho một trang web. Đối với người dùng thì nó xuất hiện như một tài liệu độc lập. Tuy nhiên những trang web sử dụng Frame nhìn cũng khó phân biệt với các trang web không dùng Frame. Ví dụ trên thì Frameset sẽ tạo ra cách hiển thị kết hợp giữa ba tập tin htm sau: logo.htm, nav.htm và profile.htm. Cách sử dụng ba file như trên gây khó khăn cho spider bởi nó ngăn chặn không cho spider thu thập thông tin trên một trang mà nó phải đi tìm ba file này để tìm ra nội dung đầy đủ của trang này. Nội dung của trang web này sẽ bị phân tán, trang này sẽ không được spider đánh chỉ mục. Thay vì đánh chỉ mục cho trang này thì spider lại là đánh chỉ mục cho ba file trên. Không nên dùng frame trong những trang quan trọng chẳng hạn như home page nếu ta muốn spider đánh chỉ mục cho trang web một cách đúng đắn. Xử lý Embedded Object Embedded Object là các đối tượng được nhúng trực tiếp vào trang html. Hai dạng cơ bản trong các đối tượng này là Shockware file và Java applet. Macromedia Flash được dùng để tạo ra các trình diễn đa phương tiện dưới hình thức của Shockware file. Một đối tượng Shockware nhìn chung như sau : Java Applet là các lớp được viết bằng ngôn ngữ Java kế thừa từ lớp Applet cho phép hiển thị các thông tin đồ họa trực tiếp trên web. Applet nhìn chung có dạng như sau: <applet code=”TheApplet.class” codebase=”.” width=”250” height=”237” > Cả Java Applet và Shockware file chẳng có giá trị gì với crawler bởi vì crawler không thể trích lọc dữ liệu từ các đối tượng đó. Nói chung là không có cách nào hiệu quả để crawler có thể lấy các thông tin từ Java Applet và Shockware file. Một phương pháp đơn giản là hãy bỏ qua các đối tượng này khi crawler gặp chúng. Chương 3 PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG PHÂN TÍCH HỆ THỐNG Trong khi thiết kế hệ thống thì hệ thống cần phải được chia thành nhiều hệ thống nhỏ hơn để dễ dàng trong việc quản lý, duy trì cũng như khả năng mở rộng. Các hệ thống nhỏ được thiết kế sao cho có khả năng hoạt động độc lập, có thể hoàn thành công việc của mình mà không phụ thuộc nhiều vào các hệ thống khác. Không phụ thuộc ở đây chỉ theo nghĩa tương đối, có nghĩa là nếu được cung cấp dữ liệu đầu vào thì có thể vận hành cho ra dữ liệu đầu ra cần thiết. Hệ thống được có sơ đồ phân tích như sau: Hình 10 Sơ đồ thành phần tổng quan của hệ thống Hệ thống được chia thành các gói sau: Gói crawler Nhiệm vụ truy xuất tất cả các siêu liên kết từ một site gốc, tải các trang web về máy, phân tích cấu trúc html để xuất ra các liên kết, chuẩn bị dữ liệu phục vụ cho công việc đọc nội dung của tài liệu, tạo ra đối tượng Lucene Document của gói reader Gói reader nhận thông tin từ crawler tức là các file đã được tải về lưu trong đĩa cứng, tạo đối tượng reader phù hợp để truy xuất thành các văn bản thuần túy (plaintext). Sử dụng plaintext để mô tả đối tượng Lucene Document. Lucene Document tức là đối tượng dùng để đánh chỉ mục. Gói indexer nhận các Lucene Document từ gói reader, tiến hành lập chỉ mục lưu thành cấu trúc chỉ mục đảo (inverted index). Các cấu trúc chỉ mục đảo là các file lưu trên đĩa cứng hệ thống và cũng chính là dữ liệu dành cho công việc tìm kiếm. Gói searcher nhận truy vấn từ ứng dụng web, tiến hành phân tích truy vấn và truy lục trong thư mục chỉ mục đảo để trả về các kết quả phù hợp cho người dùng Ứng dụng web tạo giao diện giao tiếp giữa người dùng và hệ thống, nhận truy vấn và trình diễn kết quả. Gói crawler Đây là thành phần hoạt động đầu tiên của hệ thống. Gói crawler sẽ nhận một hay nhiều các liên kết (thường là các liên kết gốc-homepage của một website) từ người quản trị hệ thống. Crawler Manager sẽ khởi tạo các tiến trình bằng số liên kết mà nó nhận vào. Tuy nhiên ta không thể tạo quá nhiều tiến trình làm việc vì còn phải phụ thuộc vào tài nguyên như tốc độ xử lý của CPU, dung lượng bộ nhớ v.v…Vì vậy ta mặc định số tiến trình lớn nhất là mười. Nếu số liên kết nhận vào lớn hơn mười thì các liên kết đó sẽ nằm trong hàng đợi, đợi một tiến trình nào làm xong công việc thì mới tiếp tục xử lý liên kết đó. Trong hệ thống mỗi tiến trình sẽ phụ trách truy cập một website, như vậy sẽ dễ quản lý hơn cho nhiều tiến trình truy cập cùng một website. Các thread là các crawler sẽ có nhiệm vụ tải về các tài liệu cần thiết phục vụ cho công việc đánh chỉ mục. Ở đây các tài liệu mà crawler cần tìm là các tài liệu cơ bản dạng html, htm, pdf, doc, txt, rtf . Đầu vào của Crawler Manager là: Danh sách các trang web Số lượng các tiến trình Đầu ra của Crawler Manager là : Các tài liệu được lưu trong ổ cứng Các tài liệu được lưu trong ổ cứng như sau : hệ thống sẽ tạo một thư mục gốc, khi các trang web được tải về thì tùy theo tên host của nó mà hệ thống sẽ tạo một thư mục cùng tên với tên host đó nằm trong thư mục dữ liệu gốc chính. Các tài liệu sẽ được lưu trữ trong thư mục có tên là tên host của mình. Ví dụ : khi ta tải tài liệu về từ một liên kết có dạng thì trước tiên ta sẽ mã hóa cả tên liên kết để đặt tên cho tập tin lưu trữ trên đĩa. Ta mã hóa cả liên kết vì mỗi liên kết là duy nhất như vậy sẽ tránh trường hợp đặt trùng tên và file bị ghi đè lên. Sở dĩ phải mã hóa bởi trong liên kết có những kí tự không phù hợp để đặt tên cho tập tin chẳng hạn như các kí tự /, ? không thể đặt tên cho file trên ổ cứng có các kí tự này. Sau khi được mã hóa thì file trên sẽ được lưu trữ trong thư mục có tên www.java2s.com Hình 11 Cấu trúc của Crawler Hình 12 Sơ đồ use-case của gói crawler Use-case quản lý các liên kết Trong usecase này được chia thành các usecase chi tiết hơn đó là: Quản lý các liên kết gốc Quản lý các liên kết đã lưu vào đĩa cứng Quản lý các thư mục chứa tài liệu đã tải về Chức năng quản lý các liên kết gốc Chức năng quản lý liên kết gốc được phân rã thành các chức năng sau Thêm liên kết gốc Sửa liên kết gốc Xóa liên kết gốc Ta có sơ đồ Usecase của việc quản lý các liên kết gốc Hình 13 Sơ đồ Usecase của việc quản lý các liên kết gốc Thêm liên kết gốc Thêm mới liên kết gốc là tác vụ cho phép người dùng hệ thống thêm mới một liên kết vào hệ thống để vận hành gói crawler hoạt động. Các liên kết này sẽ được tự động thêm vào cơ sở dữ liệu hoặc không tùy theo người sử dụng hiệu chỉnh. Thường thì ở chế độ mặc định sẽ được thêm vào dữ liệu một cách tự động. Trình tự hoạt động như sau: Người dùng sẽ được yêu cầu nhập thông tin về địa chỉ các trang web gốc cũng như tựa đề của trang web…Có thể nhập một hoặc nhiều các liên kết cùng một lúc. Tùy theo số liên kết được nhập vào mà hệ thống sẽ tạo ra số tiến trình tương ứng. Mỗi tiến trình sẽ đảm nhận “crawl” trên một trang độc lập. Các liên kết sẽ được kiểm tra xem đã tồn tại trong cơ sở dữ liệu chưa. Nếu đã tồn tại thì sẽ đưa ra thông báo là liên kết đã tồn tại và người dùng có thể tùy chọn có “crawl” lại trang đó nữa hay không. Nếu chưa thì được nhập vào hệ thống. Hình 14 Sơ đồ trạng thái thêm mới các liên kết gốc Tác vụ chỉnh sửa các liên kết gốc Trong việc quản lý các liên kết hay trong quản lý bất cứ nguồn tài nguyên nào khác đều cần phải có tác vụ chỉnh sửa. Vì có thể có sai sót xảy ra hay nguồn tài nguyên được cập nhật mới. Cụ thể hơn chẳng hạn một website thay đổi địa chỉ gốc của mình, lúc đó tác vụ chỉnh sửa là cần thiết. Các trình tự thực hiện như sau Hệ thống yêu cầu người dùng chọn liên kết cần hiệu chỉnh. Hệ thống sẽ hiển thị nội dung của liên kết, người sử dụng tiến hành chỉnh sửa Hệ thống sẽ kiểm tra tính hợp lệ của các thông tin mới, nếu hợp lệ sẽ thêm vào cơ sở dữ liệu ngược lại sẽ đưa ta thông báo yêu cầu chỉnh sửa lại hoặc kết thúc mà không chỉnh sửa thông tin. Hình 15 Sơ đồ trạng thái của tác vụ chỉnh sửa một liên kết gốc Tác vụ xóa một liên kết gốc Hệ thống sẽ yêu cầu chọn các liên kết gốc cần xóa. Hiển thị thông báo xác nhận là có muốn xóa hay không? Nếu có sẽ xóa dữ liệu nếu không thì kết thúc mà không xóa bất cứ dữ liệu nào. Hình 16 Sơ đồ trạng thái xóa liên kết gốc Quản lý các liên kết đã tải về máy Chức năng quản lý các liên kết đã lưu vào máy được chia thành các chức năng nhỏ hơn như sau: Thêm mới liên kết Chỉnh sửa liên kết Xóa liên kết Sơ đồ usecase cho tác vụ quản lý các liên kết đã được tải về máy Hình 17 Sơ đồ usecase cho tác vụ quản lý các liên kết đã tải về máy Các liên kết đã tải về máy là các liên kết chứa thông tin cần thiết dùng để đánh chỉ mục. Các tài liệu tải về có thể ở nhiều loại định dạng khác nhau. Tùy theo mục đích của từng crawler mà crawler sẽ chọn các loại tài liệu tải về phù hợp. Có nhiều giải pháp lựa chọn. Thứ nhất là crawler sẽ tải tất cả những gì mà crawler gặp nếu các loại tài nguyên đó cho phép tải về. Phương pháp này thì việc xây dựng các crawler dễ dàng hơn. Việc kiểm tra lựa chọn sẽ giảm đi nhưng ngược lại thông tin được tải về sẽ rất nhiều. Thứ hai ta có thể tùy chọn cho crawler chỉ tải những loại định dạng phổ biến (html, txt, doc, pdf, htm…) còn các loại định dạng khác sẽ bỏ qua hay chỉ lưu liên kết và tên của nó. Khi lập chỉ mục thì ta chỉ lập chỉ mục trên trường tên và kết quả trả về sẽ là địa chỉ tham chiếu đến nó mà thôi. Trong phạm vi của đồ án, hệ thống sẽ bỏ qua các loại định dạng phức tạp chỉ tải về các loại định dạng mà có thể chiết lọc thành các văn bản thuần. Mỗi liên kết được tải về sẽ được lưu trong thư mục có tên tương ứng với tên host của nó. Giải pháp là sẽ thêm vào cho crawler một số “tri thức” để nó có thể nhận biết được mục tiêu mà nó cần hướng đến. Tác vụ thêm các liên kết vào cơ sở dữ liệu thường sẽ được cấu hình để crawler tự động giải quyết. Có nhiều giải pháp: Thứ nhất thì crawler sẽ lưu các liên kết đã hoàn thành vào một danh sách. Khi kết thúc công việc thì crawler sẽ đưa ra thông báo xem người dùng có muốn lưu các liên kết đó vào cơ sở dữ liệu hay không. Thứ hai thì crawler sẽ lưu một cách tự động không cần hỏi theo một chu kì nhất định, hay khi crawler hoàn thành liên kết nào thì lưu liên kết đó. Tác vụ chỉnh sửa các liên kết Tác vụ chỉnh sửa các liên kết tải về chỉ hữu dụng khi số website ta crawler là nhỏ có thể quản lý được. Chẳng hạn như crawler trong website riêng của mình chẳng hạn. Khi đó nếu các liên kết có thay đổi thì ta mới nhận biết và hiệu chỉnh. Còn crawler trên Internet thì lượng tài liệu hay các liên kết là vô cùng lớn. Lúc đó tác vụ chỉnh sửa không còn cần thiết nữa. Trong phạm vi đồ án, liên kết có hai trạng thái: COMPLETE tức là đã được tải về lưu trên đĩa cứng. WAITING là trạng thái liên kết mới chỉ được lưu tên trong cơ sở dữ liệu còn thực sự chưa được tải về. Trường hợp liên kết có trạng thái WAITING là trường hợp mà ta dừng chương trình giữa chừng. Các liên kết trong hàng đợi Waiting queue được lưu vào máy để phục vụ cho chức năng thực hiện lại công việc còn dở dang. Các liên kết trong Waiting queue thì có trạng thái là WAITING. Trường hợp thứ hai là trường hợp các liên kết có các loại contentType khác với các loại contentType mà hệ thống cần (chẳng hạn như các contentType, các định dạng *.exe, *.gif…). Nhưng hệ thống lại không muốn bỏ qua mà muốn lưu lại liên kết nhằm mục đích nếu sau này có thể mở rộng các loại contentType thì sẽ quay lại xử lý các liên kết này. Tác vụ xóa bỏ các liên kết Thường thì các máy tìm kiếm có dung lượng lưu trữ lớn sẽ không bao giờ xóa các liên kết. Các liên kết được lưu trữ lại nhằm các mục đích sau: Dùng để so sánh nội dung với nội dung lần sau crawler truy cập lại trang web đó. Nếu có thay đổi thì cập nhật mới không thì bỏ qua. Dùng để trả về kết quả tìm kiếm cho người dùng khi mà trang web nguồn không còn tồn tại. Tuy không cần thiết nhưng chương trình vẫn phát triển tác vụ này. Tác vụ này sẽ có tác dụng khi ta muốn xóa cả một website chẳng hạn như muốn xóa website có nội dung xấu. Quản lý danh sách thư mục chứa tài liệu Quản lý danh sách thư mục chứa tài liệu cũng được phân rã thành các chức năng nhỏ: Thêm mới thư mục. Chỉnh sửa thư mục. Xóa thư mục. Tác vụ thêm mới thư mục được thiết kế có hai cách thêm. Thứ nhất hệ thống tự động thêm khi nhận ra liên kết là liên kết gốc. Thứ hai là người dùng sẽ thêm danh sách các thư mục. Mỗi cách đều có cái mặt thuận lợi và bất lợi. Hệ thống tự động thêm thì phải mất thời gian cho việc phải thêm một bước kiểm tra nhưng thuận lợi là sẽ không thiếu sót các thư mục đặc biệt khi ta cấu hình cho phép crawler đi theo liên kết ngoại ra bên ngoài. Với cách hoạt động này thì crawler sẽ gặp rất nhiều liên kêt gốc mới. Dĩ nhiên việc thêm thư mục phải tự động. Còn người dùng thêm danh sách các thư mục thì sẽ không tốn thêm bước kiểm tra nhưng lại không quản lý được khi crawler gặp nhiều liên kết gốc mới. Hệ thống được thiết kế cho crawler tự động tạo ra các thư mục cũng như tự động thêm danh sách thư mục vào cơ sở dữ liệu. Ngoài ra cũng thiết kế cho người dùng cũng có thể thêm danh sách thư mục. Sơ đồ usecase biểu diễn công việc quản lý thư mục chứa tài liệu Hình 18 Sơ đồ usecase quản lý danh sách các thư mục chứa tài liệu Usecase quản lý thiết lập các tùy chọn Thiết lập các tùy chọn cơ bản Tìm trong nội bộ site Chọn thư mục chính chứa các thư mục được tạo ra. Mặc định là C:/data_dir Chọn số tiến trình tối đa. Mặc định là 5. Xử lý phân tán là kỹ thuật linh hoạt. Giúp tăng tốc độ xử lý cũng như giảm rủi ro khi có sự cố. Chẳng hạng có nhiều tiến trình cùng làm việc. Khi một tiến trình bị lỗi thì hệ thống vẫn hoạt động bình thường. Trong phạm vi này thì các crawler chỉ chạy trên một máy tính có nhiều tiến trình. Trong tương lai sẽ áp dụng trên nhiều máy tính. Chọn giới hạn số liên kết cần tải cho mỗi site Thời gian đợi khi hàng đợi rỗng. Khi các hàng đợi rỗng tiến trình không kết thúc ngay mà sẽ chờ một khoảng thời gian nếu có liên kết được nhập vào hàng đợi thì tiếp tục. Không thì kết thúc. Thiết lập các tùy chọn cấp cao Thiết lập các định dạng tài liệu mà crawler quan tâm. Tất nhiên là các định dạng phải nằm trong phạm vi mà hệ thống có thể xử lý. Thiết lập này có hai thuận lợi. Thứ nhất có thể thu hẹp phạm vi tìm kiếm, tải tài liệu của crawler giúp crawler hoạt động nhanh hơn. Thứ hai khi ta phát triển thêm một định dạng mà gói reader của hệ thống có thể xử lý. Thì ta chỉ cần thiết lập thêm định dạng này cho crawler mà không cần phải xử lý, hay chỉnh sửa lại crawler. Nghĩa là crawler được thiết kế linh hoạt có khả năng mở rộng theo nhiều cách mà không cần phải hiệu chỉnh lại crawler. Hiện tại các định dạng hệ thống có thể thiết lập cho crawler là : text/html, application/pdf, application/msword, text/plain Hiệu chỉnh một số tính năng giúp crawler bỏ qua, hay lựa chọn thêm một số dạng liên kết phức tạp. Chẳng hạn như muốn crawler bỏ qua các tham số là các sessionId tồn tại trong link chẳng hạn. SessionId là nguyên nhân khiến crawler gặp rắc rối vì phải tải các nội dung hoàn toàn giống nhau, và cũng là nguyên nhân khiến crawler đi vào vòng lặp không kết thúc. Thiết lập độ sâu liên kết (deep link) Gói reader Khi crawler kết thúc công việc ta có tập hợp các tài liệu được lưu trữ trên đĩa cứng trong các thư mục phù hợp với tên host của nó. Gói reader sẽ truy cập vào các thư mục này đọc nội dung các tài liệu để chuyển về dạng văn bản thuần túy. Khó khăn ở đây là ta cần phải có các đối tượng đọc khác nhau phù hợp với từng định dạng của tài liệu. Chẳng hạn tài liệu ở định dạng .pdf thì phải tạo ra đối tượng đọc .pdf để đọc nội dung của nó, tài liệu dạng .doc thì phải tạo ra các đối tượng đọc định dạng .doc v.v... Đầu vào của gói Reader là : Tập hợp các tài liệu ở nhiều định dạng khác nhau (pdf, doc, html, htm, txt, rft v.v...). Một tập tin .properties. tập tin này giúp hệ thống tạo ra các đối tượng đọc tương ứng với định dạng tài liệu. Khi muốn thêm một định dạng mới ta cần tạo một lớp mới đọc định dạng này, và định danh các lớp này trong tập tin .properties thì hệ thống sẽ tự động tạo ra đối tượng của lớp đọc này khi gặp định dạng tương ứng của nó. Đầu ra của gói reader: Tập hợp các tài liệu dạng Lucene Document Như đã đề cập ở phần trước, hệ thống dùng mã nguồn mở Lucene để lập chỉ mục. Lucene Document là đối tượng dùng để lập chỉ mục. Những lý thuyết về mã nguồn Lucene đã được trình bày rõ ở chương Cơ sở lý thuyết. Hình 19 Sơ đồ tổng thể các thành phần của gói reader DocumentReader sẽ là một Interface. Các lớp đọc tài liệu sẽ thực thi Interface này tức là thực thi các hàm đọc tài liệu. Hình trên mô tả các loại tài liệu cơ bản mà hệ thống phát triển. Others tức là chỉ định tất cả các loại định dạng tài liệu khác nếu muốn phát triển thì chỉ cần viết thêm một lớp thực thi interface DocumentReader mà thôi. Thành phần ExtentionFileReader là thành phần xử lý các phần đuôi mở rộng của tập tin. Khi đã xác định được phần mở rộng rồi thì nó sẽ khởi tạo đối tượng và gọi các hàm tương ứng xử lý phù hợp cho các định dạng tài liệu đầu vào. ExtensionFileReader sẽ thực thi hàm đọc file của Interface FileReader để nhận giá trị đầu vào xử lý. Gói indexer Gói Indexer là gói có chức năng lập chỉ mục trên toàn bộ tài liệu thu thập được. Đây có thể nói là bước quan trọng nhất, ảnh hưởng nhiều nhất đến kết quả trả về cho một câu truy vấn. Không thể đánh chỉ mục trên tất cả các câu chữ của tài liệu vì như vậy sẽ lãng phí tài nguyên và sẽ có những kết quả trả về không thật chính xác cho yêu cầu truy vấn của người sử dụng. Gói indexer sẽ tạo đối tượng của gói reader và gọi các hàm đọc tương ứng sẽ lấy về các văn bản thuần. Sau đó sẽ thực hiện lập chỉ mục. Sơ đồ hoạt động của gói Indexer Hình 20 Sơ đồ hoạt động của gói indexer Gói searcher và ứng dụng web Sơ đồ hoạt động của gói Searcher và ứng dụng web Hình 21 Sơ đồ hoạt động của gói Searcher và ứng dụng web THIẾT KẾ HỆ THỐNG Tổng thể chương trình Đầu tiên module crawler sẽ làm việc, nó nhận vào một liên kết gốc từ người dùng (người quản trị hệ thống), hoặc sẽ tải từ cơ sở dữ liệu. Nhiệm vụ lần theo tất cả các siêu liên kết có trong trang web hoặc có thể các liên kết ngoài tức là các liên kết không nằm trên cùng địa chỉ host tùy theo ta lựa chọn. Sau đó sẽ tải tất cả các trang web này về lưu trong đĩa cứng. Tiếp theo là module reader sẽ truy cập vào địa chỉ các file trên đĩa và lựa chọn ra cách đọc file thích hợp tùy vào các loại file. Module reader dựa vào phần mở rộng của file để xác định điều này. Ở đây các định dạng file được đọc là cơ bản như các file html, hml, shtml, pdf, doc, txt, rtf … Đầu ra của module reader sẽ được module indexer đọc vào và đánh chỉ mục. Các file đánh chỉ mục sẽ được lưu vào các thư mục tương ứng trên đĩa cứng phục vụ cho công việc tìm kiếm của module searcher. Hình 22 Sơ đô tuần tự của hệ thống Gói crawler Như đã phân tích Crawler có hai chức năng chính. CrawlerManager xử lý các tiểu trình, còn các tiểu trình sẽ thực hiện công việc của mình là theo dấu các siêu liên kết, tải các tập tin cần thiết về (ở đây cơ bản là các file có MIME type là text/html). Trình tự hoạt động: CrawlerManger Nạp cơ sở dữ liệu tức là danh sách các Url gốc cần phải duyệt. Tạo các tiến trình làm việc Crawler – kế thừa từ lớp Thread Lấy url xử lý Kiểm tra loại MIME thường thì text/html, application/pdf, application/word, text/plain Truy xuất các liên kết có trong nội dung của trang này Truy xuất các liên kết bên trong hoặc bên ngoài tùy vào ta đã cấu hình Loại bỏ các trang đã phân tích Tải các file về máy để làm đầu vào cho gói reader Đưa các liên kết mới vào hàng đợi Hình 23 Sơ đồ mô tả hoạt động Crawler Gói reader Giai đoạn đọc là giai đoạn quyết định rất lớn đến kết quả trả về cho mỗi truy vấn của người dùng. Cần phân tích từng loại định dạng của tài liệu để tìm cách lọc văn bản thuần một cách chính xác nhất, không dư thừa cũng như không bỏ sót. Chẳng hạn như các tập tin định dạng html, thì cần phải bỏ qua các thẻ, các đoạn mã JavaScript…Ngoài ra một đặt điểm nữa là cần phải tìm ra các thông tin chính xác để tạo ra các trường (Lucene Field). Chẳng hạn ta cần đánh chỉ mục trường keywords, hay trường tựa đề thì cần phải tìm cách lọc thẻ hay thẻ cho thật chính xác để kết quả trả về phù hợp với người dùng. Các bước thực hiện: Đọc các tập tin đã tải về trên ổ cứng. Lọc các thông tin cần thiết Truy xuất nội dung thành dạng plaintext để cho gói indexer lập chỉ mục Hình 24 Trạng thái hoạt động của gói reader Gói indexer Hình 25 Sơ đồ tuần tự của gói indexer Xây dựng các chức năng Cả chức năng của hệ thống lớn sẽ được phân rã thành các chức năng nhỏ hơn. Xây dựng mỗi chức năng nhỏ này đóng vai trò như xây dựng một hàm xử lý. Chức năng xác nhận cho phép đánh chỉ mục Đây là chức năng đọc thông tin của tập tin robot.txt trước khi đánh chỉ mục cho một website. Chức năng này sẽ lưu lại các địa chỉ không được đánh chỉ mục vào một danh sách. Crawler sẽ kiểm tra danh sách này trước khi tải nội dung. Khi liên kết tồn tại trong danh sách này thì liên kết sẽ được bỏ qua không được tải về. Hình 26 Sơ đồ hoạt động của chức năng đọc file robot.txt Khi không tìm thấy tập tin robot.txt thì xem như tất cả các liên kết trong file này được phép đánh chỉ mục. Chức năng tải tài liệu về máy Hình 27 Sơ đồ hoạt động của chức năng tải tài liệu về máy Đầu vào của chức năng này là một đối tượng của lớp java.net.URL. Khi nhận được đối tượng này hệ thống sẽ kết nối và đọc nội dung. Kiểm tra loại định dạng nội dung của liên kết. Nếu loại định dạng không thuộc phạm vi xử lý thì kết thúc. Còn nếu định dạng nằm trong phạm vi xử lý thì tiếp tục. Kiểm tra độ lớn của tài liệu. Nếu độ lớn không cho phép tải thì cũng kết thúc. Còn độ lớn vẫn nằm trong phạm vi cho phép tải thì tiếp tục Mã hóa lấy tên file, kiểm tra file đã tồn tại trong cơ sở dữ liệu chưa. Nếu chưa thì tải về máy và lưu thông tin vào cơ sở dữ liệu. Nếu rồi thì kiểm tra nội dung của file mới và file cũ nếu khác nhau thì cập nhật mới. Trong phạm vi của đồ án do giới hạn về thời gian nên phần kiểm tra độ tương tự của hai văn bản sẽ được bỏ qua. Mặc định file mới sẽ được ghi đè thông tin lên. Ở đây hệ thống được thiết kế như vậy để sau này có khả năng mở rộng. Chỉ cần viết thêm hàm so sánh độ tương tự giữa hai tài liệu là có thể thực hiện chức năng này bằng cách gọi hàm này thực thi. Kết quả trả về là đúng thì cập nhật file. Tạo công việc mới Một công việc mới được thực hiện có thể trên một website hay trên nhiều website. Mỗi website sẽ được một tiến trình đảm nhiệm. Hình 28 Sơ đồ hoạt động của chức năng tạo công việc mới Lưu công việc dở dang Hệ thống được xây dựng chức năng tự động lưu lại dấu vết của crawler khi crawler tạm ngừng làm việc. Có hai giải pháp để xây dựng: Thứ nhất lưu lại liên kết mà crawler đang thao tác. Thứ hai lưu lại tất cả các liên kết nằm trong Waiting Queue Phương pháp thứ nhất đơn giản ít tốn thời gian lưu dữ liệu và dung lượng lưu trữ. Nhưng lại bỏ sót các liên kết chưa được thực thi trong Waiting Queue. Phương pháp thứ hai không bỏ sót bất kì liên kết nào nhưng lại tốn thời gian cho việc lưu trữ tài liệu. Vì số lượng các liên kết trong Waiting Queue là rất lớn. Chương trình được xây dựng theo giải pháp thứ hai. Thực hiện các công việc cũ Cùng với chức năng lưu công việc dở dang. Thì chức năng thực hiện lại công việc cũ cũng được phát triển. Khi được yêu cầu chương trình sẽ nạp tất cả các liên kết có trạng thái WAITING vào hàng đợi. Mỗi liên kết giờ đây đóng vai trò như là một trang web gốc. Và chương trình tạo ra các tiến trình dành thực thi công việc này.. Chức năng truy xuất liên kết Chức năng truy xuất các liên kết trong một trang web được thực hiên qua các bước sau: Sử dụng biểu thức chính quy để tìm các liên kết. Các liên kết được chú ý ở đây là các liên kết giao thức http. Các liên kết nằm trong thuộc tính href. Ta có biểu thức chính quy được sử dụng như sau: "]"; Khi tìm được một liên kết phù hợp với biểu thức chính quy trên thì thực hiện các bước tiếp theo Loại bỏ khoảng trống ở đầu và cuối liên kết Nếu độ dài của liên kết mà nhỏ hơn 1 thì quay lại từ đầu Bỏ qua các liên kết dùng anchor. Anchor tức điểm neo. Các liên kết này dẫn đến một vị trí khác trên cùng một trang. Bỏ qua các liên kết bắt đầu là “mailto: Bỏ qua các liên kết có dạng JavaScript Bỏ qua liên phần liên kết phía sau dấu #, bỏ qua tham số Xử lý liên kết tương đối tuyệt đối đưa liên kết về liên kết đầy đủ. Xác nhận liên kết có đúng không Xác nhận liên kết có nằm trong cùng host không Nếu tất cả các bước trên đều đúng thì thêm liên kết vào hàng đợi, nếu có một bước sau thì quay lại từ đầu. Hình 29 Sơ đồ hoạt động truy xuất các liên kết Tổ chức dữ liệu Như đã phân tích hệ thống crawler sẽ tải tất cả các trang web, tài liệu về lưu trong ổ cứng. Đây là dữ liệu ban đầu dùng để đánh chỉ mục. Các dữ liệu này có thể được xóa đi ngay sau khi đánh chỉ mục xong hay có thể được lưu lại nhằm hai mục đích: thứ nhất nếu sau một thời gian nguồn của nó không còn tồn tại do liên kết bị hỏng thì ta có thể dùng nó hiển thị kết quả cho người sử dụng, thứ hai nhằm mục đích trong công việc cập nhật thông tin tức là hệ thống dùng nó so sánh với kết quả mới tải về cũng từ liên kết đó nếu kết quả khác nhau thì ta ghi đè lên còn nếu giống nhau thì ta bỏ qua. Hệ thống được mặc định tạo một thư mục trong đĩa cứng có địa chỉ C:/data_dir đây là thư mục gốc chứa các tài liệu được tải về. Trong này sẽ có các thư mục con tự động được hệ thống tạo ra cùng tên với tên host chứa tài liệu. Chẳng hạn với liên kết sau: Khi tài liệu được tải về sẽ có địa chỉ là: C:/data_dir/www.java2s.com/struts2InAction.pdf Tương tự với hệ thống indexer, chương trình được mặc định sẽ tự động tạo một thư mục gốc chứa các tập tin chỉ mục mang tên: C:/index_dir. Còn khi các tài liệu được đánh chỉ mục thì các tập tin chỉ mục sẽ được lưu trong thư mục có tên là tên loại của tài liệu. Chẳng hạn khi ta đánh chỉ mục cho định dạng .pdf thì các tập tin chỉ mục của nó sẽ được lưu trong thư mục như sau: C:/index_dir/pdf. Tổ chức các thư mục như vậy để dễ dàng phát triển thêm chức năng tìm kiếm theo từng loại tài liệu, tức là thu hẹp được phạm vi tìm kiếm phạm vi tìm kiếm. Ngoài các dữ liệu được lưu trên ổ cứng, hệ thống còn sử dụng hệ quản trị cơ sở dữ liệu Mysql để theo dõi các liên kết. Bảng 5 Danh mục các bảng trong cơ sở dữ liệu STT Tên bảng Giải thích 1 url_root Lưu trữ thông tin về liên kết gốc 2 links Lưu trữ thông tin về các liên kết 3 parent_dirs Lưu trữ đường dẫn đến thư mục chứa các tài liệu Trong lý thuyết hướng đối tượng thì mỗi một lớp sẽ tương ứng với mỗi một bảng trong cơ sở dữ liệu. Cụ thể như sau: Một dòng tương ứng với một một đối tượng. Mỗi cột tương ứng với mỗi thuộc tính của lớp. Mỗi thủ tục hay hàm trong cơ sở dữ liệu có thể tương ứng với một phương thức. Lớp URLRootBean Lớp URLRootBean dùng để xử lý thông tin cơ bản về trang web ban đầu. Một trang web thì có các thuộc tính như: tên liên kết, mô tả…Ngoài ra nhằm mục đích để theo dõi tình trạng của trang web ta dùng thêm trường tình trạng (root_status). Ở đây có hai tình trạng cơ bản đó là COMPLETE tức là trang web đã được xử lý. WAITING tức là tình trạng trang web chưa được xử lý. Lớp url_root có cấu trúc như sau: Lớp: URLRootBean Trường: String WAITING="W" String COMPLETE="C" Thuộc tính: int root_id String root_name String root_description String root_status Phương thức: Mô tả chi tiết: root_id: là khóa chính, phân biệt tính duy nhất của URL. root_name: là địa chỉ gốc. root_description: mô tả thông tin về trang web gốc. root_status: trạng thái của địa chỉ gốc. Có hai trạng thái. C: là đã hoàn thành; W: là đang chờ được để được xử lý. Ta có bảng tương ứng trong hệ quản trị cơ sở dữ liệu: Bảng 6 Bảng chứa thông tin địa chỉ gốc STT Thuộc tính Kiểu dữ liệu Giải thích Ghi chú 1 root_id int(4) Id của liên kết gốc Khóa chính 2 root_name varchar(500) Tên liên kết 3 root_description varchar(500) Mô tả về liên kết gốc 4 root_status varchar(1) Tình trạng của liên kết Lớp LinkBean Lớp dùng để xử lý thông tin của các liên kết được tải về trên máy tính. Theo dõi tình trang của các liên kết này. Các liên kết đã được xử lý, đang chờ được xử lý, liên kết hỏng. Các tập tin được tải sẽ ở dạng cơ bản như html, htm, pdf, doc, txt, rtf…Lớp này có cấu trúc như sau: Lớp: LinkBean Trường: String WAITING="W" String COMPLETE="C" Thuộc tính: int link_id; String link_name; String link_sysPath; String link_status; String link_contentType; String link_title; Phương thức: Các liên kết được tải về cũng được thêm vào trường tình trạng nhằm theo dõi tình trạng của liên kết. Tình trạng WAITING=”W” là tình trạng liên kết đang chờ để được xử lý. Tình trạng COMPLETE=”C” là tình trạng liên kết đã được xử lý xong. Ta có bảng tương ứng trong hệ quản trị cơ sở dữ liệu: Bảng 7 Bảng lưu thông tin các địa chỉ được tải về STT Thuộc tính Kiểu dữ liệu Giải thích Ghi chú 1 link_id int(11) Id của liên kết được tải Khóa chính 2 link_name varchar(500) Tên liên kết 3 link_status varchar(1) Tình trạng của liên kết 4 link_contentType varchar(50) Loại nội dung 5 link_title varchar(500) Tựa đề của trang 6 parent_dirsId varchar(255) Id thư mục chứa file tải về Khóa ngoại Lớp ParentDirBean Lớp ParentDirBean là là lớp dùng để xử lý thông tin trên các thư mục chứa tài liệu được tải về. Như đã phân tích mỗi tài liệu được tải về sẽ được lưu trữ trong thư mục có tên tương ứng với tên host của liên kết của nó. Các lớp này có hai thuộc tính chính đó là: parentDirsId, parentDirsName. Tương tự như trên ta thêm vào trường tình trạng nhằm theo dõi tình trạng của thư mục. Mỗi thư mục có hai tình trạng chính: UNINDEX=”U” là tình trạng mà các tài liệu trong thư mục chưa được đánh chỉ mục. INDEX=”I” là tình trạng mà các tài liệu trong thư mục đã được đánh chỉ mục. Lớp này có cấu trúc như sau: Lớp: ParentDirBean Trường: String UNINDEX="U" String INDEX="I" Thuộc tính: int parentDirsId String parent_DirsStatus String parentDirsName Phương thức: Ta có bảng tương ứng trong hệ quản trị cơ sở dữ liệu: Bảng 8 Bảng lưu trữ thông tin của các thư mục chứa tài liệu tải về STT Thuộc tính Kiểu dữ liệu Giải thích Ghi chú 1 parent_dirsId int(4) Id của thư mục chứa tài liệu được tải Khóa chính 2 parent_dirsName varchar(255) Tên thư mục 3 parent_dirsStatus varchar(1) Tình trạng của thư mục Chương 4 CÀI ĐẶT VÀ TRIỂN KHAI CHƯƠNG TRÌNH CÀI ĐẶT CHƯƠNG TRÌNH Từ các bước phân tích và thiết kế đã trình bày ở các phần trước. Hệ thống được xây dựng theo các lớp chính sau: Bảng 9 Bảng mô tả các lớp chính của chương trình Tên lớp Diễn giải CrawlerManager Trường: Thuộc tính: Phương thức: init crawlNew crawlOld stop pause resume init: là hàm khởi tạo các thành phần crawlNew: là hàm bắt đầu một project mới crawlOld: là hàm thực hiện project cũ stop: dừng tất cả công việc pause: tạm dừng tất cả công việc resume: bắt đầu lại công việc đang tạm dừng Crawler Trường: Thuộc tính: Phương thức: isAllowed readContents getLinks run saveToDisk verifySize isURLexists isAllowed: Là hàm đọc nội dung file robot.txt, kiểm tra xem một liên kết có bị cấm không, có trả về false, không trả về true readContents: là hàm dùng để đọc nội dung của một liên kết getLinks: là hàm dùng để truy xuất các liên kết từ nội dung đã đọc. run: crawler là lớp extends từ Thread, khi crawler gọi hàm start thì hàm run này sẽ được gọi. saveToDisk: là hàm có chức năng tải dữ liệu về máy. verifySize: Hàm dùng để xác nhận kích thước của tài liệu isURLexists: Hàm dùng để kiểm tra một địa chỉ có tồn tại hay không HTMLDocParser Trường: Thuộc tính: Phương thức: initHtmlParser getContents getTitle getDocument initHtmlParser: hàm tạo các thành phần getContents: hàm lấy nội dung getTitle: Hàm lấy tựa đề getDocument : Có chức năng tạo Lucene Document từ trang html PlaintTextHandler Trường: Thuộc tính: Phương thức: getDocument getDocument: là hàm có chức năng đưa tài liệu dạng plaintext thành Lucene Document JavaBuildInRTFHandler Trường: Thuộc tính: Phương thức: getDocument getDocument: là hàm có chức năng đưa tài liệu dạng rtf thành Lucene Document PDFBoxHandler Trường: Thuộc tính: Phương thức: getDocument getDocument: là hàm có chức năng đưa tài liệu dạng pdf thành Lucene Document TextMiningWordDocHandler Trường: Thuộc tính: Phương thức: getDocument getDocument: là hàm có chức năng đưa tài liệu dạng pdf thành Lucene Document Indexer Trường: DEFAULT_INDEX_DIR DEFAULT_LOCAL_INDEX_DIR Thuộc tính: Phương thức: indexDataOfCrawler indexLocalData indexDataOfCrawler: là hàm có chức năng đánh chỉ mục các tài liệu được tải về từ crawler indexLocalData: là hàm có chức năng đánh chỉ mục cho tài liệu trên máy cục bộ KẾT QUẢ THỰC HIỆN Sau khi hoàn thành các bước cài đặt chương trình, hệ thống có kết quả thực hiện như sau Màn hình chính của chương trình Màn hình khởi động của chương trình Màn hình hệ thống crawler đang vận hành Hình 30 Màn hình crawler đang hoạt động tải các dữ liệu về máy Các thông tin của màn hình trên: Liên kết ban đầu là liên kết của Trường Đại Học Bách Khoa Đà Nẵng Ta có thể nhập nhiều liên kết ban đầu bằng cách điền thông tin vào các textbox rồi lần lượt chọn nút Thêm. Danh sách các liên kết ban đầu sẽ được thêm vào bảng phía dưới. Tùy vào số liên kết trong bảng này mà hệ thống tạo ra số thread tương ứng. Mỗi thread đảm nhiệm mỗi liên kết gốc. Tùy chọn: Tìm trong nội bộ site: nếu checkbox này được check thì crawler chỉ đi theo những liên kết là các liên kết của website đó ngược lại thì crawler có thể theo các liên kết đi ra bên ngoài. Thư mục chứa dữ liệu tức là thư mục chính chứa các thư mục sẽ được tạo ra. Mặc định có giá trị là C:/data_dir Giới hạn số liên kết mỗi site: tức là ta giới hạn số liên kết tối đa mà crawler tải về trên mỗi site. Nếu thông số này không được thiết lập thì khi nào hết liên kết thì crawler mới dừng. Thời gian đợi khi hàng đợi rỗng: nếu thông số này không được thiết lập thì sẽ được dùng giá trị mặc định là 5 giây. Màn hình xử lý các công việc cũ Hình 31 Màn hình khi hệ thống thực hiện các công việc cũ Chương 5 KẾT QUẢ THỬ NGHIỆM DỮ LIỆU THỬ NGHIỆM Dữ liệu thử nghiệm là các nội dung của các website như: www.roseindia.net Trang hướng dẫn học Java www.java2s.com Trang hướng dẫn học Java Trang web của Trường Đại Học Bách Khoa Đà Nẵng KẾT QUẢ THỬ NGHIỆM Các kết quả được crawler tải về được nằm trong các thư mục có cấu trúc như sau: Hình 32 Danh sách các dữ liệu do crawler tải về Các tập tin do crawler tải về được lưu trữ theo cấu trúc như trong hình. Mỗi website có một thư mục tương ứng với tên host dùng để chứa các tài liệu tải về từ host đó. Ví dụ như thư mục được khoanh đỏ là trang của Trường Đại Học Bách Khoa Đà Nẵng. Các trang web được tải về từ trang web của trường ta sẽ được lưu trữ trong thư mục này. Tên các tập tin được mã hóa bằng chính tên của liên kết đến tài liệu đó. Hình 33 Kết quả trả về với câu truy vấn “Java Tutorial” Các kết quả trả về được phân trang, mỗi trang thể hiện mười kết quả. Các từ trong câu truy vấn sẽ được in đậm. Tựa đề của kết quả sẽ kết nối tới nguồn của nó từ Internet. Hình 34 Trang web nguồn của kết quả đầu tiên Chương 6 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN KẾT QUẢ ĐẠT ĐƯỢC Về mặt lý thuyết Có thể nói tìm kiếm thông tin tư liệu là một lĩnh vực rộng và bao hàm nhiều vấn đề khó giải quyết. Cái khó dễ dàng nhận thấy nhất là ở chỗ nguồn tài nguyên vô cùng phong phú đa dạng lại được cập nhật thường xuyên. Cơ sở tài nguyên phát triển hệ thống thì có hạng không thể đáp ứng được cho nguồn tài liệu bao la trên Internet. Bởi vậy chọn lọc là cần thiết. Chọn lọc ở nhiều mặt: chọn lọc thuật toán, chọn lọc cấu trúc dữ liệu, chọn lọc nội dung, chọn lọc những nội dung đặc trưng cốt lõi nhất của trang web để đánh chỉ mục. Đây là những bài toán khó bởi nó liên quan đến xử lý ngôn ngữ tự nhiên - một lĩnh vực không tuân theo một quy tắc quy luật cụ thể nào. Các vấn đề này luôn được quan tâm nghiên cứu tìm tòi phát triển. Về mặt thực nghiệm Dựa vào những mục đích ban đầu đặt ra của luận văn tốt nghiệp, em đã xây dựng được chương trình mô phỏng một hệ thống tìm kiếm thông tin tư liệu toàn văn bản và đã đạt được những kết quả sau: Ưu điểm Chương trình đã biểu diễn được khả năng tìm kiếm thông tin tư liệu trên Internet. Khả năng tải các nội dung cần thiết từ các trang web, phân tích tài liệu chiết lọc những thông tin cần thiết phục vụ cho công cụ tìm kiếm. Khả năng tự động hóa trong việc truy tìm thông tin của hệ thống crawler. Crawler có thể hoạt động đồng thời bằng nhiều tiến trình cùng làm việc. Phân tích liên kết khá chính xác. Khuyết điểm Giao diện chưa được đẹp. Khả năng phân tích độ tương tự của văn bản chưa được phát triển để sử dụng cho việc cập nhật nội dung mới cho tài liệu. Cũng như loại trừ những trang web có nội dung tương tự nhau. HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI Một hướng phát triển ưu tiên hàng đầu cho luận văn tốt nghiệp là xây dựng được một máy tìm kiếm cho các văn bản Tiếng Việt. Mỗi ngôn ngữ có đặc trưng riêng cần phải có những nghiên cứu cụ thể mới tìm ra được phương pháp phân tích, bóc tách nội dung phù hợp. Như đã định hướng luận văn tốt nghiệp mang tính nghiên cứu nhiều hơn là thực nghiệm. Luận văn tốt nghiệp chỉ làm chương trình mô phỏng máy tìm kiếm trên các loại văn bản phi cấu trúc. Trong tương lai, từ những lý thuyết đã nghiên cứu được em sẽ phát triển chương trình thành một ứng dụng thực sự. Một chương trình có khả năng giao tiếp với hệ quản trị cơ sở dữ liệu nhằm mục đích đánh chỉ mục cho toàn bộ nội dung nằm bên trong hệ quản cơ sở dữ liệu. Phát triển thêm khả năng phân tích độ tương tự văn bản nhằm xây dựng thêm cho hệ thống có khả năng so sánh loại trừ những trang web ít thay đổi nội dung. Chương trình sẽ là một công cụ hữu ích cho các website muốn phục vụ khả năng tìm kiếm cho người dùng ngày một tốt hơn. PHỤ LỤCxóa, nếu kô có phụ lục TÀI LIỆU THAM KHẢO Otis Gospodnetic, Erik Hatcher, Doug Cutting Luence in action ISBN 1-932394-28-1 Jeff Heaton , Programming Spiders, Bots, and Aggregators in Java Trang web : Trang web : Trang web: Trang web: Trang web: Trang web: Trang web: TÓM TẮT ĐỀ TÀI Search engine là một lĩnh vực rất thiết thực trong thời đại công nghệ thông tin ngày nay. Cùng với nguồn tài nguyên Internet càng ngày càng lớn thì các máy tìm kiếm phải càng ngày càng phát triển để phục vụ cho nhu cầu tìm kiếm của con người. Các máy tìm kiếm trên thế giới như Google, Yahoo đã phục vụ phần lớn nhu cầu tìm kiếm tài nguyên Internet cho con người. Nhưng cũng không có bằng chứng nào xác minh các máy tìm kiếm này là tối ưu, các kết quả trả về cho truy vấn của người dùng được cho là tương thích nhất cũng không có một ai dám xác nhận là chính xác. Các thuật toán, cơ chế hoạt động bên trong mỗi máy tìm kiếm đều đang nằm trong vòng bí mật. Vì vậy lĩnh vực này đang được rất nhiều chuyên gia quan tâm phát triển. Cũng cùng với nhu cầu đó nhưng trong phạm vi thu hẹp hơn. Các website muốn tạo cho mình một công cụ tìm kiếm, phục vụ cho nhu cầu tìm kiếm các tài nguyên trên website của mình. Hay các website muốn xây dựng một máy tìm kiếm dành riêng cho các tài liệu Tiếng Việt. Đề tài: “Nghiên cứu máy tìm kiếm và xây dựng thử nghiệm mô hình máy tìm kiếm” với mong muốn sẽ học tập tiếp thu được các kiến thức cũng như mô hình hoạt động của máy tìm kiếm để sau này có khả năng xây dựng một máy tìm kiếm toàn văn cho các tài liệu Tiếng Việt. Không chỉ tìm kiếm được trên các tài liệu phi cấu trúc mà còn tìm được trên các dữ liệu có cấu trúc bên trong các hệ quản trị cơ sở dữ liệu. Trong quá trình nghiên cứu, em đã xây dựng được một mô hình cơ bản mô phỏng hoạt động của máy tìm kiếm dựa trên crawler (crawler-based search engine). Hệ thống có khả năng tạo nhiều crawler đi thu thập thông tin từ các trang web. Tải các tài liệu đó về máy và đánh chỉ mục cho các tài liệu. Bên cạnh đó ứng dụng còn phát triển giao diện web giao tiếp giữa người dùng và hệ thống. Có khả năng nhận câu truy vấn, truy vấn chỉ mục đảo và trả về kết quả phù hợp.

Các file đính kèm theo tài liệu này:

  • docLVTN_PhanTanLuan_04T1.doc