발굴조사 자료(논문/보고서/주변유적) 수집 및 메타데이터 정규화
논문/, 발굴조사보고서/, 주변유적/ 폴더의 모든 문서(PDF, HWP, DOCX, TXT)에서 텍스트와 메타데이터를 추출하여 통합 인덱스를 생성합니다.
논문/ 폴더: 학술 논문 파일들발굴조사보고서/ 폴더: 발굴조사 보고서 파일들주변유적/ 폴더: 주변 유적 관련 자료들# 지원 파일 형식: .pdf, .hwp, .docx, .doc, .txt
# 재귀적으로 모든 하위 폴더 탐색
각 파일에서 다음 정보를 추출:
output/normalized/documents.jsonl (JSONL 형식)
{
"id": "doc_001",
"path": "논문/김철수_2020_청동기취락연구.pdf",
"title": "○○지역 청동기시대 취락 연구",
"author": "김철수",
"year": 2020,
"location": "○○시 △△동",
"coordinates": {"lat": 37.5665, "lon": 126.9780},
"period": ["청동기시대"],
"types": ["주거지", "수혈유구", "무문토기"],
"abstract": "본 연구는...",
"text_sections": [
{"section": "서론", "page": 1, "text": "..."},
{"section": "조사내용", "page": 5, "text": "..."}
],
"tables": [
{"caption": "유구 일람표", "page": 15, "content": "..."}
],
"references": ["이영희(2018)...", "박민수(2019)..."]
}
output/normalized/metadata.csv (스프레드시트용)
id,path,title,author,year,location,lat,lon,period,types,abstract_preview
doc_001,논문/...,○○지역 청동기...,김철수,2020,○○시,37.5665,126.9780,청동기시대,"주거지;수혈유구",본 연구는...
output/normalized/extraction_log.txt (처리 로그)
[2025-11-12 10:00:00] 처리 시작
[2025-11-12 10:00:01] 논문/ 폴더 스캔: 15개 파일 발견
[2025-11-12 10:00:05] doc_001 처리 완료: 논문/김철수_2020.pdf
[2025-11-12 10:00:10] 오류: doc_005 읽기 실패 (암호화된 PDF)
...
[2025-11-12 10:05:00] 처리 완료: 총 42개 파일, 성공 40개, 실패 2개
다음 스킬 호출: similarity-matcher
전달 데이터: output/normalized/metadata.csv, output/normalized/documents.jsonl
import PyPDF2
import pdfplumber # 표 추출에 유용
def extract_pdf_text(file_path):
with pdfplumber.open(file_path) as pdf:
text_sections = []
for page_num, page in enumerate(pdf.pages, 1):
text = page.extract_text()
tables = page.extract_tables()
text_sections.append({
"page": page_num,
"text": text,
"tables": tables
})
return text_sections
import olefile # HWP 파일은 OLE 구조
# 또는 hwp5tools 사용
def extract_hwp_text(file_path):
# HWP는 복잡하므로 hwp5txt 명령줄 도구 활용 권장
import subprocess
result = subprocess.run(['hwp5txt', file_path],
capture_output=True, text=True)
return result.stdout
import re
def extract_metadata(text):
# 연도 추출 (19XX, 20XX)
year_match = re.search(r'(19|20)\d{2}', text)
year = int(year_match.group()) if year_match else None
# 좌표 추출 (N37°34'12" E126°58'30" 형식)
coord_pattern = r'N(\d+)°(\d+)\'(\d+)"\s*E(\d+)°(\d+)\'(\d+)"'
coord_match = re.search(coord_pattern, text)
# 시대 키워드
periods = []
period_keywords = ['청동기', '초기철기', '원삼국', '삼국시대',
'통일신라', '고려', '조선']
for keyword in period_keywords:
if keyword in text:
periods.append(keyword)
return {
'year': year,
'coordinates': parse_coordinates(coord_match) if coord_match else None,
'periods': periods
}
import json
def save_jsonl(data_list, output_path):
with open(output_path, 'w', encoding='utf-8') as f:
for item in data_list:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
Claude에게 다음과 같이 요청하세요:
data-normalizer 스킬을 사용하여 논문/, 발굴조사보고서/, 주변유적/ 폴더의
모든 자료를 수집하고 메타데이터를 추출해주세요.