Trong bài này, chúng ta sẽ tìm hiểu 1 ví dụ về cách tìm các câu trong 1 đoạn/tập tin văn bản mà chứa các từ thuộc tập từ vựng cho trước. Google cũng áp dụng 1 phần bài toán này trong các thuật toán tìm kiếm.
Trước hết, chúng ta xem 1 ví dụ đơn giản. Chúng ta có 1 đoạn văn như sau:
A person can love a god or a person. Love can also be a virtue representing human kindness. Here is what we know. Interpersonal love refers to love between human beings. Since the lust and attraction stages are both considered temporary.
Trong đoạn trên, chúng ta có 5 câu, bây giờ chúng ta sẽ tìm những câu có chứa những từ “love” và “human” không phân biệt hoa thường. Nếu dò tìm thủ công chúng ta sẽ tìm được 2 câu đó là:
- Love can also be a virtue representing human kindness
- Interpersonal love refers to love between human beings
Tuy nhiên, nếu dùng LINQ chúng ta phải thực hiện như ví dụ sau. Đầu tiên tách đoạn văn bản thành các câu, ứng với từng câu, loại từ trùng lắp, sau đó so khớp với danh sách từ cho trước. Tiếp đến chạy vòng foreach để in kết quả các câu khớp với danh sách từ cho trước (chứa 2 phần tử là “love” và “human”).
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace LINQ2String { class Program { static void Main(string[] args) { // Đoạn văn bản // Ký hiệu @ dùng định dạng chuỗi ký tự đúng nguyên văn // Ví dụ: @"C:\Dammio\LINQ" giống như "C:\\Dammio\\LINQ" string text = @"A person can love a god or a person. Love can also " + @"be a virtue representing human kindness. Here is what we know. " + @"Interpersonal love refers to love between human beings. " + @"Since the lust and attraction stages are both considered temporary."; // Tách đoạn văn bản thành các câu // Một câu thường kết thúc bằng dấu chấm, chấm hỏi và dấu chấm than. string[] sentences = text.Split(new char[] { '.', '?', '!' }); // Định nghĩa các thuật ngữ tìm kiếm. Danh sách thay đổi tại thời điểm thực thi. string[] wordsToMatch = { "love", "human"}; // Tìm các câu chứa tất cả từ trong mảng wordsToMarch // Chú ý là số lượng từ so khớp không được đặc tả lúc thời gian biên dịch // RemoveEmptyEntries là bỏ nhiều khoảng trắng chỉ xem là 1 khoảng trắng // ToLowerInvariant() cho phép phân biệt hoa, thường var sentenceQuery = from sentence in sentences let w = sentence.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries) where w.Distinct().Select(x=>x.ToLowerInvariant()).Intersect(wordsToMatch.Select(y=>y.ToLowerInvariant())).Count() == wordsToMatch.Count() select sentence; Console.WriteLine("Cac cau co chua tu \"love\" và tu \"human\" la: "); // Thực thi truy vấn foreach (string str in sentenceQuery) { Console.WriteLine(str.Trim()); } // Giữ cửa sổ mở trong chế độ debug Console.WriteLine("Nhan bat ky phim nao de thoat!"); Console.ReadKey(); } } }
Kết luận: Như vậy bài này chỉ ra cho các bạn cách tìm các câu trong 1 đoạn văn bản khớp 1 danh sách từ vựng cho trước. Các bạn hãy tìm cách này để thực hiện việc tìm kiếm cho website của riêng mình nhé, chẳng hạn như tìm kiếm mô tả sản phẩm theo từ khóa cho trước. Giả sử bạn gõ “SamSung S5” thì không tìm thấy mô tả sản phẩm nào, nhưng khi tách thành danh sách từ “SamSung” và “S5” thì có thể bạn sẽ tìm được kết quả.
- APA:
Dammio. (2017). [LINQ và chuỗi] Phần 2: Tìm các câu có chứa 1 tập từ vựng cho trước. https://www.dammio.com/2017/04/12/linq-va-chuoi-phan-2-tim-cac-cau-co-chua-1-tap-tu-vung-cho-truoc.
- BibTeX:
@misc{dammio,
author = {Dammio},
title = {[LINQ và chuỗi] Phần 2: Tìm các câu có chứa 1 tập từ vựng cho trước},
year = {2017},
url = {https://www.dammio.com/2017/04/12/linq-va-chuoi-phan-2-tim-cac-cau-co-chua-1-tap-tu-vung-cho-truoc},
urldate = {2024-11-08}
}