Spaces:
Runtime error
Runtime error
# utils/synonym_expander.py | |
import re | |
import logging | |
from typing import Dict, Optional | |
logger = logging.getLogger(__name__) | |
# ============================================================================== | |
# TỪ ĐIỂN ĐỒNG NGHĨA (SYNONYM MAP) | |
# ============================================================================== | |
# Cấu trúc: "thuật ngữ thông tục": "thuật ngữ pháp lý tương ứng" | |
# Key là tiếng thường, value là tiếng pháp lý. | |
# Mỗi lĩnh vực sẽ có một từ điển riêng. | |
# utils/synonym_expander.py | |
LEGAL_SYNONYM_MAP: Dict[str, Dict[str, str]] = { | |
# ========================================================================== | |
# LĨNH VỰC GIAO THÔNG | |
# ========================================================================== | |
"giao_thong": { | |
# Hành vi vi phạm | |
"vượt đèn đỏ": "không chấp hành hiệu lệnh của đèn tín hiệu giao thông", | |
"uống rượu bia lái xe": "điều khiển xe trên đường mà trong máu hoặc hơi thở có nồng độ cồn", | |
"thổi nồng độ cồn": "kiểm tra nồng độ cồn", | |
"chạy quá tốc độ": "điều khiển xe chạy quá tốc độ quy định", | |
"đi ngược chiều": "đi ngược chiều của đường một chiều, đi ngược chiều trên đường có biển “Cấm đi ngược chiều”", | |
"không đội mũ bảo hiểm": "không đội “mũ bảo hiểm cho người đi mô tô, xe máy” hoặc đội “mũ bảo hiểm cho người đi mô tô, xe máy” không cài quai đúng quy cách", | |
"sử dụng điện thoại khi lái xe": "dùng tay sử dụng điện thoại di động khi đang điều khiển xe", | |
"lấn làn": "đi không đúng phần đường hoặc làn đường quy định", | |
"không có bằng lái": "không có Giấy phép lái xe", | |
"không có bảo hiểm xe": "không có Giấy chứng nhận bảo hiểm trách nhiệm dân sự của chủ xe cơ giới", | |
# Đối tượng | |
"xe máy": "xe mô tô, xe gắn máy", | |
"ô tô": "xe ô tô", | |
"xe hơi": "xe ô tô", | |
# Giấy tờ & Thủ tục | |
"bằng lái xe": "giấy phép lái xe", | |
"gplx": "giấy phép lái xe", | |
"đăng kiểm": "kiểm định an toàn kỹ thuật và bảo vệ môi trường", | |
"phạt nguội": "xử phạt vi phạm hành chính được phát hiện thông qua phương tiện, thiết bị kỹ thuật nghiệp vụ", | |
"sang tên xe": "thủ tục đăng ký sang tên xe", | |
}, | |
# ========================================================================== | |
# LĨNH VỰC HÔN NHÂN & GIA ĐÌNH | |
# ========================================================================== | |
"hon_nhan_gia_dinh": { | |
"ly dị": "ly hôn", | |
"ly dị đơn phương": "ly hôn theo yêu cầu của một bên", | |
"ly dị thuận tình": "thuận tình ly hôn", | |
"giành quyền nuôi con": "tranh chấp về quyền trực tiếp nuôi con sau khi ly hôn", | |
"tiền cấp dưỡng": "nghĩa vụ cấp dưỡng", | |
"độ tuổi kết hôn": "điều kiện về độ tuổi kết hôn", | |
"đăng ký kết hôn": "thủ tục đăng ký kết hôn", | |
"tài sản chung": "chế độ tài sản của vợ chồng", | |
"chia tài sản": "chia tài sản chung trong thời kỳ hôn nhân hoặc khi ly hôn", | |
}, | |
# ========================================================================== | |
# LĨNH VỰC ĐẤT ĐAI & NHÀ Ở | |
# ========================================================================== | |
"dat_dai": { | |
"làm sổ đỏ": "thủ tục cấp Giấy chứng nhận quyền sử dụng đất, quyền sở hữu nhà ở và tài sản khác gắn liền với đất", | |
"sổ đỏ": "Giấy chứng nhận quyền sử dụng đất, quyền sở hữu nhà ở và tài sản khác gắn liền với đất", | |
"sổ hồng": "Giấy chứng nhận quyền sử dụng đất, quyền sở hữu nhà ở và tài sản khác gắn liền với đất", | |
"đền bù đất": "bồi thường, hỗ trợ, tái định cư khi Nhà nước thu hồi đất", | |
"thu hồi đất": "trường hợp Nhà nước thu hồi đất", | |
"tranh chấp đất đai": "giải quyết tranh chấp đất đai", | |
"mua bán đất": "chuyển nhượng quyền sử dụng đất", | |
"tách thửa": "thủ tục tách thửa đất", | |
}, | |
# ========================================================================== | |
# LĨNH VỰC LAO ĐỘNG | |
# ========================================================================== | |
"lao_dong": { | |
"hợp đồng lao động": "hợp đồng lao động", | |
"hđlđ": "hợp đồng lao động", | |
"thử việc": "hợp đồng thử việc", | |
"bị đuổi việc": "xử lý kỷ luật sa thải hoặc đơn phương chấm dứt hợp đồng lao động", | |
"đòi lương": "tranh chấp lao động về tiền lương", | |
"bảo hiểm xã hội": "chế độ bảo hiểm xã hội", | |
"bhxh": "bảo hiểm xã hội", | |
"thất nghiệp": "bảo hiểm thất nghiệp", | |
}, | |
# ========================================================================== | |
# LĨNH VỰC HÌNH SỰ | |
# ========================================================================== | |
"hinh_su": { | |
"tự thú": "tự thú, đầu thú", | |
"bị bắt": "bị bắt, tạm giữ, tạm giam", | |
"tại ngoại": "biện pháp ngăn chặn tại ngoại, cấm đi khỏi nơi cư trú", | |
"án treo": "hưởng án treo", | |
"xóa án tích": "điều kiện xóa án tích", | |
}, | |
# ========================================================================== | |
# LĨNH VỰC DOANH NGHIỆP | |
# ========================================================================== | |
"doanh_nghiep": { | |
"mở công ty": "thủ tục thành lập doanh nghiệp", | |
"đăng ký kinh doanh": "đăng ký doanh nghiệp", | |
"giải thể công ty": "thủ tục giải thể doanh nghiệp", | |
"phá sản": "thủ tục phá sản doanh nghiệp", | |
}, | |
# ========================================================================== | |
# THUẬT NGỮ CHUNG (GENERAL) | |
# ========================================================================== | |
"general": { | |
# Câu hỏi về mức phạt | |
"phạt bao nhiêu tiền": "mức xử phạt hành chính là bao nhiêu", | |
"phạt bao nhiêu": "mức xử phạt", | |
"bị phạt gì": "hình thức xử phạt", | |
"mức phạt": "mức xử phạt", | |
# Câu hỏi về thủ tục, giấy tờ | |
"cần giấy tờ gì": "hồ sơ bao gồm những giấy tờ gì", | |
"thủ tục như thế nào": "trình tự, thủ tục thực hiện như thế nào", | |
"làm thế nào": "cách thức thực hiện", | |
"phải làm sao": "quy trình giải quyết như thế nào", | |
"nộp đơn ở đâu": "thẩm quyền giải quyết của cơ quan nào", | |
# Câu hỏi về định nghĩa | |
"là gì": "được định nghĩa như thế nào", | |
"được hiểu là gì": "được hiểu như thế nào", | |
# Câu hỏi về điều kiện, quyền lợi | |
"khi nào thì được": "điều kiện để được", | |
"có được không": "có được phép hay không", | |
"ai được": "đối tượng nào được hưởng", | |
} | |
} | |
# ============================================================================== | |
# HÀM LOGIC ĐỂ VIẾT LẠI CÂU HỎI | |
# ============================================================================== | |
def rewrite_query_with_legal_synonyms(query: str, field: Optional[str] = None) -> str: | |
""" | |
CẢI TIẾN V2: Đảm bảo thay thế hoạt động. | |
""" | |
rewritten_query = query | |
keys_to_check = [] | |
keys_to_check.extend(LEGAL_SYNONYM_MAP.get("general", {}).items()) | |
if field and field in LEGAL_SYNONYM_MAP: | |
keys_to_check.extend(LEGAL_SYNONYM_MAP[field].items()) | |
# Sắp xếp theo độ dài key giảm dần | |
sorted_items = sorted(keys_to_check, key=lambda item: len(item[0]), reverse=True) | |
for colloquial_term, legal_term in sorted_items: | |
# Sử dụng re.sub với cờ IGNORECASE để thay thế không phân biệt hoa thường | |
# `\b` đảm bảo chỉ khớp toàn bộ từ/cụm từ | |
pattern = r'\b' + re.escape(colloquial_term) + r'\b' | |
# re.sub sẽ tự động tìm và thay thế, không cần `re.search` trước | |
new_query, count = re.subn(pattern, legal_term, rewritten_query, flags=re.IGNORECASE) | |
if count > 0: | |
logger.info(f"Query Rewriting: Replaced '{colloquial_term}' with '{legal_term}'") | |
rewritten_query = new_query | |
return rewritten_query |