Hình 1 .2 Biểu đồ tuần tự một chuỗi MVC đơn giản
Hình 1.9 Cấu trúc một file pdf
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 33
Ví dụ: ( This is a string. )
( This is a longer \ string. )
Bất kỳ giá trị 8-bit có thể được đại diện hoặc tương đương bát phân của nó (trong các hình thức \ ddd, ddd là số bát phân), hoặc bằng tương đương với hai chữ số hex của nó, bao quanh bởi các dấu ngoặc góc. Sau đó tơi sẽ tìm kiếm các dữ liệu văn bản trong chuỗi.
* Đối với Array: Array là một chuỗi các đối tượng PDF, đi kèm trong dấu ngoặc vng.
Ví dụ: [(Hello,)10(Zend Fremawork!)]
* Đối với Dictionaries: Dictionaries là một cặp key/value, được sử dụng để chỉ định một số thuộc tính của một đối tượng, nó thường đi kèm theo cặp dấu ngoặc góc bên trái (<<) ở đầu và dấu ngoặc góc bên phải (>>) ở cuối.
Ví dụ: << /Length 4 0 R
/Filter /FlateDecode >>
* Đối với Streams: Streams là một chuỗi 8-bit, nằm giữa từ khóa stream và
endstream, đặt biệt nó sẽ được đặt trong ngoặc với từ khóa obj và endobj. Tất cả các nội dung đều được nằm trong các streams.
Trước từ khóa stream phải là một thuộc tính Dictionaries, cung cấp thông tin về chiều dài của stream (/ Length key) hoặc các thơng tin khác.
Ví dụ: Một dịng văn bản nhỏ có thể được hình thành như sau:
2 0 obj << / Length 39 >> stream BT / F1 12 Tf 72 712 Td (This is a text.) Tj ET endstream endobj
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 34
Trong ví dụ này, các văn bản được đưa ra như là một chuỗi tiếp theo là màn hình hiển thị văn bản điều hành Tj.
Vậy làm thế nào để có thể có được một tài liệu “sạch”?
Như ta đã thấy cấu trúc của file pdf, tất cả các thông tin về một nội dung đều được bố trí trong các streams. Và các nội dung trong các streams được bao bọc trong các khóa BT (Begin of text) và khóa ET (End of text). Một file pdf sẽ hiển thị ra nội dung của một văn bản nếu có khóa Tj (Hiển thị văn bản) hoặc TJ (Hiển thi văn bản có xem xét các vị trí đánh dấu).
Và cơng việc của chúng ta là đi phân tích cú pháp và đi sâu vào kiến trúc của streams để chiết xuất thông tin nội dung, trong đó chúng ta sẽ loại bỏ tất cả các thẻ, các hình ảnh, các yếu tố minh họa khác, chỉ lọc lấy ra một văn bản thuần nhất.
Từ những kiến thúc tìm hiểu được về định dạng file pdf, tôi đã cố gắng phát triển một function có chức năng chuyển đổi một file pdf sang định dạng file text nhằm tạo cơ sở cho việc lập chỉ mục tìm kiếm thơng tin cho tài liệu.
1.3.3.2. Xây dựng chỉ mục cho hệ thống tìm kiếm
Bao gồm các chức năng chính như chỉ định dữ liệu lập chỉ mục, thực hiện phân tích tài liệu, tạo chỉ mục và lưu trữ thông tin xuống tập chỉ mục, cập nhật chỉ mục trong trường hợp bổ sung hay thay đổi dữ liệu.
Quy trình tạo chỉ mục gồm các bước sau:
a. Created Index
Index được tạo ra khi sử dụng lớp Zend_Search_Lucene với phương thức create(). Khi bạn sử dụng phương thức này, bạn sẽ tạo ra các tập tin vật lý cần thiết cho chỉ số. Tập tin chỉ mục có thể có kích thước lên đến 2GB trên một hệ thống 32- bit, nhưng có thể đạt kích thước lớn hơn trong hệ thống 64-bit.
Sau khi các tập tin chỉ mục được tạo ra, các tập tin sẽ được sử dụng để lưu trữ các tài liệu mà người sử dụng muốn tìm kiếm.
Đầu tiên, tạo một bộ điều khiển mới, FindController.php, và lưu nó trong controller của thư mục ứng dụng (web_library\application).
Tiếp theo, sử dụng phương thức created-indexAction() để tạo chỉ mục . class FindController extends Zend_Controller_Action
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 35 {
public function createIndexAction () {
//Create an index.
$Index = Zend_Search_Lucene::create('application/ searchdocument');
echo 'Index created';
$this->_helper->viewRenderer->setNoRender(); }
}
Sau khi thực thi lệnh này, chúng ta sẽ tạo ra một thư mục application/searchdocument chứa file index của hệ thống. Và khi đó chúng ta sẽ nhìn thấy cấu trúc của thư mục đó như sau:
b. Add Document
Sau khi tạo ra được file index, bước tiếp theo là quá trình thêm vào file index các bản ghi chỉ mục. Mỗi bản ghi sẽ thể hiện giống như một tài liệu chứa các trường thông tin giúp chúng ta xây dựng các truy vấn tìm kiếm.
Ví dụ, chúng ta có một tài liệu định dạng pdf, vậy các bản ghi chỉ mục chúng ta cần thêm vào file index đó là tiêu để của tài liệu, nội dung của tài liệu, tác giả của tài liệu đó.
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 36
Sử dụng Class Zend_Search_Lucene_Document và các phương thức của class này để thêm một bản ghi.
Phương thức Thông số Mô tả
addField() addField(Zend_Search Lucene_Field)
Thêm field vào document
getFieldNames() getFieldNames() Trả về một mảng chứa tất cả
các lĩnh vực trong tài liệu.
getField() getField(String) Trả về đối tượng Zend_Search
Lucene_Field
Thực thi lệnh sau, chúng ta sẽ có một bản ghi chỉ mục về nội dung liên quan tới một tài liệu.
class FindController extends Zend_Controller_Action {
public function createIndexAction () {
//Add Document to File Index.
$product[$i]= new Zend_Search_Lucene_Document();
$product[$i]->addField(Zend_Search_Lucene_Field :: Text ('name', $data[$i]['document_name'])); $product[$i]->addField(Zend_Search_Lucene_Field ::Text ('author', $data[$i]['document_auhtor'])); $product[$i]->addField(Zend_Search_Lucene_Field ::text ('content', $data[$i]['document_content'])); $product[$i]->addField(Zend_Search_Lucene_Field ::text ('sumary', $data[$i]['document_sumary']); $product[$i]->addField(Zend_Search_lucene_Field :: keyword('topic',$data[$i]['document topic'])); $product[$i]->addField(Zend_Search_Lucene_Field :: unIndexed('id', $data[$i]['document_id'])); $Index->addDocument($product[$i]); } }
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 37
Lớp Zend_Search_Lucene_Field xử lý việc tạo ra các lĩnh vực trong một tài liệu. Và để tạo ra các lĩnh vực đó, chúng ta sử dụng:
Keyword: Lĩnh vực được lưu trữ và lập chỉ mục, có nghĩa là họ có thể được
tìm kiếm cũng như hiển thị trong kết quả tìm kiếm. Họ khơng được tách ra thành các từ riêng biệt của tokenization. Các lĩnh vực cơ sở dữ liệu liệt kê thường được dịch sang các lĩnh vực từ khoá trong Zend_Search_Lucene .
UnIndexed: Lĩnh vực khơng phải là tìm kiếm, nhưng họ được trả về với số
truy cập tìm kiếm. Các timestamps cơ sở dữ liệu, khóa chính, đường dẫn hệ thống tập tin, và nhận dạng bên ngoài khác là những ứng viên tốt cho các lĩnh vực UnIndexed.
Binary: Lĩnh vực không được tokenized lập chỉ mục, nhưng được lưu trữ để
thu hồi với số truy cập tìm kiếm. Chúng có thể được sử dụng để lưu trữ bất kỳ dữ liệu được mã hóa như là một chuỗi nhị phân, chẳng hạn như một biểu tượng hình ảnh.
Text: Được lưu trữ, lập chỉ mục, và tokenized. Lĩnh vực text là thích hợp để
lưu trữ thông tin như đối tượng và tiêu đề cần được tìm kiếm cũng như quay trở lại với kết quả tìm kiếm.
UnStored: Lĩnh vực được tokenized và lập chỉ mục, nhưng không được lưu
trữ trong chỉ mục. Số lượng lớn các văn bản được lập chỉ mục tốt nhất bằng cách sử dụng của lĩnh vực này. Lưu trữ dữ liệu tạo ra một chỉ số lớn hơn trên đĩa, vì vậy nếu chúng cần tìm kiếm nhưng khơng hiển thị lại dữ liệu, sử dụng một lĩnh vực UnStored.
c. Upload Document
Cũng tương tự như created index, chỉ khác là thay phương thức Open() thay thế cho phương thức Create().
class FindController extends Zend_Controller_Action {
public function createIndexAction () {
//Create an index.
$Index = Zend_Search_Lucene::open('application/ searchdocument');
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 38 //Add Document to File Index.
$product[$i]= new Zend_Search_Lucene_Document(); $product[$i]->addField(Zend_Search_Lucene_Field ::Text('Url', $data[$i]['document_url'], 'utf-8'));
$Index->addDocument($product[$i]); }
}
1.3.3.3. Tìm kiếm thơng tin a. Xây dựng các truy vấn a. Xây dựng các truy vấn
Có 2 cách để tìm kiếm các chỉ mục:
- Thứ nhất, sử dụng cú pháp phân tích truy vấn.
- Thứ hai, truy vấn thơng qua API của Zend_Search_Lucene.
Sử dụng cú pháp phân tích truy vấn Zend_Search_Lucene_Search QueryParser :: parse() để phân tích các chuỗi truy vấn thành các đối tượng truy vấn.
$nameQuery = Zend_Search_Lucene_Search_QueryParser ::parse ($queryStr);
$contentQuery=Zend_Search_Lucene_Search_QueryParser ::parse($queryStr);
$query = new Zend_Search_Lucene_Search_Query_Boolean ();
$query->addSubquery($nameQuery) $query->addSubquery($contentQuery) $hits = $index->find($query);
Zend_Search_Lucene:: Find () là phương pháp xác định các loại đầu vào tự động và sử dụng phân tích cú pháp truy vấn để xây dựng một đối tượng Zend_Search_Lucene_Search_Query thích hợp từ một đầu vào của chuỗi.
Zend_Search_Lucene:: Find () là phương pháp xác định các loại đầu vào tự động và sử dụng phân tích cú pháp truy vấn để xây dựng một đối tượng Zend_Search_Lucene_Search_Query thích hợp từ một đầu vào của chuỗi.
b. Kết quả tiềm kiếm
Kết quả hiển thị là một mảng của các đối tượng Zend_Search_Lucene Search_QueryHit.
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 39
Mỗi một kết quả tìm kiếm được gồm có 2 đặc tính: $hit->id là số được đánh trong chỉ mục, $hit->score là số được đánh trong kết quả. Và các kết quả đó được sắp xếp theo $hit->score (giảm dần từ $hit->score cao nhất).
Đối tượng Zend_Search_Lucene_Search_QueryHit sẽ đưa ra từng field của đối tượng Zend_Search_Lucene_Document.
Ví dụ:
$index = Zend_Search_Lucene::open ('/application
/searchdocument);
$hits = $index->find ($query); foreach ($hits as $hit) {
echo $hit->name; echo $hit->content; echo $hit->author;
Ví dụ này sẽ cho ra kết quả là 3 filed của một tài liệu bất kỳ, đó chính là tên, nội dụng và tác giả của tài liệu.
1.3.4. Đánh giá độ chính xác của hệ thống
Có nhiều cách đo lường khác nhau cho việc đánh giá mức độ xử lý về kết quả của một hệ thống tìm kiếm thơng tin. Các cách đo lường đều đòi hỏi một tập tài liệu và một câu truy vấn tập tài liệu đó, giả sử rằng mỗi tài liệu có thể liên quan hoặc không liên quan đến câu truy vấn.
Độ chính xác: Được đo bởi tỉ lệ của tài liệu trả về chính xác trên tổng các tài
liệu nhận được hóa
Độ chính xác = ∩{Tài liệu liên quan} {Tài liệu nhận được}
Sinh viên thực hiện: Trịnh Xuân Lợi Trang 40
Độ bao phủ: Được đo bởi tỉ lệ tài liệu trả về chính xác trên tổng các tài liệu
có liên quan.
Độ bao phủ = ∩
Kết quả sai: Được đo bởi tỉ lệ các tài liệu không liên quan trả về trên tổng các tài liệu không liên quan
Kết quả sai = ∩{Tài liệu không liên quan} {Tài liệu không liên quan}
{Tài liệu nhận được} {Tài liệu liên quan}
Sinh viên thực hiện:Trịnh Xuân Lợi
Trang 41
Chương 2
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 2.1. Đặc tả các usecase trong hệ thống
2.1.1. Các tác vụ liên quan đến module admin
2.1.1.1. Use-case tổng quan module admin
2.1.1.2. Use-case login
- Mục đích: Dành cho user có trong hệ thống gồm 4 nhóm: Founder,
Administrator, Teacher và Sinh viên muốn đăng nhập vào hệ thống để xem thông tin và hoạt động theo chức năng phân quyền đã được phân quyền cho từng nhóm người dùng trong hệ thống.
- Điều kiện tiên quyết: Là những thành viên có tài khoản trong hệ thống. - Tác nhân chính: Founder, Administrator, Teachers, User.
- Điều kiện lỗi: Tên đăng nhập hoặc mật khẩu khơng chính xác.
Login page Update User Update Product_topic Update GroupUser Update Product_Spectialty My SQL database Logs into systern