File size: 4,199 Bytes
d0d9388
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import re
import hashlib
from functools import lru_cache
from config import CACHE_SIZE
from datasets import load_dataset # Chúng ta chỉ cần load_dataset, không cần load_from_disk cho JSONL
import os
from pyvi import ViTokenizer

def load_iwslt_dataset(data_folder="data"): # Đổi tên tham số 'path' thành 'data_folder' để rõ nghĩa hơn
    """Load IWSLT15 dataset from local JSONL files in the specified folder."""
    
    # Lấy đường dẫn đến thư mục chứa script hiện tại (utils.py)
    script_dir = os.path.dirname(os.path.abspath(__file__))
    
    # Kết hợp đường dẫn script với tên thư mục data để có đường dẫn tuyệt đối
    full_data_path = os.path.join(script_dir, data_folder)

    train_file = os.path.join(full_data_path, "train.jsonl")
    validation_file = os.path.join(full_data_path, "validation.jsonl")
    test_file = os.path.join(full_data_path, "test.jsonl")

    # Kiểm tra xem các tệp có tồn tại không
    if not (os.path.exists(train_file) and os.path.exists(validation_file) and os.path.exists(test_file)):
        print(f"Error: Missing one or more data files in '{full_data_path}'.")
        print(f"Expected: {train_file}, {validation_file}, {test_file}")
        print("Please ensure you have run the download script (như hướng dẫn trước) và các file được đặt đúng chỗ.")
        return None, None, None

    # Khai báo các tệp dữ liệu cho Hugging Face datasets loader
    data_files = {
        "train": train_file,
        "validation": validation_file,
        "test": test_file,
    }

    try:
        print(f"Đang tải dataset từ các tệp cục bộ tại: {full_data_path}...")
        # Sử dụng load_dataset với builder "json" để tải các tệp .jsonl
        # Thư viện sẽ tự động phân tích cấu trúc {"translation": {"en": ..., "vi": ...}}
        dataset = load_dataset("json", data_files=data_files)
        print("Dataset đã được tải thành công từ các tệp cục bộ.")

        train_data = dataset["train"]
        val_data = dataset["validation"]
        test_data = dataset["test"]
        
        print(f"Loaded IWSLT15 dataset: {len(train_data)} train, {len(val_data)} val, {len(test_data)} test samples")
        return train_data, val_data, test_data
    except Exception as e:
        print(f"Error loading IWSLT15 dataset from local files: {e}")
        return None, None, None

@lru_cache(maxsize=CACHE_SIZE)
def _preprocess_text_internal(text):
    """Cached version of text preprocessing (only whitespace normalization and lowercasing)"""
    if not text:
        return ""
    text = text.strip()
    text = re.sub(r"\s+", " ", text) # Chuẩn hóa nhiều khoảng trắng thành một
    text = text.lower() # Chuyển về chữ thường
    # Đã loại bỏ: text = re.sub(r'[^\w\s]', '', text) để giữ lại dấu câu
    return text

def preprocess_text(text):
    """Preprocess text with caching (main entry for general text)"""
    return _preprocess_text_internal(text)

def preprocess_pair(en_text, vi_text): # Đã bỏ tham số max_length, sẽ xử lý ở tokenizer
    """Preprocess a pair of English-Vietnamese sentences"""
    if not en_text or not vi_text:
        return "", ""
    
    # Áp dụng ViTokenizer trước khi tiền xử lý chung cho tiếng Việt
    # PyVi thường hoạt động tốt nhất trên văn bản gốc hoặc đã chuẩn hóa cơ bản
    vi_text_tokenized = ViTokenizer.tokenize(vi_text)
    
    # Sau đó áp dụng tiền xử lý chung (chuyển chữ thường, chuẩn hóa khoảng trắng)
    en_text_final = _preprocess_text_internal(en_text)
    vi_text_final = _preprocess_text_internal(vi_text_tokenized)
    
    return en_text_final, vi_text_final

def create_cache_key(text, model_choice, max_length, num_beams):
    """Create hash key for cache"""
    content = f"{text}_{model_choice}_{max_length}_{num_beams}"
    return hashlib.md5(content.encode()).hexdigest()

def clear_preprocessing_cache():
    """Clear the preprocessing cache"""
    _preprocess_text_internal.cache_clear() # Đổi tên hàm