Spaces:
Building
Building
File size: 4,218 Bytes
08b3daf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | import re
from typing import Any, Optional
from .text_utils import get_pages_by_type, normalize_text
FORM_TITLE_PATTERNS = [
r"^ĐƠN\s+(XIN|ĐỀ NGHỊ)",
r"^PHIẾU\s+",
r"^BIÊN BẢN\s+",
r"^BẢNG\s+KẾT QUẢ",
r"^BẢN\s+CAM KẾT",
r"^GIẤY\s+XÁC NHẬN",
r"^CÁC MẪU ĐƠN",
]
def is_new_form_title(line: str) -> bool:
line = line.strip()
upper = line.upper()
if len(upper) > 180:
return False
# Tránh bắt nhầm dòng ghi chú có chữ "đơn xin"
banned_phrases = [
"SINH VIÊN CÓ ĐƠN XIN",
"CÓ ĐƠN XIN KHÔNG",
"ĐƠN XIN KHÔNG ĐÁNH",
]
if any(phrase in upper for phrase in banned_phrases):
return False
return any(re.search(pattern, upper) for pattern in FORM_TITLE_PATTERNS)
def extract_form_title(text: str) -> Optional[str]:
lines = [line.strip() for line in text.splitlines() if line.strip()]
for line in lines:
if is_new_form_title(line):
return line
return None
def extract_required_fields(text: str) -> list[str]:
fields = [
"Họ tên",
"Họ và tên",
"MSSV",
"Mã số sinh viên",
"Lớp",
"Lớp SV",
"Khóa",
"Khoá",
"Khoa",
"Ngành",
"Ngày sinh",
"Ngày tháng năm sinh",
"Số điện thoại",
"Điện thoại",
"Email",
"Địa chỉ email",
"Lý do",
"Lí do",
"Nội dung",
"Thời gian",
"Kính gửi",
"Địa chỉ",
"Hộ khẩu thường trú",
"CMND",
"CCCD",
]
found = []
lower_text = text.lower()
for field in fields:
if field.lower() in lower_text:
found.append(field)
# Chuẩn hóa field trùng nghĩa
normalize_map = {
"Họ và tên": "Họ tên",
"Mã số sinh viên": "MSSV",
"Lớp SV": "Lớp",
"Khoá": "Khóa",
"Ngày tháng năm sinh": "Ngày sinh",
"Điện thoại": "Số điện thoại",
"Địa chỉ email": "Email",
"Lí do": "Lý do",
}
normalized = []
for item in found:
normalized.append(normalize_map.get(item, item))
return sorted(set(normalized))
def should_skip_form_page(text: str, page_number: int) -> bool:
"""
Bỏ trang rỗng hoặc trang không có nội dung thật.
"""
if not text.strip():
return True
if len(text.strip()) < 30:
return True
return False
def extract_form_templates(pages: list[dict[str, Any]]) -> list[dict[str, Any]]:
form_pages = get_pages_by_type(pages, "form_template")
forms = []
current_form = None
for page in form_pages:
page_number = page["page_number"]
text = normalize_text(page.get("text", ""))
if should_skip_form_page(text, page_number):
continue
title = extract_form_title(text)
if title:
if current_form:
forms.append(current_form)
current_form = {
"form_id": f"form_p{page_number}",
"form_name": title,
"content_type": "form_template",
"source_pages": [page_number],
"raw_text": text,
"review_status": "auto_grouped",
}
else:
if current_form:
current_form["source_pages"].append(page_number)
current_form["raw_text"] += "\n\n" + text
else:
current_form = {
"form_id": f"form_p{page_number}",
"form_name": f"Biểu mẫu trang {page_number}",
"content_type": "form_template",
"source_pages": [page_number],
"raw_text": text,
"review_status": "needs_manual_review",
}
if current_form:
forms.append(current_form)
for form in forms:
form["raw_text"] = normalize_text(form["raw_text"])
form["required_fields_detected"] = extract_required_fields(form["raw_text"])
return forms
|