VietCat commited on
Commit
81cf5ad
·
1 Parent(s): cddf0a4

add data viewer

Browse files
Files changed (1) hide show
  1. app/law_document_chunker.py +54 -48
app/law_document_chunker.py CHANGED
@@ -32,10 +32,11 @@ class LawDocumentChunker:
32
  self.embedding_client = EmbeddingClient()
33
 
34
  # Regex patterns cho các cấp độ cấu trúc - SỬA LẠI ĐỂ CHÍNH XÁC HƠN
35
- self.PHAN_REGEX = r"^(Phần|PHẦN|Phần thứ)\s+(\d+|[IVXLCDM]+|nhất|hai|ba|tư|năm|sáu|bảy|tám|chín|mười)\.?\s*"
36
- self.PHU_LUC_REGEX = r"^(Phụ lục|PHỤ LỤC)\s+(\d+|[A-Z]+)\.?\s*"
37
- self.CHUONG_REGEX = r"^(Chương|CHƯƠNG)\s+(\d+|[IVXLCDM]+)\.?\s*"
38
- self.MUC_REGEX = r"^(Mục|MỤC)\s+\d+\.?\s*"
 
39
  self.DIEU_REGEX = r"^Điều\s+(\d+)\.\s*(.*)"
40
  self.KHOAN_REGEX = r"^\s*(\d+(\.\d+)*)\.\s*(.*)"
41
  self.DIEM_REGEX_A = r"^\s*([a-zđ])\)\s*(.*)"
@@ -80,50 +81,55 @@ class LawDocumentChunker:
80
  """Phát hiện cấp độ cấu trúc của một dòng."""
81
  line = line.strip()
82
 
83
- # Phần
84
- match = re.match(self.PHAN_REGEX, line, re.IGNORECASE)
85
- if match:
86
- return "PHAN", match.group(1), match.group(2)
87
-
88
- # Phụ lục
89
- match = re.match(self.PHU_LUC_REGEX, line, re.IGNORECASE)
90
- if match:
91
- return "PHU_LUC", match.group(1), match.group(2)
92
-
93
- # Chương
94
- match = re.match(self.CHUONG_REGEX, line, re.IGNORECASE)
95
- if match:
96
- return "CHUONG", match.group(1), match.group(2)
97
-
98
- # Mục
99
- match = re.match(self.MUC_REGEX, line, re.IGNORECASE)
100
- if match:
101
- return "MUC", match.group(1), match.group(2)
102
-
103
- # Điều
104
- match = re.match(self.DIEU_REGEX, line)
105
- if match:
106
- return "DIEU", match.group(1), match.group(2)
107
-
108
- # Khoản
109
- match = re.match(self.KHOAN_REGEX, line)
110
- if match:
111
- clause_num = match.group(1)
112
- # Kiểm tra không phải điểm (có từ 3 số trở lên)
113
- if len(clause_num.split('.')) < 3:
114
- return "KHOAN", clause_num, match.group(3)
115
-
116
- # Điểm chữ cái
117
- match = re.match(self.DIEM_REGEX_A, line)
118
- if match:
119
- return "DIEM", match.group(1), match.group(2)
120
-
121
- # Điểm số
122
- match = re.match(self.DIEM_REGEX_NUM, line)
123
- if match:
124
- return "DIEM", match.group(1), match.group(2)
125
-
126
- return "CONTENT", None, None
 
 
 
 
 
127
 
128
  def _create_chunk_metadata(self, content: str, level: str, level_value: Optional[str],
129
  parent_id: Optional[str], vanbanid: int,
 
32
  self.embedding_client = EmbeddingClient()
33
 
34
  # Regex patterns cho các cấp độ cấu trúc - SỬA LẠI ĐỂ CHÍNH XÁC HƠN
35
+ # Đảm bảo mỗi pattern có đúng số group
36
+ self.PHAN_REGEX = r"^(Phần|PHẦN|Phần thứ)\s+(\d+|[IVXLCDM]+|nhất|hai|ba|tư|năm|sáu|bảy|tám|chín|mười)\.?\s*(.*)"
37
+ self.PHU_LUC_REGEX = r"^(Phụ lục|PHỤ LỤC)\s+(\d+|[A-Z]+)\.?\s*(.*)"
38
+ self.CHUONG_REGEX = r"^(Chương|CHƯƠNG)\s+(\d+|[IVXLCDM]+)\.?\s*(.*)"
39
+ self.MUC_REGEX = r"^(Mục|MỤC)\s+(\d+)\.?\s*(.*)"
40
  self.DIEU_REGEX = r"^Điều\s+(\d+)\.\s*(.*)"
41
  self.KHOAN_REGEX = r"^\s*(\d+(\.\d+)*)\.\s*(.*)"
42
  self.DIEM_REGEX_A = r"^\s*([a-zđ])\)\s*(.*)"
 
81
  """Phát hiện cấp độ cấu trúc của một dòng."""
82
  line = line.strip()
83
 
84
+ try:
85
+ # Phần
86
+ match = re.match(self.PHAN_REGEX, line, re.IGNORECASE)
87
+ if match:
88
+ return "PHAN", match.group(1), match.group(2)
89
+
90
+ # Phụ lục
91
+ match = re.match(self.PHU_LUC_REGEX, line, re.IGNORECASE)
92
+ if match:
93
+ return "PHU_LUC", match.group(1), match.group(2)
94
+
95
+ # Chương
96
+ match = re.match(self.CHUONG_REGEX, line, re.IGNORECASE)
97
+ if match:
98
+ return "CHUONG", match.group(1), match.group(2)
99
+
100
+ # Mục
101
+ match = re.match(self.MUC_REGEX, line, re.IGNORECASE)
102
+ if match:
103
+ return "MUC", match.group(1), match.group(2)
104
+
105
+ # Điều
106
+ match = re.match(self.DIEU_REGEX, line)
107
+ if match:
108
+ return "DIEU", match.group(1), match.group(2)
109
+
110
+ # Khoản
111
+ match = re.match(self.KHOAN_REGEX, line)
112
+ if match:
113
+ clause_num = match.group(1)
114
+ # Kiểm tra không phải điểm ( từ 3 số trở lên)
115
+ if len(clause_num.split('.')) < 3:
116
+ return "KHOAN", clause_num, match.group(3)
117
+
118
+ # Điểm chữ cái
119
+ match = re.match(self.DIEM_REGEX_A, line)
120
+ if match:
121
+ return "DIEM", match.group(1), match.group(2)
122
+
123
+ # Điểm số
124
+ match = re.match(self.DIEM_REGEX_NUM, line)
125
+ if match:
126
+ return "DIEM", match.group(1), match.group(2)
127
+
128
+ return "CONTENT", None, None
129
+
130
+ except Exception as e:
131
+ logger.error(f"[CHUNKER] Error in _detect_structure_level for line '{line}': {e}")
132
+ return "CONTENT", None, None
133
 
134
  def _create_chunk_metadata(self, content: str, level: str, level_value: Optional[str],
135
  parent_id: Optional[str], vanbanid: int,