Bộ máy Vector hóa Văn bản TF-IDF & Truy vấn Tương đồng Cosine
Trong các hệ thống Tìm kiếm thông tin (Information Retrieval) và RAG (Retrieval-Augmented Generation) cho AI, việc chuyển đổi tài liệu dạng văn bản tự nhiên thành không gian vector…
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: tokenization, smooth idf, l2 normalization, vector dot product.
Nội dung đề bài
Mục tiêu kiến thức
- Xây dựng hoàn chỉnh thuật toán trích xuất đặc trưng văn bản TF-IDF (Term Frequency - Inverse Document Frequency) từ nguyên lý toán học nền tảng.
- Tự động tách từ (Tokenization) và xây dựng từ điển từ vựng (Vocabulary) có lọc ngưỡng tần suất tài liệu tối thiểu (
min_df). - Áp dụng công thức Smooth IDF: IDF(t) = ln(1 + N1 + DF(t)) + 1.0.
- Chuẩn hóa vector đặc trưng theo chuẩn Euclidean L2 và xếp hạng tài liệu liên quan bằng Cosine Similarity.
Mô tả bài toán
Trong các hệ thống Tìm kiếm thông tin (Information Retrieval) và RAG (Retrieval-Augmented Generation) cho AI, việc chuyển đổi tài liệu dạng văn bản tự nhiên thành không gian vector số học là bước đi tiên quyết.
Hãy xây dựng lớp:
class TfidfSearchEngine:
def __init__(self, min_df: int = 1):
...
def fit(self, corpus: list[str]) -> "TfidfSearchEngine":
...
def transform(self, documents: list[str]) -> np.ndarray:
...
def fit_transform(self, corpus: list[str]) -> np.ndarray:
...
def query(self, query_text: str, top_k: int = 5) -> list[tuple[int, float]]:
...Yêu cầu chi tiết:
- Khởi tạo (
__init__): min_df: số tài liệu tối thiểu chứa từ khóa để từ khóa đó được đưa vào bộ từ vựng (min_df ≥ 1). Nếu min_df < 1, némValueError("min_df must be >= 1").- Học từ vựng & IDF (
fit): - Tách từ: chuyển văn bản về chữ thường (
lower()), dùngre.findall(r'\b\w+\b', text)để lấy danh sách từ. - Tính tần suất xuất hiện trong tài liệu DF(t) (số tài liệu chứa từ t).
- Giữ lại các từ có DF(t) ≥ min_df. Sắp xếp từ vựng theo thứ tự từ điển (Alphabetical).
- Với N là tổng số tài liệu trong
corpus, tính vector IDF:
IDF(t) = ln(1 + N1 + DF(t)) + 1.0
- Lưu trữ ma trận vector hóa của tập
corpusđể phục vụ truy vấn. - Trả về chính đối tượng
self. - Chuyển đổi văn bản sang Vector (
transform): - Nhận vào danh sách
documents: list[str]. - Với mỗi văn bản, tính tần suất thô (Raw Count) của từng từ trong từ điển đã học.
- Nhân với vector IDF tương ứng: vt = TF(t, d) × IDF(t).
- Chuẩn hóa L2 (L2 Normalization): Chia vector cho chuẩn |v|2 = √(∑ vi2). Nếu |v|2 == 0, giữ nguyên vector 0.
- Trả về mảng 2D
np.ndarraykích thước (M, V) với kiểunp.float64. - Truy vấn tài liệu tương đồng (
query): - Chuyển
query_textthành vector đặc trưng bằng hàmtransform([query_text]). - Tính độ tương đồng Cosine giữa query vector và toàn bộ tài liệu trong
corpus(vì cả hai đã được chuẩn hóa L2, Cosine Similarity chính là tích vô hướng: sim(d) = q · d). - Lấy ra
top_ktài liệu có điểm số cao nhất. Nếu có các tài liệu cùng điểm số, ưu tiên chỉ số tài liệu nhỏ hơn. - Trả về danh sách các bộ
[(doc_index, similarity_score), ...]vớisimilarity_scorelàm tròn 4 chữ số thập phân (round(score, 4)).
Input
- Các tham số truyền vào hàm/lớp TfidfSearchEngine hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp TfidfSearchEngine hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Kích thước tập văn bản: 1 ≤ N ≤ 5000.
- Độ dài văn bản: mỗi tài liệu chứa tối đa 104 từ.
- Tuyệt đối không import thư viện
sklearnhayscipy. Chỉ sử dụng Python Standard Library vànumpy.
Ví dụ 1
Input
TfidfSearchEngine(corpus=['the quick brown fox jumps over the lazy dog', 'artificial intelligence and deep learning for computer vision', 'quick brown foxes are wild animals', 'machine learning and natural language processing in ai'], query='quick brown fox', min_df=1, top_k=2)Output
[[0, 0.468], [2, 0.3625]]Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
TfidfSearchEngine(corpus=['python data science machine learning', 'python deep learning neural network', 'python programming basics'], query='python learning', min_df=2, top_k=2)Output
[[0, 1.0], [1, 1.0]]Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo 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.
