""" 동의어 처리 모듈 """ import os import sys import re from typing import Dict, List, Optional, Set # 기본 동의어 사전 (MP_synonyms.py 파일이 없을 경우 사용) DEFAULT_SYNONYMS = { "엑츄레이터": "액츄에이터", "액츄에이터": "액츄에이터", "모터": "액츄에이터", "컨박": "컨트롤박스" } class SynonymsHandler: """ 부품명의 동의어를 처리하는 클래스 """ def __init__(self, synonyms_file: Optional[str] = None): """ 동의어 핸들러 초기화 Args: synonyms_file: 동의어 파일 경로 (선택적) """ self.synonyms = {} self.loaded = False # 1. 기본 제공된 파일 경로 확인 if synonyms_file and os.path.exists(synonyms_file): self._load_from_file(synonyms_file) # 2. 일반적인 위치 확인 (.venv/SYNONYMS/MP_synonyms.py) elif os.path.exists(".venv/SYNONYMS/MP_synonyms.py"): self._load_from_file(".venv/SYNONYMS/MP_synonyms.py") # 3. 현재 디렉토리 확인 elif os.path.exists("MP_synonyms.py"): self._load_from_file("MP_synonyms.py") # 4. 기본 동의어 사용 else: print("동의어 파일을 찾을 수 없어 기본 동의어 사전을 사용합니다.") self.synonyms = DEFAULT_SYNONYMS self.loaded = True def _load_from_file(self, file_path: str) -> None: """ 파일에서 동의어 사전 로드 Args: file_path: 동의어 파일 경로 """ try: # 파일 내용 읽기 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # SYNONYMS 딕셔너리 추출 synonyms_match = re.search(r'SYNONYMS\s*=\s*\{(.*?)\}', content, re.DOTALL) if synonyms_match: # 실행하지 않고 변환하는 방법 synonyms_str = "{" + synonyms_match.group(1) + "}" # 정규식을 사용하여 딕셔너리 형태로 파싱 pattern = r'"([^"]*)"\s*:\s*"([^"]*)"' matches = re.findall(pattern, synonyms_str) self.synonyms = {key: value for key, value in matches} self.loaded = True print(f"동의어 사전 로드 완료: {file_path}, {len(self.synonyms)}개 항목") else: print(f"파일에서 SYNONYMS 딕셔너리를 찾을 수 없습니다: {file_path}") self.synonyms = DEFAULT_SYNONYMS self.loaded = True except Exception as e: print(f"동의어 사전 로드 중 오류: {e}") self.synonyms = DEFAULT_SYNONYMS self.loaded = True def find_in_text(self, text: str) -> List[str]: """ 텍스트에서 동의어 찾기 Args: text: 검색할 텍스트 Returns: 찾은 표준화된 부품명 리스트 """ if not text or not self.loaded: return [] # 공백 제거 및 소문자 변환 text = text.lower() found_parts = set() # 동의어 키워드가 텍스트에 포함되어 있는지 확인 for keyword, standard_name in self.synonyms.items(): if keyword.lower() in text: found_parts.add(standard_name) return list(found_parts) def standardize(self, part_name: str) -> str: """ 부품명을 표준화 Args: part_name: 표준화할 부품명 Returns: 표준화된 부품명 """ if not part_name or not self.loaded: return part_name # 소문자 변환하여 비교 part_lower = part_name.lower().strip() # 동의어 사전에서 검색 for keyword, standard_name in self.synonyms.items(): if part_lower == keyword.lower(): return standard_name # 매칭되지 않으면 원래 이름 반환 return part_name def standardize_parts_list(self, parts: List[str]) -> List[str]: """ 부품명 리스트를 표준화 Args: parts: 표준화할 부품명 리스트 Returns: 표준화된 부품명 리스트 """ if not parts or not self.loaded: return parts standardized = set() for part in parts: if part: standardized.add(self.standardize(part)) return list(standardized)