"Busan Data Guide"의 두 판 사이의 차이
(새 문서: <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>부산 지역 인문학 데이...) |
|||
| 29번째 줄: | 29번째 줄: | ||
} | } | ||
| − | /* Header */ | + | /* Header - PNU DHC 스타일 */ |
header { | header { | ||
| − | background: linear-gradient(135deg, # | + | background: linear-gradient(135deg, #2b5a7a 0%, #3d6b8f 100%); |
color: white; | color: white; | ||
padding: 40px; | padding: 40px; | ||
| 41번째 줄: | 41번째 줄: | ||
margin-bottom: 10px; | margin-bottom: 10px; | ||
font-weight: 700; | font-weight: 700; | ||
| + | color: white; | ||
} | } | ||
| 50번째 줄: | 51번째 줄: | ||
/* Navigation */ | /* Navigation */ | ||
nav { | nav { | ||
| − | background-color: # | + | background-color: #1e4a66; |
padding: 15px 40px; | padding: 15px 40px; | ||
position: sticky; | position: sticky; | ||
| 72번째 줄: | 73번째 줄: | ||
nav a:hover { | nav a:hover { | ||
| − | color: # | + | color: #ff6b35; |
} | } | ||
| 87번째 줄: | 88번째 줄: | ||
h2 { | h2 { | ||
font-size: 2em; | font-size: 2em; | ||
| − | color: # | + | color: #2b5a7a; |
margin-bottom: 20px; | margin-bottom: 20px; | ||
padding-bottom: 10px; | padding-bottom: 10px; | ||
| − | border-bottom: 3px solid # | + | border-bottom: 3px solid #2b5a7a; |
} | } | ||
h3 { | h3 { | ||
font-size: 1.5em; | font-size: 1.5em; | ||
| − | color: # | + | color: #1e4a66; |
margin: 30px 0 15px 0; | margin: 30px 0 15px 0; | ||
} | } | ||
| 109번째 줄: | 110번째 줄: | ||
} | } | ||
| − | /* Info Boxes */ | + | /* Info Boxes - 차분한 색상 */ |
.info-box { | .info-box { | ||
| − | background-color: # | + | background-color: #e8f2f7; |
| − | border-left: 4px solid # | + | border-left: 4px solid #2b5a7a; |
padding: 20px; | padding: 20px; | ||
margin: 20px 0; | margin: 20px 0; | ||
| 119번째 줄: | 120번째 줄: | ||
.warning-box { | .warning-box { | ||
| − | background-color: # | + | background-color: #fff8e6; |
| − | border-left: 4px solid # | + | border-left: 4px solid #ff9f43; |
padding: 20px; | padding: 20px; | ||
margin: 20px 0; | margin: 20px 0; | ||
| 127번째 줄: | 128번째 줄: | ||
.success-box { | .success-box { | ||
| − | background-color: # | + | background-color: #e8f5e9; |
| − | border-left: 4px solid # | + | border-left: 4px solid #4caf50; |
padding: 20px; | padding: 20px; | ||
margin: 20px 0; | margin: 20px 0; | ||
| 135번째 줄: | 136번째 줄: | ||
.tip-box { | .tip-box { | ||
| − | background-color: # | + | background-color: #fff4e6; |
| − | border-left: 4px solid # | + | border-left: 4px solid #ff6b35; |
padding: 20px; | padding: 20px; | ||
margin: 20px 0; | margin: 20px 0; | ||
| 156번째 줄: | 157번째 줄: | ||
th { | th { | ||
| − | background-color: # | + | background-color: #2b5a7a; |
color: white; | color: white; | ||
padding: 12px; | padding: 12px; | ||
| 174번째 줄: | 175번째 줄: | ||
/* Code Blocks */ | /* Code Blocks */ | ||
.code-block { | .code-block { | ||
| − | background-color: # | + | background-color: #2c3e50; |
| − | color: # | + | color: #ecf0f1; |
padding: 20px; | padding: 20px; | ||
border-radius: 5px; | border-radius: 5px; | ||
| 185번째 줄: | 186번째 줄: | ||
.code-inline { | .code-inline { | ||
| − | background-color: # | + | background-color: #e8f2f7; |
padding: 2px 6px; | padding: 2px 6px; | ||
border-radius: 3px; | border-radius: 3px; | ||
font-family: 'Courier New', monospace; | font-family: 'Courier New', monospace; | ||
| − | color: # | + | color: #2b5a7a; |
| + | font-weight: 600; | ||
} | } | ||
/* Example Sections */ | /* Example Sections */ | ||
.example { | .example { | ||
| − | background-color: | + | background-color: white; |
| − | border: 2px solid # | + | border: 2px solid #2b5a7a; |
padding: 20px; | padding: 20px; | ||
border-radius: 8px; | border-radius: 8px; | ||
margin: 20px 0; | margin: 20px 0; | ||
| + | box-shadow: 0 2px 5px rgba(0,0,0,0.08); | ||
} | } | ||
.example h4 { | .example h4 { | ||
| − | color: # | + | color: #ff6b35; |
margin-top: 0; | margin-top: 0; | ||
} | } | ||
| 220번째 줄: | 223번째 줄: | ||
.before { | .before { | ||
| − | background-color: # | + | background-color: #fff5f5; |
| − | border: 2px solid # | + | border: 2px solid #ff6b6b; |
} | } | ||
.after { | .after { | ||
| − | background-color: # | + | background-color: #f0f9f4; |
| − | border: 2px solid # | + | border: 2px solid #51cf66; |
} | } | ||
/* Checklist */ | /* Checklist */ | ||
.checklist { | .checklist { | ||
| − | background-color: # | + | background-color: #fafafa; |
padding: 20px; | padding: 20px; | ||
border-radius: 8px; | border-radius: 8px; | ||
| 248번째 줄: | 251번째 줄: | ||
left: 0; | left: 0; | ||
font-size: 1.2em; | font-size: 1.2em; | ||
| − | color: # | + | color: #2b5a7a; |
} | } | ||
| 254번째 줄: | 257번째 줄: | ||
.spreadsheet-container { | .spreadsheet-container { | ||
margin: 30px 0; | margin: 30px 0; | ||
| − | border: 3px solid # | + | border: 3px solid #2b5a7a; |
border-radius: 8px; | border-radius: 8px; | ||
overflow: hidden; | overflow: hidden; | ||
| 260번째 줄: | 263번째 줄: | ||
.spreadsheet-header { | .spreadsheet-header { | ||
| − | background-color: # | + | background-color: #2b5a7a; |
color: white; | color: white; | ||
padding: 15px; | padding: 15px; | ||
| 271번째 줄: | 274번째 줄: | ||
.spreadsheet-link { | .spreadsheet-link { | ||
background-color: white; | background-color: white; | ||
| − | color: # | + | color: #2b5a7a; |
padding: 8px 16px; | padding: 8px 16px; | ||
border-radius: 5px; | border-radius: 5px; | ||
| 277번째 줄: | 280번째 줄: | ||
font-size: 0.9em; | font-size: 0.9em; | ||
transition: all 0.3s; | transition: all 0.3s; | ||
| + | font-weight: 600; | ||
} | } | ||
| 292번째 줄: | 296번째 줄: | ||
/* Roadmap */ | /* Roadmap */ | ||
.roadmap { | .roadmap { | ||
| − | background: | + | background-color: #f8fafb; |
padding: 30px; | padding: 30px; | ||
border-radius: 10px; | border-radius: 10px; | ||
margin: 30px 0; | margin: 30px 0; | ||
| + | border: 1px solid #e0e0e0; | ||
} | } | ||
| 305번째 줄: | 310번째 줄: | ||
background-color: white; | background-color: white; | ||
border-radius: 8px; | border-radius: 8px; | ||
| − | box-shadow: 0 2px 5px rgba(0,0,0,0. | + | box-shadow: 0 2px 5px rgba(0,0,0,0.08); |
} | } | ||
.roadmap-number { | .roadmap-number { | ||
| − | background-color: # | + | background-color: #2b5a7a; |
color: white; | color: white; | ||
width: 50px; | width: 50px; | ||
| 325번째 줄: | 330번째 줄: | ||
.roadmap-content h3 { | .roadmap-content h3 { | ||
margin-top: 0; | margin-top: 0; | ||
| − | color: # | + | color: #2b5a7a; |
} | } | ||
| 348번째 줄: | 353번째 줄: | ||
.badge-primary { | .badge-primary { | ||
| − | background-color: # | + | background-color: #2b5a7a; |
color: white; | color: white; | ||
} | } | ||
.badge-success { | .badge-success { | ||
| − | background-color: # | + | background-color: #4caf50; |
color: white; | color: white; | ||
} | } | ||
.badge-warning { | .badge-warning { | ||
| − | background-color: # | + | background-color: #ff9f43; |
| − | color: | + | color: white; |
} | } | ||
.badge-danger { | .badge-danger { | ||
| − | background-color: # | + | background-color: #e74c3c; |
color: white; | color: white; | ||
| + | } | ||
| + | |||
| + | /* Fire Emoji Style for emphasis */ | ||
| + | .fire-emoji { | ||
| + | color: #ff6b35; | ||
| + | font-size: 1.2em; | ||
} | } | ||
/* Footer */ | /* Footer */ | ||
footer { | footer { | ||
| − | background-color: # | + | background-color: #1e4a66; |
color: white; | color: white; | ||
padding: 30px; | padding: 30px; | ||
| 421번째 줄: | 432번째 줄: | ||
page-break-inside: avoid; | page-break-inside: avoid; | ||
} | } | ||
| + | } | ||
| + | |||
| + | /* Highlight Important Text */ | ||
| + | strong { | ||
| + | color: #2b5a7a; | ||
| + | } | ||
| + | |||
| + | /* Links */ | ||
| + | a { | ||
| + | color: #2b5a7a; | ||
| + | text-decoration: none; | ||
| + | transition: color 0.3s; | ||
| + | } | ||
| + | |||
| + | a:hover { | ||
| + | color: #ff6b35; | ||
| + | text-decoration: underline; | ||
} | } | ||
</style> | </style> | ||
| 466번째 줄: | 494번째 줄: | ||
<!-- 전체 로드맵 --> | <!-- 전체 로드맵 --> | ||
<section id="roadmap"> | <section id="roadmap"> | ||
| − | <h2> | + | <h2><span class="fire-emoji">🔥</span> 전체 로드맵: 3단계 여정</h2> |
<div class="roadmap"> | <div class="roadmap"> | ||
| 733번째 줄: | 761번째 줄: | ||
<td></td> | <td></td> | ||
</tr> | </tr> | ||
| − | <tr style="background-color: # | + | <tr style="background-color: #fff8e6;"> |
<td>txt_10007</td> | <td>txt_10007</td> | ||
<td>제 나이 열 두살 때 집을 떠나... 게을리 말라'고 하셨습니다.</td> | <td>제 나이 열 두살 때 집을 떠나... 게을리 말라'고 하셨습니다.</td> | ||
| 783번째 줄: | 811번째 줄: | ||
</thead> | </thead> | ||
<tbody> | <tbody> | ||
| − | <tr style="background-color: # | + | <tr style="background-color: #fff5f5;"> |
<td>txt_10013</td> | <td>txt_10013</td> | ||
<td>per_101_002</td> | <td>per_101_002</td> | ||
| 792번째 줄: | 820번째 줄: | ||
<td>원문</td> | <td>원문</td> | ||
</tr> | </tr> | ||
| − | <tr style="background-color: # | + | <tr style="background-color: #f0f9f4;"> |
<td>txt_10014</td> | <td>txt_10014</td> | ||
<td>per_101_002</td> | <td>per_101_002</td> | ||
| 1,170번째 줄: | 1,198번째 줄: | ||
<!-- 주차별 작업 계획 --> | <!-- 주차별 작업 계획 --> | ||
<section id="schedule"> | <section id="schedule"> | ||
| − | <h2>📊 | + | <h2>📊 작업 일정 계획 (2026년 1월~2월)</h2> |
| + | |||
| + | <div class="info-box"> | ||
| + | <strong>📚 전체 분량</strong> | ||
| + | <ul> | ||
| + | <li><strong>『부산을 빛낸 인물』</strong>: 총 800여 페이지</li> | ||
| + | <li><strong>『부산의 자연마을』</strong>: 총 1,200여 페이지</li> | ||
| + | </ul> | ||
| + | <p style="margin-top: 10px;">※ 각 팀원은 담당 권/장을 선정하여 2개월간 데이터 편찬 작업을 진행합니다.</p> | ||
| + | </div> | ||
<div class="table-wrapper"> | <div class="table-wrapper"> | ||
| 1,176번째 줄: | 1,213번째 줄: | ||
<thead> | <thead> | ||
<tr> | <tr> | ||
| − | <th> | + | <th>기간</th> |
<th>목표</th> | <th>목표</th> | ||
<th>세부 과제</th> | <th>세부 과제</th> | ||
| 1,183번째 줄: | 1,220번째 줄: | ||
<tbody> | <tbody> | ||
<tr> | <tr> | ||
| − | <td><strong> | + | <td><strong>1월 1~2주</strong><br>(1/1~1/14)</td> |
| − | <td>기초 | + | <td>작업 준비 및 기초 입력</td> |
<td> | <td> | ||
<div class="checklist"> | <div class="checklist"> | ||
<ul> | <ul> | ||
| − | <li>담당 | + | <li>담당 자료 선정 (권/장 배정)</li> |
| − | <li>PDF 텍스트 추출</li> | + | <li>PDF 텍스트 추출 연습</li> |
| − | <li>일반 텍스트(normal) | + | <li>일반 텍스트(normal) 20~30개 행 입력</li> |
| + | <li>스프레드시트 구조 숙지</li> | ||
</ul> | </ul> | ||
</div> | </div> | ||
| 1,196번째 줄: | 1,234번째 줄: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| − | <td><strong> | + | <td><strong>1월 3~4주</strong><br>(1/15~1/31)</td> |
| − | <td> | + | <td>본격 데이터 입력</td> |
<td> | <td> | ||
<div class="checklist"> | <div class="checklist"> | ||
<ul> | <ul> | ||
| − | <li>인용문(citation) | + | <li>담당 분량의 30% 완료 목표</li> |
| − | <li>person_id 규칙 | + | <li>인용문(citation) 처리 숙달</li> |
| − | <li> | + | <li>person_id 규칙 완전 이해</li> |
| + | <li>1차 중간 점검 및 피드백</li> | ||
</ul> | </ul> | ||
</div> | </div> | ||
| 1,209번째 줄: | 1,248번째 줄: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| − | <td><strong> | + | <td><strong>2월 1~2주</strong><br>(2/1~2/14)</td> |
<td>복잡한 텍스트 처리</td> | <td>복잡한 텍스트 처리</td> | ||
<td> | <td> | ||
<div class="checklist"> | <div class="checklist"> | ||
<ul> | <ul> | ||
| − | <li> | + | <li>담당 분량의 70% 완료 목표</li> |
| − | <li>원문-번역 분리 작업</li> | + | <li>시(poem) 원문-번역 분리 작업</li> |
| − | <li>relation_note 활용</li> | + | <li>relation_note 활용 능숙화</li> |
| + | <li>2차 중간 점검 및 오류 수정</li> | ||
</ul> | </ul> | ||
</div> | </div> | ||
| 1,222번째 줄: | 1,262번째 줄: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| − | <td><strong> | + | <td><strong>2월 3~4주</strong><br>(2/15~2/28)</td> |
| − | <td> | + | <td>완료 및 품질 검수</td> |
<td> | <td> | ||
<div class="checklist"> | <div class="checklist"> | ||
<ul> | <ul> | ||
| + | <li>담당 분량 100% 완료</li> | ||
<li>전체 데이터 통합</li> | <li>전체 데이터 통합</li> | ||
| − | <li> | + | <li>팀원 간 교차 검토</li> |
| − | <li>최종 제출</li> | + | <li>최종 오류 검사 및 제출</li> |
</ul> | </ul> | ||
</div> | </div> | ||
| 1,236번째 줄: | 1,277번째 줄: | ||
</tbody> | </tbody> | ||
</table> | </table> | ||
| + | </div> | ||
| + | |||
| + | <div class="tip-box"> | ||
| + | <strong>💡 작업 진도 관리 팁</strong> | ||
| + | <ul> | ||
| + | <li><strong>일일 목표:</strong> 하루 10~15개 문단 입력 (약 1시간)</li> | ||
| + | <li><strong>주간 목표:</strong> 주 5일 기준 50~75개 문단</li> | ||
| + | <li><strong>정기 모임:</strong> 매주 화요일 오후 2시 진도 점검 및 질의응답</li> | ||
| + | <li><strong>비상 연락:</strong> 팀 슬랙 채널 실시간 지원</li> | ||
| + | </ul> | ||
</div> | </div> | ||
</section> | </section> | ||
| 1,268번째 줄: | 1,319번째 줄: | ||
</div> | </div> | ||
| − | <div style="text-align: center; margin: 40px 0; padding: 30px; background: linear-gradient(135deg, # | + | <div style="text-align: center; margin: 40px 0; padding: 30px; background: linear-gradient(135deg, #2b5a7a 0%, #3d6b8f 100%); color: white; border-radius: 10px;"> |
<p style="font-size: 1.3em; font-weight: 600; margin-bottom: 10px;"> | <p style="font-size: 1.3em; font-weight: 600; margin-bottom: 10px;"> | ||
"한 줄 한 줄이 모여 부산의 역사가 데이터로 살아납니다." | "한 줄 한 줄이 모여 부산의 역사가 데이터로 살아납니다." | ||
| 1,280번째 줄: | 1,331번째 줄: | ||
<footer> | <footer> | ||
| − | <p>© 2025 부산대학교 디지털인문학센터 (Digital Humanities Center | + | <p>© 2025 부산대학교 디지털인문학센터 (PNU Digital Humanities Center)</p> |
<p>부산 지역 인문학 데이터 편찬 프로젝트</p> | <p>부산 지역 인문학 데이터 편찬 프로젝트</p> | ||
<p style="margin-top: 10px; font-size: 0.9em;"> | <p style="margin-top: 10px; font-size: 0.9em;"> | ||
| − | 문의: | + | 문의: dhc@pusan.ac.kr | 최종 업데이트: 2025년 1월 |
</p> | </p> | ||
</footer> | </footer> | ||
2025년 12월 19일 (금) 17:51 판
<!DOCTYPE html>
📚 부산 지역 인문학 데이터 편찬 입문 가이드
『부산을 빛낸 인물』·『부산의 자연마을』 디지털 아카이브 구축
📖 들어가며: 우리가 만들 디지털 지식 창고
안녕하세요! 오늘은 『부산을 빛낸 인물』과 『부산의 자연마을』이라는 소중한 부산의 문화유산을 디지털 데이터로 변환하는 첫걸음을 함께 시작하려고 합니다.
왜 이 작업이 필요할까요?
책장에 꽂혀 있는 책은 한 번에 한 사람만 읽을 수 있지만, 디지털 데이터로 변환된 지식은:
- 💡 검색 가능: "1950년대 부산 영도구"라고 검색하면 관련된 모든 내용이 한눈에!
- 🔗 연결 가능: 인물과 장소, 사건이 서로 연결되어 새로운 통찰 발견
- 📊 분석 가능: 빈도, 패턴, 관계를 통해 보이지 않던 역사적 의미 발견
- 🌐 공유 가능: 전 세계 연구자들과 부산의 이야기를 나눌 수 있어요
🔥 전체 로드맵: 3단계 여정
데이터 편찬 (4-6주)
현재 단계
- PDF → 텍스트 추출
- 구조화 → CSV 정리
- 태깅 → XML 변환
목표: 원천 자료를 DB에 업로드 가능한 형태로 구조화
데이터 분석 (2-3주)
- 빈도 분석 & 키워드 추출
- 관계 파악
- 의미 해석
목표: 구축된 데이터에서 학문적 의미와 패턴 도출
데이터 설계 (2-3주)
- 온톨로지 설계
- 지식 그래프 구상
- 활용 방안 기획
목표: 플랫폼 구축을 위한 데이터 모델링
📊 우리 팀 데이터 구조 이해하기
우리가 사용하는 구글 시트는 18개의 필드(열)로 구성되어 있어요. 각 필드가 왜 필요한지 함께 살펴볼까요?
🔑 핵심 필드 설명
| 필드명 | 예시 | 설명 | 작업자가 할 일 |
|---|---|---|---|
id |
txt_10001 | 텍스트 고유 번호 | 필수 반드시 부여 (중복 금지!) |
book_id |
lightuppeople01 | 책 식별자 | 책마다 고정값 사용 |
book_title |
부산을_빛낸_인물 | 책 제목 | 언더바(_)로 연결 |
sub_title |
20세기_이전_인물편 | 부제목 | 있는 경우만 입력 |
publisher |
부산광역시_문화유산과_시사편찬실 | 발행처 | 책 정보 그대로 |
pub_date |
2004.06 | 출판일 | YYYY.MM 형식 |
chapter |
001 | 장 번호 | 3자리 숫자 (001, 002...) |
page |
005 | 페이지 | 3자리 숫자 (005, 006...) |
person_id |
per_101_001 | 인물 고유 번호 | 필수 새 인물마다 부여 |
name_ko |
최치원 | 인물 한글 이름 | 정확하게 입력 |
name_ch |
崔致遠 | 인물 한자 이름 | 있는 경우만 입력 |
topic |
해운대의_유래 | 소주제 | 섹션 제목 그대로 |
author |
정경주_경성대교수 | 글쓴이 | 이름_소속 형식 |
text_original |
(본문 내용) | 원문 텍스트 | 필수 가장 중요! |
text_type |
normal / citation / poem | 텍스트 유형 | 필수 반드시 구분 |
relation_note |
txt_10008 | 관련 텍스트 ID | 연결된 경우만 |
img_caption |
최치원_영정 | 이미지 설명 | 이미지 있을 때만 |
remark |
번역문 / 원문 | 비고 | 필요시 메모 |
📖 실전 예시로 배우기
사례 1: 일반 텍스트 처리하기
PDF 원문 (5페이지)
스프레드시트 입력 결과
| id | book_title | chapter | page | person_id | name_ko | topic | text_type |
|---|---|---|---|---|---|---|---|
| txt_10001 | 부산을_빛낸_인물 | 001 | 005 | per_101_001 | 최치원 | 해운대의_유래 | normal |
- ✅ id는 연속된 번호: txt_10001, txt_10002, txt_10003...
- ✅ person_id는 새 인물 등장시에만 변경
- ✅ 한 문단 = 한 행: 문단 단위로 나누어 입력
- ✅ text_type은 'normal': 일반 서술 텍스트
사례 2: 인용문(citation) 처리하기
PDF 원문 (6페이지)
스프레드시트 입력 결과
| id | text_original | text_type | relation_note |
|---|---|---|---|
| txt_10006 | (최치원이 쓴 글 중에서) | normal | |
| txt_10007 | 제 나이 열 두살 때 집을 떠나... 게을리 말라'고 하셨습니다. | citation | txt_10006 |
- ✅ text_type을 'citation'으로: 직접 인용문임을 표시
- ✅ relation_note 활용: 앞 문장(txt_10006)과 연결됨을 표시
- ✅ 따옴표 포함: 원문의 인용 부호 그대로 유지
사례 3: 시(poem) 처리하기 - 가장 까다로운 부분!
PDF 원문 (11페이지) - 정서의 시
스프레드시트 입력 결과 - 원문과 번역문을 분리!
| id | person_id | name_ko | text_original | text_type | relation_note | remark |
|---|---|---|---|---|---|---|
| txt_10013 | per_101_002 | 정서 | 狂奔疊石吼重巒 / 人語難分咫尺間 / 常恐是非聲到耳 / 故敎流水盡籠山 | poem | txt_10014 | 원문 |
| txt_10014 | per_101_002 | 정서 | 미친 물 바위 치며 겹겹 산을 뒤흔드니 / 지척 사이에도 사람 소리 모르겠네. / 세상의 시비 소리 들릴까 두려워서 / 짐짓 흐르는 물로 산을 온통 가두었네. | poem | txt_10013 | 번역문 |
- ✅ 한문 원문과 번역문 = 2개 행: 별도로 입력!
- ✅ 연(구절) 구분은 슬래시(/): 狂奔疊石吼重巒 / 人語難分咫尺間
- ✅ relation_note로 연결: 원문과 번역이 서로를 가리킴
- ✅ remark에 명시: '원문' 또는 '번역문'
사례 4: 가사(歌辭) 처리하기
PDF 원문 (19페이지) - <삼진작 三眞勺>
- ✅ 고어도 poem으로 처리: 가사는 시(poem)로 분류
- ✅ remark에 작품명: 가사 제목 명시
- ✅ 특수문자 처리: 깨진 부분은 !! 나 -- 로 표시
🔢 ID 부여 규칙 마스터하기
1. 텍스트 ID (id) 규칙
- 형식:
txt_+ 5자리 숫자 - 시작: 10001부터 시작
- 연속성: 중간에 번호를 건너뛰지 않음
- 고유성: 전체 데이터베이스에서 중복되면 안 됨!
- txt_1 (자릿수 부족)
- txt_100001 (자릿수 초과)
- txt_10001을 두 번 사용 (중복)
- txt_10001
- txt_10002
- txt_10003
2. 인물 ID (person_id) 규칙
- 형식:
per_+ 책번호(3자리) +_+ 인물번호(3자리) - 책번호:
- 101 = 『부산을 빛낸 인물』 권1
- 102 = 『부산을 빛낸 인물』 권2
- 201 = 『부산의 자연마을』 권1
- 인물번호: 책 내에서 등장 순서대로 001부터 부여
실전 예시
| 상황 | person_id | 설명 |
|---|---|---|
| 최치원이 5페이지에서 처음 등장 | per_101_001 |
첫 번째 인물 |
| 정서가 11페이지에서 처음 등장 | per_101_002 |
두 번째 인물 |
| 최치원이 다시 15페이지에 등장 | per_101_001 |
동일 ID 재사용! |
- 📌 인물 등장 순서대로 번호 부여: 페이지 순서가 아니라 등장 순서
- 📌 같은 인물은 같은 ID: 여러 페이지에 등장해도 ID는 하나
- 📌 엑셀 필터 활용: 이미 부여된 인물 ID 확인하기
🛠️ 단계별 작업 프로세스
STEP 1: PDF에서 텍스트 추출
방법 1: Adobe Acrobat (추천)
- PDF 파일 열기
- 편집 → 복사할 텍스트 선택
- 마우스 드래그로 문단 선택
- Ctrl+C (복사)
- 메모장/VS Code에 붙여넣기
방법 2: 온라인 도구
- Smallpdf: https://smallpdf.com/kr/pdf-to-text
- iLovePDF: https://www.ilovepdf.com/ko/pdf_to_text
- 한자가 깨지지 않았나요?
- 줄바꿈이 이상하지 않나요?
- 특수문자(◦, ●, ※)가 제대로 나왔나요?
STEP 2: 텍스트 전처리
해야 할 일
- 문단 나누기: Enter로 문단 구분
- 공백 정리: 불필요한 띄어쓰기 제거
- 페이지 번호 제거: -5-, [5] 같은 표시 삭제
- 각주 처리: 1), 2) 같은 각주 번호 처리
예시: 전처리 전후
STEP 3: 스프레드시트 입력
입력 순서
- 메타데이터 먼저: book_title, publisher, pub_date, chapter
- 페이지 확인: page 필드에 정확한 페이지 입력
- 인물 정보: person_id, name_ko, name_ch 확인
- 본문 입력: text_original에 텍스트 붙여넣기
- 유형 지정: text_type 선택 (normal/citation/poem)
- Ctrl+D: 위 셀 내용 복사 (같은 값 반복 입력시 유용)
- Ctrl+Enter: 셀 내 줄바꿈
- F2: 셀 편집 모드
📝 text_type 판단 가이드
| text_type | 사용 시점 | 예시 키워드 |
|---|---|---|
| normal | 일반 서술 텍스트 | "~이다", "~되었다", "~라고 한다" |
| citation | 직접 인용문 | "~하셨습니다", 따옴표(' " ") 있음 |
| poem | 시, 가사, 한시 | 4행시, 율문, 운문 |
💻 실습 스프레드시트
아래는 우리 팀이 실제로 작업하는 구글 시트입니다. 실시간으로 데이터를 확인하고 입력할 수 있어요.
- 위 임베드 창에서 바로 데이터를 확인할 수 있어요
- 실제 입력은 "새 탭에서 열기" 버튼을 클릭해서 진행하세요
- 여러 사람이 동시에 작업할 수 있어요 (실시간 공동 편집)
- 변경 이력은 자동으로 저장됩니다
✅ 최종 체크리스트
작업 완료 전에 꼭 확인하세요!
- id가 연속되어 있나요? (txt_10001 → txt_10002 → txt_10003)
- person_id가 올바르게 부여되었나요?
- 같은 인물이 여러 곳에 나오면 같은 person_id를 사용했나요?
- text_type이 정확한가요? (normal/citation/poem)
- 시의 원문과 번역문을 분리했나요?
- relation_note로 관련 텍스트를 연결했나요?
- 한자 이름이 있는 경우 name_ch에 입력했나요?
- 띄어쓰기와 문장부호가 원문과 일치하나요?
🔧 자주 발생하는 오류와 해결법
오류 1: ID 중복
❌ 문제: txt_10005가 두 개 있어요!
✅ 해결: 전체 열을 선택 → 데이터 → 중복 항목 삭제
오류 2: person_id 혼동
❌ 문제: 최치원이 등장할 때마다 새 ID를 부여했어요
✅ 해결: 같은 인물은 첫 등장시의 ID를 계속 사용 (per_101_001)
오류 3: 시 처리 실수
❌ 문제: 원문과 번역을 한 행에 넣었어요
✅ 해결: 두 개 행으로 분리하고 relation_note로 연결
오류 4: text_type 오입력
❌ 문제: citation을 citaion으로 오타
✅ 해결: 드롭다운 메뉴 만들기
- 열 선택 → 데이터 → 데이터 확인
- 조건: 목록(항목) → normal, citation, poem
💬 자주 묻는 질문 (Q&A)
Q1. 인물이 명확하지 않은 경우는?
A. person_id를 비워두고, remark에 "인물 미상" 표시
Q2. 여러 인물이 한 문단에 나오면?
A. 주요 인물의 person_id를 사용하고, remark에 "김철수, 이영희 등장" 메모
Q3. 페이지 번호가 불분명하면?
A. 앞뒤 맥락으로 유추하고, remark에 "페이지 추정" 표시
Q4. 작업 중 막힐 때는?
A.
- 팀 슬랙 채널에 질문
- 매주 화요일 오후 2시 정기 모임
- 작업 메뉴얼 재확인
📊 작업 일정 계획 (2026년 1월~2월)
- 『부산을 빛낸 인물』: 총 800여 페이지
- 『부산의 자연마을』: 총 1,200여 페이지
※ 각 팀원은 담당 권/장을 선정하여 2개월간 데이터 편찬 작업을 진행합니다.
| 기간 | 목표 | 세부 과제 |
|---|---|---|
| 1월 1~2주 (1/1~1/14) |
작업 준비 및 기초 입력 |
|
| 1월 3~4주 (1/15~1/31) |
본격 데이터 입력 |
|
| 2월 1~2주 (2/1~2/14) |
복잡한 텍스트 처리 |
|
| 2월 3~4주 (2/15~2/28) |
완료 및 품질 검수 |
|
- 일일 목표: 하루 10~15개 문단 입력 (약 1시간)
- 주간 목표: 주 5일 기준 50~75개 문단
- 정기 모임: 매주 화요일 오후 2시 진도 점검 및 질의응답
- 비상 연락: 팀 슬랙 채널 실시간 지원
🎯 마무리
기억해야 할 핵심 3가지
- 일관성이 생명: 같은 항목은 항상 같은 방식으로
- ID는 신중하게: 한번 부여한 ID는 계속 사용
- 협업이 중요: 막힐 때는 팀원에게 물어보기
다음 교육 예고
- 2주차: XML 태깅과 TEI 표준
- 3주차: Neo4j 그래프 데이터베이스 입문
- 4주차: 데이터 시각화 실습
📎 참고 자료
- 작업 스프레드시트: 구글 시트 바로가기
- TEI 가이드라인: https://tei-c.org/guidelines/
- 광주인문도시스토리플랫폼: 사례 참고
"한 줄 한 줄이 모여 부산의 역사가 데이터로 살아납니다."
작업 중 궁금한 점은 언제든지 팀 슬랙 또는 이메일로 연락주세요!