[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

116 lượt xem

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ả.

Bình luận Facebook

Để lại bình luận

1 Comment on "[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"

Thông báo khi có
avatar
1000
Sắp xếp theo:   mới nhất | cũ nhất | nhiều bình chọn nhất
trackback

[…] 2017 bởi dammio 155 lượt xem (adsbygoogle = window.adsbygoogle || []).push({}); << Bài trước Trang mục lục Bài tiếp theo […]

wpDiscuz