Module Index của hệ thống Simple Search Engine được xây dựng dựa trên thư viện mã nguồn mở Lucene.net để đánh index cho các tài liệu và dựa vào các số liệu thống kê của các file index để xây dựng module Topic_Define dùng cho việc phân vùng tài liệu.
3.1 Mô hình và cách thức hoạt động của module Index
Cách thức hoạt động của module Index như sau:
• Bước 1: Module TopicDefine lấy các số liệu thống kê (statistc) từ các file chỉ mục để xây dựng lên Topic_Map và IDF_Map cho các term
• Bước 2: Module Document Parse lấy document từ Document Store, tách lấy nội dung của document, chuyển nội dung cho module Topic Define.
• Bước 3: Module Topic Define dựa vào Topic_Map, IDF_Map xác định topic cho nội dung vừa được chuyển tới, cập nhật Topic_Map. Sau đó chuyển nội dung và topic sang cho module Lucene Indexing
• Bước 4: Module Lucene Idexing dùng các hàm của thư viện mã nguồn mở Lucene để terming tài liệu, loại bỏ stop word và đánh chỉ mục cho nội dung cùng topic vừa được chuyển tới. Kết quả đánh chỉ mục lưu vào Index Files
• Lặp lại bước 2.
3.2 Cách thức xây dựng module Topic Define:
Xây dựng IDF map:
Bằng cách sử dụng các hàm:
Hàm lấy số lần xuất hiện trong các documents của Term: Int IndexReader. DocFreq(Term t);
Hàm lấy số lượng document đã được đánh index Int IndexReader.Maxdoc();
Chúng ta xây dựng được thư viện IDF cho các term qua công thức:
10idfi log ( ) idfi log ( ) i N N =
Với N là số lượng các document. Ni là số lấn xuất hiện của term I t rong các document.
Xây dựng các vector TF_IDF đại diện cho các cụm dữ liệu của hệ thống:
Bằng cách sử dụng các hàm:
Hàm lấy danh sách các term trong các document: Int[] TermFreqVector.GetTerms();
Hàm lấy số lần xuất hiện của các term trong các document:
Int[] TermFreqVector. GetTermFrequencies();
Chúng ta xây dựng được các vector cho các document của hệ thống qua công thức: t W W n ij it it ∑ =
Trong đó Wit là trọng số vector của topic t theo term i.
- ∑Wtij:Tổng trọng số của các tài liệu j thuộc phân mục t theo term i - nit: Tổng số tài liệu chứa từ i trong phân mục t
Bằng phép lấy giá trị trung bình của các vector thuộc một cụm tài liệu ta theo công thức Wt W n ij it it ∑ =
Trong đó Wit là trọng số vector của topic t theo term i.
- ∑Wtij:Tổng trọng số của các tài liệu j thuộc phân mục t theo term i - nit: Tổng số tài liệu chứa từ i trong phân mục t
Ta có được vector đại diện cho cụm tài liệu cần xét
Xác định topic cho 1 document:
Hàm xác định topic cho một document:
string GetTopic(string subject, string topicStr)
Trong đó subject là chuỗi nội dung của document, topciStr là topic được gán hiện tại của document.
Nếu như Document được gán topic hiện tại là “Undefine” thì hệ thống sẽ tiến hành xác định topic cho document bằng cách: Xây dựng vector TF-IDF cho document. Sau
đó, sử dụng hàm tương tự giữa 2 vector trong không gian ( hàm Cosin similary) để tính ra độ tương tự giữa document đó và các vector đại diện cho các topic. ( trong hệ thống là hàm ComputeAngle( topicVector, subjectVector)). Lấy giá trị lớn nhất có được. So sánh với một giá trị ngưỡng ( Threshold ) ta sẽ tìm ra topic cho document (nếu giá trị Max > Threshold) hoặc không xác định được topic cho document (nếu Max < threshold).