MicroFish/backend/app/services/text_processor.py

72 lines
2.4 KiB
Python

"""
Dịch vụ xử lý văn bản (Text processing service)
"""
from typing import List, Optional
from ..utils.file_parser import FileParser, split_text_into_chunks
class TextProcessor:
"""Trình xử lý văn bản"""
@staticmethod
def extract_from_files(file_paths: List[str]) -> str:
"""Trích xuất và kết hợp văn bản từ nhiều file (các đường dẫn file truyền vào)"""
return FileParser.extract_from_multiple(file_paths)
@staticmethod
def split_text(
text: str,
chunk_size: int = 500,
overlap: int = 50
) -> List[str]:
"""
Chia nhỏ văn bản (Phân mảnh văn bản dài thành các đoạn nhỏ hơn - chunking)
Args:
text: Văn bản gốc cần chia
chunk_size: Kích thước tối đa của mỗi đoạn (chunk)
overlap: Số ký tự chồng chéo giữa các đoạn liên tiếp (để giữ bối cảnh không bị đứt đoạn)
Returns:
Danh sách gồm các mảng văn bản sau khi chia
"""
return split_text_into_chunks(text, chunk_size, overlap)
@staticmethod
def preprocess_text(text: str) -> str:
"""
Tiền xử lý văn bản (Làm sạch văn bản)
- Xoá bỏ các khoảng trắng thừa
- Chuẩn hoá định dạng xuống dòng (Line breaks)
Args:
text: Văn bản thô ban đầu
Returns:
Văn bản đã được tinh giản, làm sạch
"""
import re
# Chuẩn hoá ký tự xuống dòng (Windows \r\n hoặc Mac cũ \r thành \n chuẩn Linux)
text = text.replace('\r\n', '\n').replace('\r', '\n')
# Xoá các dòng trống liên tiếp (Chỉ giữ lại tối đa 2 lần xuống dòng liên tiếp)
text = re.sub(r'\n{3,}', '\n\n', text)
# 移除行首行尾空白
lines = [line.strip() for line in text.split('\n')]
text = '\n'.join(lines)
return text.strip()
@staticmethod
def get_text_stats(text: str) -> dict:
"""Lấy một số thông tin thống kê về đoạn văn bản (Số ký tự, số dòng, số từ)"""
return {
"total_chars": len(text),
"total_lines": text.count('\n') + 1,
"total_words": len(text.split()),
}