chatbot_demo / data_processor.py
deddoggo's picture
Update data_processor.py
77255b4 verified
# 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