Thuật toán Tìm Kiếm Từ Khóa BM25 (Okapi BM25) từ Gốc
BM25(D, Q) = ∑q ∈ Q IDF(q) · f(q, D) · (k1 + 1)f(q, D) + k1 · (1 - b + b · |D|avgdl)
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: pandas-data-cleaning-pipeline.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu tại sao BM25 là tiêu chuẩn vàng của tìm kiếm từ khóa (Lexical Search) trong Elasticsearch và Hybrid RAG.
- Công thức tính điểm tương đồng giữa tài liệu D và câu truy vấn Q:
BM25(D, Q) = ∑q ∈ Q IDF(q) · f(q, D) · (k1 + 1)f(q, D) + k1 · (1 - b + b · |D|avgdl) Trong đó:
- f(q, D): Tần suất từ truy vấn q xuất hiện trong tài liệu D.
- |D|: Độ dài (tổng số từ) của tài liệu D.
- avgdl: Độ dài trung bình của toàn bộ tài liệu trong tập dữ liệu.
- k1: Tham số bão hòa tần suất từ (mặc định 1.5).
- b: Tham số phạt độ dài tài liệu (mặc định 0.75).
- Công thức Robertson-Spärck Jones IDF:
IDF(q) = ln(N - n(q) + 0.5n(q) + 0.5 + 1) (với N là tổng số tài liệu, n(q) là số tài liệu chứa từ q).
Yêu cầu
Xây dựng lớp BM25Okapi:
class BM25Okapi:
def __init__(self, corpus: list[list[str]], k1: float = 1.5, b: float = 0.75):
pass
def get_scores(self, query: list[str]) -> list[float]:
pass
def top_k(self, query: list[str], k: int = 3) -> list[tuple[int, float]]:
passcorpus: Danh sách các tài liệu đã được tách từ (tokenized), ví dụ[["apple", "pie"], ["banana", "bread"]].get_scores(query): Trả về danh sách điểm BM25 của tất cả tài liệu đối vớiquery.top_k(query, k): Trả về top k cặp(doc_index, score)có điểm cao nhất giảm dần.
Input
- Lớp
BM25Okapi(corpus,k1,b): Khởi tạo đối tượng với các tham số, trọng số hoặc cấu hình tương ứng.
Output
- Các phương thức của
BM25Okapi: Trả về kết quả tính toán hoặc cập nhật trạng thái nội bộ của đối tượng.
Ràng buộc
- Thời gian chạy tối đa: 2000ms.
- Giới hạn bộ nhớ: 256MB.
- Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
corpus = [['deep', 'learning', 'neural', 'networks'], ['pytorch', 'tensor', 'backpropagation', 'learning'], ['cooking', 'recipes', 'pasta', 'pizza']]
bm25 = BM25Okapi(corpus)
query = ['deep', 'learning']
top_docs = bm25.top_k(query, k=2)Output
[(0, 1.4508328822574619), (1, 0.47000362924573563)]Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Ví dụ 2
Input
corpus = [['artificial', 'intelligence'], ['artificial', 'intelligence', 'and', 'a', 'lot', 'of', 'unrelated', 'filler', 'words', 'in', 'a', 'very', 'long', 'essay']]
bm25 = BM25Okapi(corpus, b=0.75)
scores = bm25.get_scores(['artificial'])Output
[0.27520234987766734, 0.13631518264968567]Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
