File size: 2,450 Bytes
b655c88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Module chunking: Chia văn bản thành các đoạn nhỏ (chunks) để index vào ChromaDB.
"""

from langchain_text_splitters import RecursiveCharacterTextSplitter
import json
import os


def chunk_documents(documents, chunk_size=800, chunk_overlap=200):
    """
    Chia danh sách tài liệu thành chunks nhỏ.
    
    Args:
        documents: list[dict] — mỗi dict có {"content": ..., "source": ...}
        chunk_size: kích thước mỗi chunk (ký tự)
        chunk_overlap: số ký tự chồng lấp giữa các chunk
    
    Returns:
        list[dict] — danh sách chunks {"content": ..., "metadata": {...}}
    """
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=chunk_size,
        chunk_overlap=chunk_overlap,
        separators=["\n\n", "\n", ". ", ", ", " ", ""],
        length_function=len,
    )

    all_chunks = []

    for doc in documents:
        content = doc.get("content", "")
        source = doc.get("source", "unknown")

        splits = text_splitter.split_text(content)

        for i, split_text in enumerate(splits):
            chunk = {
                "content": split_text.strip(),
                "metadata": {
                    "source": source,
                    "chunk_index": i,
                    "total_chunks": len(splits),
                },
            }
            if len(chunk["content"]) > 50:
                all_chunks.append(chunk)

    print(f"  📦 Đã tạo {len(all_chunks)} chunks từ {len(documents)} tài liệu")
    return all_chunks


def save_chunks(chunks, output_path="data/processed/chunks.json"):
    """Lưu chunks ra file JSON."""
    os.makedirs(os.path.dirname(output_path), exist_ok=True)
    with open(output_path, "w", encoding="utf-8") as f:
        json.dump(chunks, f, ensure_ascii=False, indent=2)
    print(f"  💾 Đã lưu {len(chunks)} chunks vào {output_path}")


if __name__ == "__main__":
    from loader import load_all_documents

    print("BƯỚC 1: Đọc tài liệu PDF")
    docs = load_all_documents()

    print("\nBƯỚC 2: Chia nhỏ tài liệu")
    chunks = chunk_documents(docs)

    print("\nBƯỚC 3: Lưu kết quả")
    save_chunks(chunks)

    print("\nMẪU 3 CHUNKS ĐẦU TIÊN:")
    for i, chunk in enumerate(chunks[:3]):
        print(f"\n--- Chunk {i+1} ---")
        print(f"Nguồn: {chunk['metadata']['source']}")
        print(f"Nội dung: {chunk['content'][:200]}...")