Khi người dùng truy vấn vào chương trình tim kiếm thì xem truy vấn đó là một văn bản, chỉ đơn giản ánh xạ vào cùng không gian vectơ của phép phân tích SVD trước đó và tìm tài liệu trong tập hợp không gian đó sao cho vectơ tài liệu gần với vectơ truy vấn nhất.
Hình 3.3. Ánh xạ truy vấn q vào cùng một không gian vectơ cơ sở dữ liệu Đổ thực hiện việc ánh xạ truy vấn đó chương trình đã thực hiện như sau:
Ị Ị Lớp chuyển truy vấn thành các vectơ ừong cùng một không gian với cơ sở dữ liệu
classmultìplematrỉx {
publicdouble[] Mmaxtrix(double [] qT) // Tham số đàu vào là một bảng tần suất truy vấn đã qua tiền xử lý {
MathNet.Numerics.LinearAlgebra.Generic.Mateix<double> q; double[,] Ưk; double[,] Sk;
int rowUk=0, colUk=0, rowSk=0, colSk=0; //Đọc dữ liệu từ file Uk.txt
using (var sr = newStreamReader(@"D:\DemoLSA\Uk.txt")) {
int chisodau = 0;
for (int i = 0; i<text.Length; i++) {
if (text[i]=- ') colUk++; if (text[i] == 10) rowUk++; }
//Xây dựng mảng 2 chiều Uk để chứa dữ liệu file Uk.txt Uk= newdouble[rowUk,colUk/rowUk]; rowUk=0; colUk=0; for (int i = 0; i < text.Length-1; i++) { if (text[i] == 10) { rowUk++; colUk = 0; chisodau+ +; } if (text[i]=='') {
// Đưa dữ liệu từ file Uk.txt vào m ảng 2 chiều Uk Uk[rowUk, colUk] = double.Parse(text.Substring(chisodau, i - chisodau));
colUk++; chisodau = i + 1; }
}
//Đọc dữ liệu từ file Sk-l.txt
using (var sr = newStreamReader(@"D:\DemoLSA\Sk-l.txt")) {
int chisodau = 0, j = 0; string text = sr.ReadToEnd(); for (int i = 0; i < text.Length; i++)
{
if (text[i]=='') colSk++; if (text[i] == 10) rowSk++; }
//Xây dựng mảng 2 chiều Sk để chứa dữ liệu file Sk-l.txt Sk = newdouble[rowSk, colSk/rowSk]; rowSk = 0; colSk= 0; for (int i = 0; i < text.Length-1; i++)
if (text[i] == 10) { rowSk++; colSk = 0; chisodau++; } if(text[i] ==") { //
Đưa dữ liệu từ file Sk.txt vào mảng 2 chiều Sk Sk[rowSk, colSk] = double.Parse(text.Substring(chisodau, i - chisodau)); colSk++; chisodau = i + l ; } } sr.Close(); }
// Nhân ma ttận vectơ văn bản vào ma trận Uk doublet] result =
newdouble[colUk]; for (int i = 0; i < colUk; i++) for (int j = 0; j < qT.Lengứi; j++) result[i] += qT[j] * Uk[j, i];
// Lấy kết quả ở trên nhân vào ma trận SK doublet] results = newdouble[colSk]; for (int i = 0; i < colSk; i++) for (int j = 0; j < result.Length; j++) resultsfi] += result[j] * Sk[j, i];
// Trả về kết quả vectơ của văn bản tìm kiếm trong cùng một không gian cơ sở dữ liệu return results;
} }