Giải Mã Nghệ Thuật Tìm Kiếm: Từ Đếm Từ Khóa Đến BM25 - Bí Mật Đằng Sau Google & Elasticsearch
Lê Lân
0
Làm Thế Nào Để Tính Điểm Phù Hợp Cho Tài Liệu Khi Tìm Kiếm?
Mở Đầu
Làm việc với khối lượng lớn dữ liệu và log là thách thức quen thuộc với các kỹ sư SRE và nhiều người dùng khác. Khi tìm kiếm từ khóa trong hàng tá tài liệu, câu hỏi thường được đặt ra là: tài liệu nào sẽ được ưu tiên trả về đầu tiên?
Việc tìm kiếm tài liệu không chỉ dựa vào sự xuất hiện gần đây, mà quan trọng hơn là mức độ phù hợp của tài liệu đó với từ khóa tìm kiếm. Vậy làm sao xác định được mức độ phù hợp (score) của một tài liệu với truy vấn tìm kiếm? Bài viết này sẽ cùng bạn khám phá cách đánh giá điểm phù hợp tài liệu dựa trên các thuật toán phổ biến trong xử lý ngôn ngữ tự nhiên và tìm kiếm văn bản.
Chúng ta sẽ bắt đầu từ những ý tưởng cơ bản nhất, đi qua các thuật toán đơn giản tới các phương pháp nâng cao như TF-IDF và BM25. Dùng ví dụ cụ thể để bạn dễ dàng theo dõi và áp dụng vào công việc thực tế.
Phần 1: Khái Niệm Cơ Bản và Các Định Nghĩa
Token Là Gì?
Trong xử lý văn bản, từ không được gọi là từ thông thường mà gọi là token. Token có thể là từ, cụm từ, hoặc các đơn vị nhỏ hơn tùy theo mục đích phân tích.
Ví dụ đoạn văn: "Un panda est un animal blanc et noir"
Token: ["Un", "panda", "est", "un", "animal", "blanc", "et", "noir"]
Tất cả các thuật toán về tìm kiếm và tính điểm sẽ dựa trên tập token này.
Index Inversé (Chỉ Mục Đảo Ngược)
Để nhanh chóng tìm tài liệu chứa một token, ta tạo ra một cấu trúc dữ liệu gọi là index inversé. Đây là một từ điển, trong đó:
Khóa: token.
Giá trị: danh sách các tài liệu có chứa token đó.
Ví dụ:
Token
Tài liệu có chứa
"panda"
Doc 1, Doc 4, Doc 5
"noir"
Doc 1, Doc 3, Doc 6
Index inversé giúp tăng tốc độ truy vấn rất nhiều, tránh việc phải duyệt từng tài liệu một.
Lớp Document và Kết Quả Tìm Kiếm
Chúng ta làm việc trên các đối tượng Document có cấu trúc:
publicclassDocument{
publicstring Id { get; set; }
publicstring Name { get; set; }
publicstring Path { get; set; }
publicstring Content { get; set; }
publicint Length { get; set; }
public List<string> ContentTokens { get; set; }
public List<string> TitleTokens { get; set; }
public DateTime IndexedAt { get; set; } = DateTime.UtcNow;
}
Và kết quả tìm kiếm trả về dưới dạng một danh sách SearchResult:
publicclassSearchResult{
publicstring Id { get; set; }
publicstring Name { get; set; }
publicstring Path { get; set; }
publicstring ContentSnippet { get; set; }
publicdouble Score { get; set; }
public DateTime IndexedAt { get; set; }
}
Phần 2: Thuật Toán Đếm Tần Suất Token – Phương Pháp Đơn Giản
Ý tưởng ban đầu
Tính điểm dựa trên số lần từ khóa xuất hiện trong tài liệu. Ví dụ:
Token "noir" xuất hiện 1 lần ở Doc1, 1 lần ở Doc3, 11 lần ở Doc6.
Ta cấp điểm 1 cho mỗi lần xuất hiện:
publicintGetScore(string token, Document doc){
int score = doc.ContentTokens.Count(t => t == token.ToLowerInvariant());
return score;
}
Hạn chế
Một tài liệu chứa nhiều từ khóa trong truy vấn có điểm thấp hơn tài liệu chứa token lặp lại nhiều lần.
Ví dụ: truy vấn "chat", "noir" thì Doc6 có điểm 11 (do "noir" lặp 11 lần) còn Doc3 có 2 (do chứa "chat" và "noir" đúng 1 lần mỗi token), trong khi Doc3 lại phù hợp hơn.
Cải tiến nhẹ: Boost điểm cho tài liệu chứa nhiều token
double denominator = tf + k1 * (1 - b + b * (doc.ContentTokens.Count / avgDocLength));
score += idf * (numerator / denominator);
}
return score;
}
Ưu điểm BM25:
Điều chỉnh phù hợp giữa tần suất token và độ dài tài liệu.
Không ưu tiên quá mức các tài liệu quá dài.
Phù hợp với các hệ thống tìm kiếm hiện đại, như Elasticsearch, Lucene, Solr.
Kết Luận
Việc đánh giá điểm phù hợp tài liệu là nền tảng quan trọng để đưa ra kết quả tìm kiếm chất lượng và đúng mục đích người dùng. Qua bài viết, chúng ta đã đi từ cách tính điểm đơn giản dựa trên tần suất token đến các giải pháp phức tạp như TF-IDF và BM25, với các cải tiến giúp giải quyết các vấn đề như:
Ưu tiên tài liệu có token phù hợp hơn thay vì tài liệu mới nhất
Giới hạn tăng điểm khi token lặp lại nhiều lần
Đưa vào yếu tố hiếm token để tăng tính phân biệt
Điều chỉnh điểm theo độ dài tài liệu để tránh thiên vị
Tùy vào nhu cầu và đặc điểm dữ liệu, bạn có thể áp dụng một hoặc kết hợp nhiều phương pháp để tối ưu hiệu suất tìm kiếm.
Đừng quên rằng các yếu tố khác như tìm kiếm trong tiêu đề, ngày cập nhật hoặc vị trí tài liệu cũng rất quan trọng và có thể được tính thêm vào điểm số cuối cùng để tăng độ chính xác.
Hãy áp dụng ngay hôm nay để nâng cao trải nghiệm tìm kiếm trong hệ thống của bạn!
Tham Khảo
Manning, C. D., Raghavan, P., & Schütze, H. (2008). Introduction to Information Retrieval. Cambridge University Press.
Jarvelin, K., & Kekalainen, J. (2002). Cumulated gain-based evaluation of IR techniques. ACM Transactions on Information Systems.