Spaces:
Paused
Paused
# file: data_processor.py | |
import json | |
import re | |
def process_law_data_to_chunks(structured_data_input): | |
flat_list = [] | |
if isinstance(structured_data_input, dict) and "article" in structured_data_input: | |
articles_list = [structured_data_input] | |
elif isinstance(structured_data_input, list): | |
articles_list = structured_data_input | |
else: | |
print("Lỗi: Dữ liệu đầu vào không hợp lệ.") | |
return flat_list | |
for article_data in articles_list: | |
if not isinstance(article_data, dict): | |
continue | |
article_metadata_base = { | |
"source_document": article_data.get("source_document"), | |
"article": article_data.get("article"), | |
"article_title": article_data.get("article_title") | |
} | |
clauses = article_data.get("clauses", []) | |
if not isinstance(clauses, list): | |
continue | |
for clause_data in clauses: | |
if not isinstance(clause_data, dict): | |
continue | |
clause_metadata_base = article_metadata_base.copy() | |
clause_metadata_base.update({ | |
"clause_number": clause_data.get("clause_number"), | |
"clause_metadata_summary": clause_data.get("clause_metadata_summary") | |
}) | |
points_in_clause = clause_data.get("points_in_clause", []) | |
if not isinstance(points_in_clause, list): | |
continue | |
if points_in_clause: | |
for point_data in points_in_clause: | |
if not isinstance(point_data, dict): | |
continue | |
# <<< THAY ĐỔI BẮT ĐẦU: LÀM GIÀU VĂN BẢN >>> | |
# 1. Thu thập các thành phần văn bản để làm giàu | |
article_title = article_metadata_base.get('article_title', '') | |
point_text = point_data.get("point_text_original") or point_data.get("violation_description_summary") | |
# Lấy thông tin tóm tắt của Khoản (thường là mức phạt chung) | |
clause_summary_dict = clause_data.get("clause_metadata_summary", {}) | |
clause_summary_text = "" | |
if clause_summary_dict: | |
# Lấy giá trị từ các key có thể có | |
summary_keys = ["overall_fine_note_for_clause", "overall_points_deduction_note_for_clause"] | |
for key in summary_keys: | |
if key in clause_summary_dict: | |
clause_summary_text = clause_summary_dict[key] | |
break | |
# Nếu không có tóm tắt ở Khoản, thử lấy trực tiếp từ text gốc của Khoản | |
if not clause_summary_text: | |
clause_original_text = clause_data.get("clause_text_original", "") | |
# Chỉ lấy dòng đầu tiên làm tóm tắt (thường là dòng mức phạt) | |
clause_summary_text = clause_original_text.split('\n')[0] | |
# 2. Tạo chuỗi văn bản giàu ngữ cảnh | |
text_parts = [ | |
part.strip() for part in [article_title, clause_summary_text, point_text] if part | |
] | |
# Dùng ": " để nối các phần, giúp phân tách ngữ cảnh | |
enriched_text = ": ".join(text_parts) | |
# <<< THAY ĐỔI KẾT THÚC >>> | |
if not enriched_text: | |
continue | |
current_point_metadata = clause_metadata_base.copy() | |
# Giữ lại toàn bộ thông tin chi tiết trong metadata | |
point_specific_metadata = point_data.copy() | |
# Xóa trường text gốc khỏi metadata để tránh trùng lặp không cần thiết | |
if "point_text_original" in point_specific_metadata: | |
del point_specific_metadata["point_text_original"] | |
current_point_metadata.update(point_specific_metadata) | |
final_metadata_cleaned = {k: v for k, v in current_point_metadata.items() if v is not None} | |
flat_list.append({ | |
# Sử dụng văn bản đã được làm giàu | |
"text": enriched_text, | |
"metadata": final_metadata_cleaned | |
}) | |
else: | |
# Xử lý các Khoản không có Điểm | |
chunk_text = clause_data.get("clause_text_original") | |
if chunk_text: | |
current_clause_metadata = clause_metadata_base.copy() | |
additional_clause_info = {k: v for k, v in clause_data.items() if k not in ["clause_text_original", "points_in_clause", "clause_number", "clause_metadata_summary"]} | |
current_clause_metadata.update(additional_clause_info) | |
final_metadata_cleaned = {k: v for k, v in current_clause_metadata.items() if v is not None} | |
# <<< THAY ĐỔI: Cũng làm giàu văn bản cho các Khoản đứng một mình >>> | |
article_title = article_metadata_base.get('article_title', '') | |
enriched_text = f"{article_title}: {chunk_text}" if article_title else chunk_text | |
flat_list.append({ | |
"text": enriched_text, | |
"metadata": final_metadata_cleaned | |
}) | |
return flat_list |