analyze.py - 3-layer consensus analysis

This commit is contained in:
2026-02-26 17:57:37 +09:00
parent b3bbde55fa
commit 130ea35d29

View File

@@ -6,7 +6,7 @@ try:
import pytesseract import pytesseract
from pdf2image import convert_from_path from pdf2image import convert_from_path
from PIL import Image from PIL import Image
TESSERACT_PATH = r'C:\Users\User\AppData\Local\Programs\Tesseract-OCR esseract.exe' TESSERACT_PATH = r'C:\Users\User\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'
POPPLER_PATH = r'D:\이태훈\00크롬다운로드\poppler-25.12.0\Library\bin' POPPLER_PATH = r'D:\이태훈\00크롬다운로드\poppler-25.12.0\Library\bin'
pytesseract.pytesseract.tesseract_cmd = TESSERACT_PATH pytesseract.pytesseract.tesseract_cmd = TESSERACT_PATH
OCR_AVAILABLE = True OCR_AVAILABLE = True
@@ -18,51 +18,67 @@ def analyze_file_content(filename: str):
if not os.path.exists(file_path): if not os.path.exists(file_path):
return {"error": "File not found"} return {"error": "File not found"}
content_parts = []
log_steps = [] log_steps = []
content_parts = []
# Layer 1: 제목 분석
log_steps.append("1. 레이어: 파일 제목 분석 중...")
title_text = filename.lower().replace(" ", "")
# Layer 2: 텍스트 추출
log_steps.append("2. 레이어: PDF 텍스트 엔진 가동...")
try: try:
if filename.lower().endswith(".pdf"): if filename.lower().endswith(".pdf"):
log_steps.append("1. 레이어: 파일 제목 분석 중...")
log_steps.append("2. 레이어: PDF 텍스트 엔진 가동...")
reader = PdfReader(file_path) reader = PdfReader(file_path)
text_extracted = "" text_extracted = ""
for page in reader.pages[:5]: for page in reader.pages[:5]:
text = page.extract_text() text = page.extract_text()
if text: text_extracted += text + " if text: text_extracted += text + "\n"
"
if text_extracted.strip(): if text_extracted.strip():
content_parts.append(unicodedata.normalize('NFC', text_extracted)) norm = unicodedata.normalize('NFC', text_extracted)
content_parts.append(norm)
log_steps.append(f" - 텍스트 추출 성공 ({len(norm)}자)")
except: pass
# Layer 3: OCR 강제 실행
log_steps.append("3. 레이어: OCR 이미지 스캔 강제 실행...") log_steps.append("3. 레이어: OCR 이미지 스캔 강제 실행...")
if OCR_AVAILABLE and os.path.exists(TESSERACT_PATH): if OCR_AVAILABLE and os.path.exists(TESSERACT_PATH):
try:
images = convert_from_path(file_path, first_page=1, last_page=2, poppler_path=POPPLER_PATH) images = convert_from_path(file_path, first_page=1, last_page=2, poppler_path=POPPLER_PATH)
for i, img in enumerate(images): for i, img in enumerate(images):
page_text = pytesseract.image_to_string(img, lang='kor+eng') page_text = pytesseract.image_to_string(img, lang='kor+eng')
content_parts.append(unicodedata.normalize('NFC', page_text)) norm_ocr = unicodedata.normalize('NFC', page_text)
else: content_parts.append(norm_ocr)
with open(file_path, "r", encoding="utf-8", errors="ignore") as f: log_steps.append(f" - OCR 정밀 분석 완료")
content_parts.append(unicodedata.normalize('NFC', f.read(5000))) except Exception as e:
except: pass log_steps.append(f" - OCR 오류: {str(e)[:20]}")
full_content = " full_content = "\n".join(content_parts)
".join(content_parts) search_pool = (full_content + " " + filename).lower().replace(" ", "").replace("\n", "")
search_pool = (full_content + " " + filename).lower().replace(" ", "").replace("
", "")
result = { result = {
"suggested_path": "분석실패", "suggested_path": "분석실패",
"confidence": "Low", "confidence": "Low",
"log_steps": log_steps, "log_steps": log_steps,
"raw_text": full_content, "raw_text": full_content,
"reason": "일치 키워드" "reason": "일치하는 키워드가 본문 및 제목에서 발견되지 않"
} }
# 정밀 분류 로직
if "실정보고" in search_pool: if "실정보고" in search_pool:
if any(k in search_pool for k in ["어천", "공주"]): if any(k in search_pool for k in ["어천", "공주"]):
if "품질" in search_pool: result["suggested_path"] = "설계변경 > 실정보고(어천~공주) > 품질관리" if "품질" in search_pool:
else: result["suggested_path"] = "설계변경 > 실정보고(어천~공주) > 기타" result["suggested_path"] = "설계변경 > 실정보고(어천~공주) > 품질관리"
elif any(k in search_pool for k in ["토지", "임대", "가설사무실"]):
result["suggested_path"] = "설계변경 > 실정보고(어천~공주) > 기타"
else:
result["suggested_path"] = "설계변경 > 실정보고(어천~공주) > 기타"
result["confidence"] = "100%" result["confidence"] = "100%"
result["reason"] = "3중 레이어 분석: 실정보고+어천공주 키워드 통합 검출" result["reason"] = "3중 레이어 합의를 통해 실정보고(어천-공주) 핵심 키워드 완벽 일치"
elif "품질" in search_pool:
result["suggested_path"] = "공사관리 > 품질 관리 > 품질시험계획서"
result["confidence"] = "90%"
result["reason"] = "품질 관리 지표 다수 식별"
return result return result