CHƯƠNG III. ỨNG DỤNG THỬ NGHIỆM
3.2 Chức năng của chương trình thử nghiệm
Chương trình được xây dựng với hai chức năng chính như sau:
Tạo chỉ mục
- Lấy nội dung từ tài liệu có trong thƣ mục:
Với mỗi tài liệu:
Đọc những từ có trong tài liệu (Sử dụng thư viện miễn phí EPocalipse.IFilter.dll để hỗ trợ đọc các tệp .doc, .docx) Lọc các từ vô nghĩa bằng cách so sánh với Stopword Với mỗi từ:
Sử dụng thuật toán Poster Stemmer để đƣa ra các từ gốc (với văn bản tiếng Anh)
Đƣa các từ đƣợc lọc vào wordlist.
- Tạo ma trận Term - Document
- Tạo ma trận trọng số Term - Document - Tính SVD
A = USVT
- Lưu các tính toán vào index.bin để sử dụng trong quá trình tìm kiếm - Hiển thị kết quả tìm kiếm cho người dùng sau khi đã được xếp hạng mức độ liên quan giữa câu truy vấn và các tài liệu.
Code :
private void IndexThings() {
string progressLabel = @"Đánh chỉ mục nội dung...";
lsiReader oReader = new lsiReader();
oReader.UpdateStatus += new
lsiReader.LsiEventHandler(IndexThingsUpdateStatus);
oReader.IndexDirectory(LSICommon.Instance.LSIConfig.document_directory);
m_oWorker.ReportProgress(2, progressLabel);
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
DotNetMatrix.GeneralMatrix oLocalWeights = new DotNetMatrix.GeneralMatrix(oReader.WordList.Count,
oReader.DocList.Count);
DocWordRelation oDocWord;
foreach (DictionaryEntry oRow in oReader.WordList) {
foreach (DictionaryEntry oCol in oReader.DocList) {
oDocWord.DocID = (int)oCol.Key;
oDocWord.WordID = (int)oRow.Value;
if (oReader.DocWordRelation.ContainsKey(oDocWord)) {
oLocalWeights.Array[(int)oRow.Value][(int)oCol.Key] = (int)oReader.DocWordRelation[oDocWord];
} else {
oLocalWeights.Array[(int)oRow.Value][(int)oCol.Key] = 0;
} } }
m_oWorker.ReportProgress(30, progressLabel);
double[] oGlobalTermWeights = new double[oReader.WordList.Count];
double[] oDocNormFactors = new double[oReader.DocList.Count];
for (int i = 0; i < oLocalWeights.Array.Length; i++) {
int sum = 0;
double Fi = 0;
for (int j = 0; j < oLocalWeights.Array[i].Length; j++) {
if (oLocalWeights.Array[i][j] > 0) {
sum+=1;
Fi += oLocalWeights.Array[i][j];
}
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
}
if (sum > 0) oGlobalTermWeights[i] = Math.Log(oReader.DocList.Count/ (double)sum);
else oGlobalTermWeights[i] = 0;
}
m_oWorker.ReportProgress(40, progressLabel);
for (int j = 0; j < oLocalWeights.Array[0].Length; j++) {
double sum = 0;
for (int i = 0; i < oLocalWeights.Array.Length; i++) {
sum += (oGlobalTermWeights[i] * oLocalWeights.Array[i][j])
* (oGlobalTermWeights[i] * oLocalWeights.Array[i][j]);
}
oDocNormFactors[j] = 1 / Math.Sqrt(sum);
}
m_oWorker.ReportProgress(50, progressLabel);
DotNetMatrix.GeneralMatrix oWTDM = new DotNetMatrix.GeneralMatrix(oReader.WordList.Count, oReader.DocList.Count);
for (int i = 0; i < oWTDM.Array.Length; i++) {
for (int j = 0; j < oWTDM.Array[i].Length; j++) {
oWTDM.Array[i][j] = oLocalWeights.Array[i][j] * oGlobalTermWeights[i] * oDocNormFactors[j];
} }
m_oWorker.ReportProgress(60, progressLabel);
DotNetMatrix.SingularValueDecomposition svd = new DotNetMatrix.SingularValueDecomposition(oWTDM);
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
int svd_rank = (int)(oReader.DocList.Count *
((double)LSICommon.Instance.LSIConfig.k_percent_for_rank_approx));
if (svd_rank == 0 || svd_rank > oReader.DocList.Count) svd_rank = oReader.DocList.Count;
DotNetMatrix.GeneralMatrix sk = new DotNetMatrix.GeneralMatrix(svd_rank, svd_rank);
for (int i = 0; i < svd_rank; i++) {
for (int j = 0; j < svd_rank; j++) {
sk.Array[i][j] = svd.S.Array[i][j];
} }
m_oWorker.ReportProgress(70, progressLabel);
DotNetMatrix.GeneralMatrix skinv = sk.Inverse();
DotNetMatrix.GeneralMatrix u = svd.GetU(); // U
DotNetMatrix.GeneralMatrix uk = new
DotNetMatrix.GeneralMatrix(u.Array.Length, svd_rank);
for (int i = 0; i < u.Array.Length; i++) {
for (int j = 0; j < svd_rank; j++) {
uk.Array[i][j] = u.Array[i][j];
} }
m_oWorker.ReportProgress(80, progressLabel);
Tìm kiếm
- Lấy dữ liệu từ file index.bin để phục vụ cho quá trình tìm kiếm - Lấy nội dung câu truy vấn, lọc từ dừng
- Tạo vector qT làm danh sách từ
- Tính vector truy vấn q = qT × Uk × Sk (vector đơn vị) - Tạo vector của các văn bản:
Với mỗi văn bản Tạo vector dT
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
Tính vector d = dT × Uk × Sk (vector đơn vị) - Tính toán độ tương đồng giữa câu truy vấn và tài liệu
Với mỗi tài liệu Lấy vector “d”
Tính cosin(q,d)
- Hiển thị danh sách kết quả theo chiều giảm dần của mức độ liên quan.
Code:
private void FindThings() {
Hashtable WordList = new Hashtable();
Hashtable DocList = new Hashtable();
DotNetMatrix.GeneralMatrix uk=null;
DotNetMatrix.GeneralMatrix skinv = null;
DotNetMatrix.GeneralMatrix oWTDM = null;
DocIndex oDocIndex;
oDocIndex.DocList = null;
oDocIndex.WordList= null;
oDocIndex.uk = null;
oDocIndex.WTDM = null;
oDocIndex.skinv = null;
string index_path = LSICommon.Instance.LSIAppPath +
@"\index.bin";
bool bRead=false;
BinaryFormatter bf = new BinaryFormatter();
if (File.Exists(index_path)) {
try {
FileStream f =
File.Open(LSICommon.Instance.LSIAppPath + @"\index.bin", FileMode.Open);
oDocIndex = (DocIndex)bf.Deserialize(f);
f.Close();
bRead = true;
} catch {
bRead = false;
} } else
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
{
bRead = false;
}
if (!bRead) {
MessageBox.Show("Chưa tạo chỉ mục! Hãy bấm nút Chỉ mục!");
return;
}
for (int i = 0; i < oDocIndex.WordList.Length; i++) {
WordList.Add(oDocIndex.WordList[i].key, oDocIndex.WordList[i].value);
}
for (int i = 0; i < oDocIndex.DocList.Length; i++) {
DocList.Add(oDocIndex.DocList[i].key, oDocIndex.DocList[i].value);
}
uk = new DotNetMatrix.GeneralMatrix( oDocIndex.uk);
skinv = new DotNetMatrix.GeneralMatrix(oDocIndex.skinv);
oWTDM = new DotNetMatrix.GeneralMatrix(oDocIndex.WTDM);
string newquery = txtQuery.Text;
string[] newqwords = LSICommon.Instance.GetWords(newquery);
DotNetMatrix.GeneralMatrix qt = new DotNetMatrix.GeneralMatrix(1, WordList.Count);
for (int i = 0; i < WordList.Count; i++) qt.Array[0][i] = 0;
PorterStemmer oStemmer = new PorterStemmer();
for (int i = 0; i < newqwords.Lenagth; i++) {
newqwords[i] = oStemmer.stemTerm(newqwords[i]);
if (WordList.ContainsKey(newqwords[i])) {
qt.Array[0][(int)WordList[newqwords[i]]] += 1;
} }
double qtmax = 0;
for (int i = 0; i < qt.Array[0].Length; i++) if (qt.Array[0][i] > qtmax) qtmax = qt.Array[0][i];
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
double[] simarray = new double[DocList.Count];
if (qtmax != 0) {
for (int i = 0; i < qt.Array[0].Length; i++) {
qt.Array[0][i] = (qt.Array[0][i] / qtmax);
}
DotNetMatrix.GeneralMatrix qt_uk = qt.Multiply(uk); //
DotNetMatrix.GeneralMatrix q = qt_uk.Multiply(skinv);
for (int l = 0; l < DocList.Count; l++) {
DotNetMatrix.GeneralMatrix d_v = new DotNetMatrix.GeneralMatrix(WordList.Count, 1);
for (int k = 0; k < WordList.Count; k++) {
d_v.Array[k][0] = oWTDM.Array[k][l];
}
DotNetMatrix.GeneralMatrix dt = d_v.Transpose();
DotNetMatrix.GeneralMatrix dt_uk = dt.Multiply(uk);
DotNetMatrix.GeneralMatrix d = dt_uk.Multiply(skinv);
simarray[l] = 0;
simarray[l] = calculate_cosine_sim(q.Array[0], d.Array[0]);
}
} else {
MessageBox.Show("Không tìm thấy!");
}
DataTable oResTable = new DataTable();
DataRow oResDR = null;
oResTable.Columns.Add("filename", typeof(string));
oResTable.Columns.Add("val", typeof(double));
for (int i = 0; i < simarray.Length; i++) {
oResDR = oResTable.NewRow();
oResDR["val"] = (Math.Round(simarray[i],6));
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
oResDR["filename"] = DocList[i].ToString();
oResTable.Rows.Add(oResDR);
}
dataGridView1.DataSource = oResTable;
dataGridView1.Sort(dataGridView1.Columns["val"], ListSortDirection.Descending);
dataGridView1.Columns["val"].HeaderText = "Đánh giá";
dataGridView1.Columns["filename"].HeaderText = "Đường dẫn";
dataGridView1.Columns["val"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns["filename"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView1.RowHeadersVisible = false;
DataGridViewCellStyle oCellStyle = new DataGridViewCellStyle();
oCellStyle.BackColor = Color.AliceBlue;
dataGridView1.AlternatingRowsDefaultCellStyle = oCellStyle;
try {
foreach (DataGridViewRow oRow in dataGridView1.Rows) {
double rank = 0;
double.TryParse(oRow.Cells["val"].Value.ToString(),out rank);
if (rank > 0) {
string filePath =
oRow.Cells["filename"].Value.ToString().Trim();
oRow.Cells["filename"].ToolTipText = ReadShortTextContent(filePath);
oRow.DefaultCellStyle.BackColor = System.Drawing.ColorTranslator.FromHtml("#fbfb37");
} } }
catch { }
}
Dưới đây là kiến trúc mô hình tìm kiếm theo mô hình LSI sử dụng kỹ thuật SVD:
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
Hình 3.1 Kiến trúc mô hình tìm kiếm LSI