python-032Đọc toàn bộ đề miễn phí

Xử lý Song song Đếm Tần suất Từ Đa tiến trình theo Map-Reduce

Trong hệ thống NLP xây dựng bộ từ điển tiền huấn luyện mô hình ngôn ngữ lớn tại AI Empire Academy, ta cần đếm tần suất xuất hiện của hàng triệu từ vựng trong văn bản. Để tận dụng t…

PythonNâng cao35 phút

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ủ đề

multiprocessingmap reduceparallel computingcollections

Kiến thức tiên quyết: multiprocessing pool, concurrent futures, counter, gil concepts.

Nội dung đề bài

Mục tiêu kiến thức

  • Vượt qua rào cản Global Interpreter Lock (GIL) của CPython đối với các tác vụ thâm dụng CPU (CPU-bound) bằng đa tiến trình (multiprocessing).
  • Cài đặt mô hình xử lý phân tán Map-Reduce: chia nhỏ dữ liệu (Chunking), phân tán xử lý (Map) và tổng hợp kết quả (Reduce).
  • Đảm bảo tính tương thích đa nền tảng (đặc biệt là cơ chế spawn trên Windows: hàm worker phải ở top-level để serialize được qua pickle).

Mô tả bài toán

Trong hệ thống NLP xây dựng bộ từ điển tiền huấn luyện mô hình ngôn ngữ lớn tại AI Empire Academy, ta cần đếm tần suất xuất hiện của hàng triệu từ vựng trong văn bản. Để tận dụng toàn bộ số nhân CPU, ta áp dụng mô hình Map-Reduce:

  • Hàm Map: map_count_tokens(text_chunk: list[str]) -> dict[str, int]
  • Nhận vào một danh sách các từ/câu văn bản thô.
  • Chuẩn hóa: chuyển toàn bộ về chữ thường (lower()), loại bỏ khoảng trắng thừa ở hai đầu (strip()).
  • Bỏ qua các chuỗi rỗng sau khi strip.
  • Trả về dictionary đếm tần suất xuất hiện của từng từ trong chunk đó.
  • Lưu ý: Hàm này phải nằm ở top-level module để pickle có thể chuyển giao giữa các process trên hệ điều hành Windows.
  • Hàm Điều phối & Reduce: parallel_word_count(chunks: list[list[str]], num_workers: int = 2) -> dict[str, int]
  • Nếu num_workers <= 0, ném ngoại lệ ValueError("num_workers phai lon hon 0").
  • Nếu chunks rỗng, trả về {}.
  • Khởi tạo pool tiến trình với tối đa num_workers tiến trình làm việc.
  • Phân phối từng chunk cho các worker thực thi hàm map_count_tokens.
  • Thu thập các dictionary cục bộ và tổng hợp (Reduce) bằng cách cộng dồn tần suất của các từ giống nhau.
  • Trả về dictionary tổng hợp chứa tần suất của toàn bộ kho ngữ liệu.

Input

  • Các tham số truyền vào hàm/lớp map_count_tokens 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 map_count_tokens hoặc dữ liệu in ra màn hình theo đúng đặc tả.

Ràng buộc

  • Thời gian chạy tối đa: 2000ms.
  • Giới hạn bộ nhớ: 512MB.
  • Không được làm mất hay ghi đè tần suất khi gộp kết quả.

Ví dụ 1

Input

map_count_tokens(chunks=[['AI', 'Empire', 'academy', 'AI'], ['academy', 'python', 'AI', '']], num_workers=2)

Output

{'ai': 3, 'empire': 1, 'academy': 2, 'python': 1}

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.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.