Một số kĩ thuật tìm kiếm văn bản theo nội dung

92 28 0
  • Loading ...
1/92 trang

Thông tin tài liệu

Ngày đăng: 12/01/2019, 23:59

ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG ĐỖ TẤT HƯNG MÔT KY THUÂT TIM KIÊM VĂN BAN THEO NÔI DUNG LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH Thái Nguyên - 2015 ĐẠI HỌC THÁI NGUYÊN TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG ĐỖ TẤT HƯNG MÔT KY THUÂT TIM KIÊM VĂN BAN THEO NÔI DUNG Chuyên ngành: Khoa học máy tính Mã số: 60 48 01 LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH NGƯỜI HƯỚNG DẪN KHOA HỌC CHỦ TỊCH HỘI ĐỒNG TS TRƯƠNG HÀ HẢI PGS TS NGÔ QUỐC TẠO Thái Nguyên - 2015 LỜI CAM ĐOAN Em xin cam đoan : Luận văn thac si Khoa học máy tính “Một số kỹ thuật tìm kiếm văn theo nội dung” cơng trình nghiên cứu thực cá nhân em, thực sở nghiên cứu lý thuyết va hướng dẫn khoa học Tiến sĩ Trương Hà Hải, Trường Đại học Công nghệ Thông tin Truyền thông Em xin chiu trach nhiêm vê lơi cam đoan Thái Nguyên, ngày tháng năm 2015 Tác giả Đỗ Tất Hưng LỜI CẢM ƠN Để hoàn thành luận văn, em xin chân thành cảm ơn Trường Đại học Công nghệ Thông tin Truyền thông, Phòng Đào tạo, thầy, giáo giảng dạy lớp cao học Khoa học máy tính K12E quan tâm, tạo điều kiện thuận lợi, tận tình giảng dạy giúp đỡ em thời gian theo học trường Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc đến TS Trương Hà Hải, người dành nhiều thời gian, tâm huyết hướng dẫn em suốt trình nghiên cứu hồn thành luận văn Em xin cảm ơn cán bộ, giảng viên đồng nghiệp Trường Đại học Hùng Vương tạo điều kiện thời gian để em học tập hồn thành luận văn Măc du đa găng hêt sưc hoan thiên luân văn, nhiên luận văn vân nhiều thiếu sót, rât mong sư gop y quy bau q thầy bạn đồng nghiệp! Xin trân trọng cảm ơn! Thái Nguyên, ngày tháng năm 2015 Tác giả Đỗ Tất Hưng MỤC LỤC Trang LỜI CAM ĐOAN iii LỜI CẢM ƠN iv MỤC LỤC v DANH MỤC BẢNG viii DANH MỤC HÌNH VẼ ix MỞ ĐẦU CHƯƠNG I TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU ĐA PHƯƠNG TIỆN 1.1 Cơ sở liệu (CSDL) đa phương tiện 1.1.1 Giơi thiêu 1.1.2 Mục tiêu 1.1.3 Mô hinh dư liêu đa phương tiên 1.1.4 Trích chọn đặc trưng, mục đo tính tương tự 1.1.5 Hệ thống tìm kiếm thông tin (IR) 13 1.1.6 Xếp hạng tài liệu (Ranking) 19 1.2 Bài tốn tìm kiếm văn 23 CHƯƠNG II MỘT SỐ VẤN ĐỀ VỀ TÌM KIẾM VĂN BẢN THEO NỘI DUNG 26 2.1 Mơ hình Boolean 26 2.2 Mơ hình tim kiêm khơng gian vector 27 2.3 Mơ hình tim kiêm theo xác suất 30 2.4 Mơ hình tìm kiếm dựa sở cụm 30 2.5.1 Ý tưởng LSI 33 2.5.2 Một số khái niệm 39 2.5.3 Kỹ thuật phân tích SVD 41 CHƯƠNG III ỨNG DỤNG THỬ NGHIỆM 55 3.1 Bài toán 55 3.2 Chức chương trình thử nghiệm 57 3.3 Hoạt động chương trình 65 3.4 So sánh mô hình tìm kiếm 67 KẾT LUẬN 69 Kết luận 69 Hướng phát triển 69 TÀI LIỆU THAM KHẢO 71 vii DANH MỤC TỪ VIẾT TẮT CSDL Cơ sở liệu IDF Inverse Document Frequency IR Information Retrieval LSI Latent Semantic Indexing MDMS MultiMedia DataBase Manager System MIRS Multimedia Information Retrieval System SVD Singular value decomposition TF Term Frequency DANH MỤC BẢNG Bảng 1.1 Ma trận tài liệu - thuật ngữ 21 Bảng 1.2 Ma trận kết tài liệu - thuật ngữ TF-IDF 22 Bảng 1.3 Kết khoảng cách từ truy vấn Q với tài liệu 23 Bảng 2.1 Số lần xuất thuật ngữ tài liệu 43 DANH MỤC HÌNH VẼ Hình 1.1 Mơ hình liệu đa phương tiện Hình 1.2 Mơ hình xử lý cho hệ thống lập mục 11 Hình 1.3 Mơ hình tổng qt tìm kiêm thơng tin 15 Hình 1.4 Tiến trình truy vấn tài liệu 17 Hình 1.5 Hệ thống IR tiêu biểu 25 Hình 2.1 Sử dụng khái niệm cho truy vấn 34 Hình 2.2 Các vector văn theo mơ hình LSI 39 Hình 2.3 Biểu diễn ma trận xấp xỉ Ak có hạng k 42 Hình 2.4 Biểu đồ 2-D 16 thuật ngữ 17 tài liệu từ tập mẫu 44 Hình 2.5 đồ SVD ma trận hình chữ nhật thuật ngữ- tài liệu 45 Hình 2.6 đồ SVD giảm lược ma trận thuật ngữ-tài liệu 46 Hình 2.7 Đồ thị Recall – Precision thuật toán LSI 54 Hình 3.1 Kiến trúc mơ hình tìm kiếm LSI 65 Hình 3.2 Giao diện cấu hình 66 Hình 3.3 Giao diện tìm kiếm 66 Hình 3.4 Giao diện kết tìm kiếm 67 MỞ ĐẦU Việc tìm kiếm lưu trữ thông tin từ xa xưa người trọng quan tâm Ngày nay, với phát triển nhanh chóng lĩnh vực thơng tin Internet tạo khối lượng thông tin vô lớn với phong phú, đa dạng phức tạp loại hình như: văn bản, hình ảnh, video, siêu văn bản, đa phương tiện…Vấn đề tìm kiếm thơng tin đa phương tiện chuyên gia nghiên cứu việc truy tìm thơng tin phù hợp với yêu cầu người sử dụng Văn số dạng liệu đa phương tiện Nó quan tâm từ hàng nghìn năm trước việc tổ chức, xếp lưu trữ loại hình tài liệu Cho đến nay, tài liệu dạng văn chiếm đa số quan, tổ chức, đặc biệt thư viện Đồng thời, văn sử dụng để mơ tả dạng khác liệu đa phương tiện video, audio, hình ảnh Xuất phát từ nhu cầu thực tế sử dụng, số lượng tài liệu văn dạng số hóa ngày lớn sử dụng phổ biến Vì việc lưu trữ, xử lý truy tìm thủ cơng trước gặp nhiều khó khăn, khơng thể khó thực tìm kiếm được, tìm kiếm hiệu khơng cao Chính vậy, việc tìm kiếm văn theo nội dung có vai trò quan trọng Cùng với đời phát triển máy tính, cơng cụ xử lý ngày hoàn thiện dựa kỹ thuật phục vụ cho nhu cầu Các mơ hình truy tìm thường sử dụng phạm vi này, là: Đối sánh xác, không gian vector, xác suất sở cụm Song, nhược điểm mơ hình truy tìm thơng tin từ mà người tìm kiếm sử dụng, thường khơng giống với từ đánh mục thơng tin tìm kiếm Vấn đề liên quan nhiều đến hai khía cạnh thực tế: Thứ tính đồng nghĩa (synonymy)- thông tin 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 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] = / 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 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 == || 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 liệu từ file index.bin để phục vụ cho 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 văn bản: Với văn Tạo vector dT Tính vector d = dT × Uk × Sk (vector đơn vị) - Tính tốn độ tương đồng câu truy vấn tài liệu Với tài liệu Lấy vector “d”   Tính cosin (q, d) - Hiển thị danh sách kết theo chiều giảm dần 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 { else } } bRead = false; { bRead = false; } if (!bRead) { MessageBox.Show("Chưa tạo 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.Len agth; 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]; 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)); 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 kiến trúc mơ hình tìm kiếm theo mơ hình LSI sử dụng kỹ thuật SVD: Tập văn Câu truy vấn Tạo listwords Tạo Term – Document Matrix A Vector hố Tính SVD(A) Chọn hệ số k Tính A  A = UkSk T V k Xử lý truy vấn Danh sách tập tin Index.bin Xếp hạng kết Hình 3.1 Kiến trúc mơ hình tìm kiếm LSI Với: - listword: Danh sách từ sau loại bỏ từ dừng 3.3 Hoạt động chương trình Giao diện tìm chương trình gồm có chức chính: Cấu hình, mục, tìm kiếm Hình 3.2 Giao diện cấu hình Trước tìm kiếm, người dùng chọn chức cấu hình để lựa chọn thư mục tìm kiếm nhập hệ số k (đã phân tích chương II) Hình 3.3 Giao diện tìm kiếm Sau lựa chọn thư mục tìm kiếm hệ số k, người dùng kích chọn nút Chỉ mục để mục tài liệu Hình 3.4 Giao diện kết tìm kiếm Ở giao diện hiển thị kết quả, văn hiển thị theo chiều tăng dần mức độ liên quan đến câu truy vấn “tơ vàng” với văn có rank >0 3.4 So sánh mơ hình tìm kiếm Do tính hiệu thấp mơ hình Boolean, mơ hình tìm kiếm theo xác suất nên mơ hình tìm kiếm theo khơng gian vector mơ hình LSI nghiên cứu phục vụ cho việc xây dựng hệ thống IR đại Mơ hình LSI đưa để khắc phục hạn chế mô hình khơng gian vector vấn đề đồng nghĩa đa nghĩa từ Hiệu mơ hình LSI đánh giá cao mơ hình khơng gian vector - Về không gian lưu trữ liệu mục: Giả sử, ta phải lưu trữ ma trận A(M  N) với M = 1.000.000, N = 1.000.000, mơ hình khơng gian vector ta phải sử dụng: M  N = 10GB (mỗi giá trị 1byte) Trên sở SVD, lưu trữ ma trận U, S, V thay cho A, với k = 500, ta có khơng gian lưu trữ cần dùng 1000.000  500 + 500 500 + 1.000.000  500 = 505.25 MB Giá trị nhỏ so với 10GB - Về thời gian thực thi thủ tục truy vấn: Trong mơ hình LSI, lượng liệu lưu trữ mục nhiều so với mơ hình khơng gian vector nên việc tính tốn cho thủ tục truy vấn nhanh nhiều KẾT LUẬN Kết luận Kỹ thuật tìm kiếm thơng tin hệ thống sở liệu đa phương tiện vấn đề mang tính thời Công nghệ thông tin Bản luận văn đề cập số vấn đề mang tính chất sở CSDL đa phương tiện số kỹ thuật tìm kiếm văn theo nội dung CSDL đa phương tiện mơ hình Bool sở, mơ hình khơng gian vector, số kỹ thuật nâng cao tìm kiếm như: kỹ thuật tìm kiếm theo xác suất, kỹ thuật phân cụm đặc biệt sâu vào tìm hiểu kỹ thuật mục ngữ nghĩa tiềm ẩn (LSI - Latent Semantic Indexing) Bản luận văn xây dựng chương trình thử nghiệm, demo chức lập mục số kỹ thuật tìm kiếm văn đơn giản Đây sở cho việc tiếp tục xây dựng đánh giá tính hiệu kỹ thuật nâng cao tìm kiếm sau Bên cạnh đó, luận văn số nhược điểm như: Chương trình mơ tả thuật tốn tìm kiếm, chưa mơ tả hồn thiện chương trình tìm kiếm Chưa so sánh chi tiết phương pháp tìm kiếm nêu ra; chưa đánh giá hiệu tìm kiếm phương pháp tập liệu cụ thể Do eo hẹp thời gian hạn chế tài liệu trình độ lập trình yếu nên luận văn chưa thể sâu vào việc xây dựng cài đặt chương trình thử nghiệm áp dụng kỹ thuật nâng cao tìm kiếm văn theo nội dung mong muốn Hướng phát triển Đây đề tài có tính thực tế cao Với nhiệm vụ nghiên cứu, luận văn đáp ứng số yêu cầu đặt ra.Tuy nhiên để áp dụng kỹ thuật nâng cao tìm kiếm vào chương trình ứng dụng cụ thể cho người sử dụng đòi hỏi phải có thêm thời gian nghiên cứu khơng với kỹ thuật tìm kiếmsố kỹ thuật khác liên quan đến việc truy tìm cho đạt hiệu tốt Do hướng phát triển luận văn sau: + Thêm chức tự thu thập tài liệu định tự động cập nhập mục; + Cài đặt chương trình tìm kiếm văn sử dụng kỹ thuật nâng cao; + Phát triển ứng dụng có áp dụng kỹ thuật nâng cao tìm kiếm để cung cấp máy tìm kiếm hiệu cho người sử dụng (cụ thể áp dụng vào hệ thống thư viện số Trường Đại học Hùng Vương) TÀI LIỆU THAM KHẢO Tiếng Việt [1] PGS.TS Đặng Văn Đức (2004-2008), Bài giảng Cơ sở liệu đa phương tiện Tiếng Anh [2] Cherukuri Aswani Kumar, Suripeddi Srinivas (2006) , “Latent Semantic Indexing Using Eigenvalue Analysis for Efficient Information Retrieval”, Int J Appl Math Comput Sci., 2006, Vol 16, No 4, pp 551–558 [3] Edel Garcia (2006), Latent Semantic Indexing (LSI) A Fast Track Tutorial [4] Guojun Lu, Multimedia Database Management Systems, Artech House Boston – London [5] Grossman and Frieder (2004), Information Retrieval, Springer Science & Business Media [6] Jamie Callan (2008), Information Retrieval, Carnegie Mellon University [7] Karl Aberer (2003), Data Mining, Laboratoire de systèmeses d’informations répartis [8] Marcel Worring, Multimedia Information Systems, Lecture Notes, University of Amsterdam [9] Ricardo Baeza, Berthier Ribeiro (1999), Modern Information Retrieval, ACM Press New York Website [10] http://www.anupshinde.com [11] http://www.miislita.com [12] http://vi.wikipedia.org ... truy tìm thông tin dựa sở nội dung tài liệu văn bản, tìm kiếm sở khái niệm (không phải thuật ngữ đơn) Luân văn tập trung nghiên cứu lớp tốn tìm kiếm nội dung văn bản, số kỹ thuật tìm kiếm văn bản, ... có khả lập mục, thực tìm kiếm theo mơ hình boolean Có thể nói DTSearch điển hình tìm kiếm văn theo mơ hình boolean tốt Hệ tìm kiếm văn Lucene: Hệ tìm kiếm văn Lucene hệ tìm kiếm mã nguồn mở Hệ... 1.1.5 Hệ thống tìm kiếm thông tin (IR) 13 1.1.6 Xếp hạng tài liệu (Ranking) 19 1.2 Bài tốn tìm kiếm văn 23 CHƯƠNG II MỘT SỐ VẤN ĐỀ VỀ TÌM KIẾM VĂN BẢN THEO NỘI DUNG
- Xem thêm -

Xem thêm: Một số kĩ thuật tìm kiếm văn bản theo nội dung , Một số kĩ thuật tìm kiếm văn bản theo nội dung

Gợi ý tài liệu liên quan cho bạn

Nhận lời giải ngay chưa đến 10 phút Đăng bài tập ngay