Spaces:
Paused
Paused
| # file: data_processor.py | |
| import json | |
| def process_law_data_to_chunks(structured_data_input): | |
| """ | |
| Xử lý dữ liệu luật từ cấu trúc JSON lồng nhau thành một danh sách phẳng các chunks. | |
| Mỗi chunk chứa text và metadata tương ứng. | |
| """ | |
| flat_list = [] | |
| # Đảm bảo đầu vào là một danh sách các điều luật (articles) | |
| 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 phải là danh sách các Điều luật hoặc một đối tượng Điều luật.") | |
| return flat_list | |
| for article_data in articles_list: | |
| if not isinstance(article_data, dict): | |
| print(f"Cảnh báo: Bỏ qua một mục trong danh sách điều luật vì không phải là dictionary: {article_data}") | |
| 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): | |
| print(f"Cảnh báo: 'clauses' trong điều {article_metadata_base.get('article')} không phải là danh sách. Bỏ qua.") | |
| continue | |
| for clause_data in clauses: | |
| if not isinstance(clause_data, dict): | |
| print(f"Cảnh báo: Bỏ qua một mục trong 'clauses' vì không phải là dictionary: {clause_data}") | |
| 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): | |
| print(f"Cảnh báo: 'points_in_clause' trong khoản {clause_metadata_base.get('clause_number')} của điều {article_metadata_base.get('article')} không phải là danh sách. Bỏ qua.") | |
| continue | |
| if points_in_clause: | |
| for point_data in points_in_clause: | |
| if not isinstance(point_data, dict): | |
| print(f"Cảnh báo: Bỏ qua một mục trong 'points_in_clause' vì không phải là dictionary: {point_data}") | |
| continue | |
| chunk_text = point_data.get("point_text_original") or point_data.get("violation_description_summary") | |
| if not chunk_text: | |
| continue | |
| current_point_metadata = clause_metadata_base.copy() | |
| point_specific_metadata = point_data.copy() | |
| 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({"text": chunk_text, "metadata": final_metadata_cleaned}) | |
| else: | |
| chunk_text = clause_data.get("clause_text_original") | |
| if chunk_text: | |
| current_clause_metadata = clause_metadata_base.copy() | |
| additional_clause_info = {} | |
| for key, value in clause_data.items(): | |
| if key not in ["clause_text_original", "points_in_clause", "clause_number", "clause_metadata_summary"]: | |
| additional_clause_info[key] = value | |
| if additional_clause_info: | |
| 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} | |
| flat_list.append({"text": chunk_text, "metadata": final_metadata_cleaned}) | |
| return flat_list |