2025 Busan Data Guide Materials

pnu_dhc
이동: 둘러보기, 검색

오리엔테이션 Busan Data Guide

📚 부산 지역 인문학 자료의 디지털화 작업
본 프로젝트는 ‘부산광역시 문화유산과 시사편찬실’에서 발간한 『부산을 빛낸 인물』과 『부산의 자연마을』이라는 부산의 인문 자료를 디지털 데이터로 변환하는 기초 작업입니다.

🔥 전체 로드맵

디지털화 기초 작업 → 현재단계
PDF에서 텍스트를 추출해서 CSV로 정리(구조화), XML 태깅으로 책 속에 어떤 요소들이 있는지 표시(인명, 지명 등)
데이터 분석
빈도분석, 공기어 분석, 토픽모델링 등 → 학문적 의미와 패턴 도출
데이터 모델링
온톨로지라는 ‘데이터 설계도(RDF)’를 만들어서 모든 정보를 ‘지식 그래프’라는 네트워크 형태로 변환하면, 복잡한 내용을 한눈에 볼 수 있고, 관련 내용을 빠르게 검색하는 것이 가능
예시
최치원은 857년에 경주에서 태어났다
최치원(인물), 857년(시간), 경주(장소), 태어남(인물과 장소의 ‘관계’)

지식 그래프(Knowledge Graph)

📚 프로젝트 규모 및 팀 구성

작업 대상 자료: 부산광역시사편찬위원회 자료실 또는 부산 지역사 도서관에서 PDF 다운로드

👥 역할 분담 (총 26명) 및 작업 시트

  • 검수자는 팀원들에게 작업분량을 할당하여 2월까지 작업 검수, 다른 팀에 검수가 끝난 데이터를 전달, 논의가 필요한 부분들을 정리하여 결과보고서 기록
  • 모든 보조연구원은 2개월간 할당 받은 작업의 진행상황을 활동일지에 기록하여 제출(지출 근거)

부산인물팀 : 『부산을 빛낸 인물』 전 3권 (783 페이지)

전공 이름 과정 역할 담당 분량
한문교육전공 박수연 석사과정생 검수 부산을 빛낸 인물 전체
한문학과 황인영 학부생 CSV 390페이지
한문학과 이선영 학부생 CSV 390페이지
한문학과 박하영 석사과정생 XML 전체분량의 1/3
한문학과 김남희 박사과정생 XML 전체분량의 1/3
한문학과 최은 박사과정생 XML 전체분량의 1/3

자연마을(A)팀 : 『부산의 자연마을』 제1, 2, 6권 (1,141 페이지)

전공 이름 과정 역할 담당 분량
국어국문학과 정재환 박사과정생 검수 자연마을 1, 2, 6권 전체
국어국문학과 김수민 학부생 CSV 380페이지
국어국문학과 김주난 학부생 CSV 380페이지
국어국문학과 임승주 학부생 CSV 380페이지
국어국문학과 김민경 석사과정생 XML 전체분량의 1/3
국어국문학과 홍정빈 석사과정생 XML 전체분량의 1/3
사학과 김수인 석사과정생 XML 전체분량의 1/3

자연마을(B)팀 : 『부산의 자연마을』 제3, 4, 5권 (1,131 페이지)

전공 이름 과정 역할 담당 분량
사학과 노수미 석사과정생 검수 자연마을 3, 4, 5권 전체
고고학과 김수영 학부생 CSV 380페이지
고고학과 엄미연 학부생 CSV 380페이지
고고학과 윤채영 학부생 CSV 380페이지
사학과 우지성 석사과정생 XML 전체분량의 1/3
사학과 임혜민 석사과정생 XML 전체분량의 1/3
사학과 조혜원 석사과정생 XML 전체분량의 1/3

전체작업팀 (작업시트 불필요)

전공 이름 과정 담당 분량 역할
고고학과 윤수현 석사과정생 3000페이지 전체(표, 이미지 검수)
고고학과 이다원 학부생 1500페이지 전체 txt
사학과 최나영 학부생 1500페이지 전체 txt
산업공학과 강주연 학부생 txt 전처리 및 XML변환 txt 전처리 및 XML변환
산업공학과 박지현 학부생 txt 전처리 및 XML변환 txt 전처리 및 XML변환
산업공학과 박비원 학부생 txt 전처리 및 XML변환 txt 전처리 및 XML변환
1. 오리엔테이션 및 팀구성
  • 디지털화 과정소개
  • 팀원 담당업무 배정 및 검수자의 역할 안내
2. 텍스트 추출 (pdf to csv) 단락을 최소 단위로
  • 각 팀에 배정된 3권의 도서 PDF에서 텍스트 추출
  • 단락별 정보를 구조화 된 표로 작성하고 ID 부여(txt_id)해서 한 줄의 정보로 엮기
  • 각 도서작업팀은 권별로 CSV 파일을 다운로드 받아 제출
3. 분석용 텍스트 (csv to txt) 컴퓨터가 읽기 쉽게 청소
  • 원본 텍스트 (text_original) 수합 후 책 형태로 배치
  • 분석을 방해하는 불필요한 요소 제거하고 텍스트의 기본 구조 유지
  • 전제작업팀은 원본과 전처리 작업을 거친 txt 파일 제출(2종)
4. 의미 태깅 (txt to xml) 컴퓨터에게 의미를 알려주는 꼬리표(Semantic Tag) 붙이기
  • 인명 지명 등의 핵심 정보에 한글마커
  • 검수 후 전체작업팀에 전달하여 XML 자동 변환
5. 최종 검수 및 결과보고서 제출
  • 최종 데이터의 오류를 교차 검토하고 결과보고서 제출

🎯 단계별 태깅 전략 (난이도별 접근)

1. 인명, 지명(필수)

구분 태깅 예시 설명
인명 <인명>최치원</인명> 사람 이름 (판단 쉬움)
지명 <지명>영도구</지명> 장소, 지역명 (판단 쉬움)

2. 시간, 기관명, 서명

구분 태깅 예시 설명
시간 <시간>1876년</시간> 날짜, 연도, 시대
기관명 <기관명>동래부</기관명> 단체, 조직, 관청
서명 <서명>동래부지</서명> 책, 문헌, 문서자료

3. 문화유산, 주요사건, 작품

구분 태깅 예시 설명
문화유산 <문화유산>동래읍성</문화유산> 유적, 문화재, 건축물
사건명 <사건명>임진왜란</사건명> 역사적 사건, 행사
작품명 <작품명>해운대가</작품명> 시, 그림, 예술작품

🎯 XML 파일로 변환

  • <인명> → <Person>
  • <지명> → <Place>
  • *시트 검색 후 ID 있으면 추가
  • <시간> → <Date>
  • <기관명> → <Organization>
  • <서명> → <Book>
  • <문화유산> → <Heritage>
  • <사건명> → <Event>
  • <작품명> → <Work>

<p id=”txt_10014” corresp=”#txt_10013” xml:lang=”ko”>

이 단락(paragraph)은 id가 txt_10014이고, 앞에 나온 txt_10013과 대응(corresponds)되고, 언어(language)는 한국어(korean)이다.

참고
XML의 개념

태깅하면 무엇이 가능해질까요?

✅ 검색이 정확해집니다
- "해운대와 관련된 인물을 모두 찾아줘" → 모든 <Person> 중에서 <Place>해운대</Place>와 연결된 것만 추출
✅ 관계를 파악할 수 있습니다
- "19세기에 활동한 사람들끼리 네트워크를 그려줘" → <Date> 태그로 시대를 필터링하고 <Person> 간 관계 시각화
✅ 통계 분석이 가능합니다
- "가장 자주 등장하는 지명 Top 10" → <Place> 태그 빈도 계산
✅ 맥락을 유지하며 재조합할 수 있습니다
- 같은 인물에 대한 정보를 여러 곳에서 모아 한 페이지에 표시

작업 상세안내

  • PDF에서 추출한 텍스트를 팀별 작업 시트에 입력 : PNU_DHC 실습용 작업 시트에서 연습 후 팀별 작업 시트로 이동
  • 본문 제1장부터 입력 시작(표지, 범례, 목차, 참고문헌 등은 별도로 정리)
  • 검수자는 누락된 곳이 없는지 살핀 후에 일정 분량 씩 전체 작업팀에 전달, 작업 완료 후에는 권별로 정리된 CSV 파일 제출(파일명: 자연마을01.csv, 부산인물01.csv)
  • 전체작업팀에서 작업시트의 txt_id와 text_original을 TXT 파일로 모으기 (Notepad++, VScode 등에서 작업)
  • 권별로 작업(파일명: 자연마을01_원본.txt, 부산인물01_원본.txt)
  • 전체작업팀의 검수자가 표 및 이미지 등이 누락된 부분 없는지 확인
  • 분석에 필요한 파일로 만들기: 정규표현식으로 전처리 후 권별로 제출(파일명: 자연마을01_정제.txt, 부산인물01_정제.txt)
  • 정제된 txt 파일에 XML을 위한 마커 작업: <인명>, <지명> 등의 한글 표기
  • 마커 검수 후 전체작업팀에 전달, 전체작업팀에서 마커 작업한 TXT파일을 XML로 변환
  • 작업 완료 후에는 권별로 정리된 XML 파일 제출(파일명: 자연마을01.xml, 부산인물01.xml)

🏷️ TXT 전처리: 분석이 가능한 텍스트로 정제하기

CSV로 정리한 텍스트 중에서 불필요한 중복언어나 기호들을 제거하는 일입니다. 텍스트의 기본 구조를 유지하되, 페이지나 이미지 같은 부가적인 정보는 제거하고 이 정보를 그대로 불러올 수 있는 txt_id와 text_original 컬럼으로만 구성합니다.

🎯 왜 txt_id가 필요한가요?

페이지나 챕터, 한자로 병기한 정보등을 모두 포함하는 경우

제1장 개관
1. 부산의 자연마을
1) 현대 도시에서의 자연마을
부근에 있는 영가대(永嘉臺, 현재 범일동 성남초등학교 옆 철로변 일대) 아래의 선창에서는 일본으로 가는 사절의 배가 출항하였다.
→ 분석을 돌렸을 때 불필요한 정보들이 포함되어 정확한 의미를 찾아내기 어려움
txt_id가 있을 경우

나중에 조각조각으로 텍스트가 쪼개져도 각 단락은 출처 정보를 갖고 있어야 함

<p xml:id="txt_10001">부근에 있는 영가대 아래의 선창에서는 일본으로 가는 사절의 배가 출항하였다.</p>
→ 나중에 XML 파일과 CSV 파일이 같은 폴더 안에 있으면 컴퓨터는 txt_id를 찾아서 참고할 수 있음

🏷️ XML 태깅: 데이터에 의미 부여하기

CSV로 정리한 텍스트에 의미론적 태그(Semantic Tags)를 붙여서 컴퓨터가 "누가", "어디서", "언제" 같은 정보를 이해할 수 있게 만드는 작업입니다.

🎯 왜 XML 태깅이 필요한가요?
태깅 전 (일반 텍스트)
최치원은 857년에 경주에서 태어났다. → 컴퓨터는 그냥 의미 없는 글자로만 인식
태깅 후 (XML)
<Person xml:id="per_10001">최치원</Person>은
<Date when="857">헌안왕 원년</Date>에
<Place xml:id="plc_10001">경주</Place>에서 태어났다.
→ 인물, 시간, 장소를 구분해서 인식!

📊 데이터 구조 이해하기

🔑 핵심 필드 설명

필드명 예시 설명 작업자가 할 일
id txt_10001 단락별 정보를 하나로 묶는 고유 번호 필수 반드시 부여 (중복 금지!)
book_id lightuppeople01 책 식별자(부산지역사도서관 PDF 파일명을 따름) 책마다 고정값 사용
book_title 부산을_빛낸_인물 책 제목 언더바(_)로 연결
subTitle 20세기_이전_인물편 부제목 있는 경우만 입력
publisher 부산광역시_문화유산과_시사편찬실 발행처(필수표기) 책 정보 그대로
pub_date 2004.06 출판일 YYYY.MM 형식
chapter 001 장 번호 3자리 숫자 (001, 002...)
ch_name 최치원 장 제목 정확하게 입력
subChapter 崔致遠 장 제목(한자나 영어) 있는 경우만 입력
person_id per_10001 인물 고유 번호 필수 새 인물마다 부여
place_id plc_10001 지명 고유 번호 필수 새 지명마다 부여
topic 해운대의_유래 소주제 섹션 제목 그대로
page 005 페이지 3자리 숫자 (005, 006...)
author 정경주_경성대교수 집필자(필수표기) 이름_소속 형식
text_original 단락별로 붙여넣기 원문 텍스트 줄바꿈 → 한 줄로 중요!
text_type normal/citation 텍스트 유형 구분 추후 인용문만 별도로 추출 가능
relation_note txt_10008 관련 텍스트 ID 단락이 연결되는 경우에만 기입
img_caption 최치원_영정 이미지 설명 이미지 있을 때만
remark 번역문 / 원문 표시 등 논의가 필요하면 자유롭게 기술, 띄어쓰기에 언더바 불필요 필수 2월27일까지 결과보고서 제출

인용문 처리하기

  • text_type은 'normal': 일반 서술 텍스트, 'citation': 직접 인용문임을 표시
  • relation_note 활용: 앞 문장(txt_10006)과 연결됨을 표시

부산을 빛낸 인물 PDF 원문 (6페이지) 스프레드시트 입력 결과

id text_original text_type relation_note
txt_10006 최치원은 857년(헌안왕 원년)에 신라의 서울 경주에서 태어났다 normal
txt_10007 제 나이 열 두살 때 집을 떠나 서쪽으로 갔습니다.(도서 원본에서는 볼드체로 표시) citation txt_10006

운문(verse) 처리하기

부산을 빛낸 인물 PDF 원문 (11페이지) (relation_note: txt_10014 원문 / txt_10013 번역문)

狂奔疊石吼重巒 / 人語難分咫尺間 / 常恐是非聲到耳 / 故敎流水盡籠山
미친 물 바위 치며 겹겹 산을 뒤흔드니 / 지척 사이에도 사람 소리 모르겠네. / 세상의 시비 소리 들릴까 두려워서 / 짐짓 흐르는 물로 산을 온통 가두었네.
  • 운문에 /를 표시하는 이유: XML로 변환했을 때 각 line을 <lg> line group으로 묶어서 하나의 연임을 표현
<p xml:id=”txt_10013” xml:lang=”cn”> <lg> <l>狂奔疊石吼重巒 </l> <l>人語難分咫尺間</l> <l>常恐是非聲到耳</l> <l>故敎流水盡籠山</l> <lg></p><p id=”txt_10014” corresp=”#txt_10013” xml:lang=”ko”> <lg> <l>미친 물 바위 치며 겹겹 산을 뒤흔드니 </l> <l>지척 사이에도 사람 소리 모르겠네. </l> <l>세상의 시비 소리 들릴까 두려워서 </l> <l>짐짓 흐르는 물로 산을 온통 가두었네.</l> <lg></p>

🎯 마무리

  1. 작업 순서: PDF (원본)→ CSV (구조화)→ TXT (정제)→ XML(의미 부여) = DB에 업로드 될 최종 데이터
  2. 핵심은 ID 부여와 태그 달기
  3. 완벽보다는 일관성이 중요
  4. 모를 땐 검수자와 소통

txt2xml 자동 변환 스크립트

TXT/LST 파일 XML 변환 스크립트 작업 안내서

본 문서는 PDF 텍스트 추출 및 태깅 작업의 최종 단계인 '한글 마커가 삽입된 TXT 파일'을 '분석용 XML 파일'로 자동 변환하는 Python 스크립트의 사용 방법과 변환 결과를 안내합니다.

1. 스크립트 개요

텍스트 파일(LST 파일) 내에 지정된 한글 마커(<인명>, <지명> 등)를 XML 태그(<Person>, <Place> 등)로 일괄 변환하고, 텍스트의 구조를 XML 형식에 맞게 구성합니다.

작업 파일 종류 확장자 주요 내용
원본 파일 (입력) *.lst 한글 마커(<인명>, <지명> 등)가 적용된 텍스트
변환 파일 (출력) *.xml XML 태그(<Person>, <Place> 등)로 변환된 데이터

2. Python 변환 스크립트 (txt2xml.py)

다음은 한글 마커를 XML 태그로 변환하는 Python 스크립트의 예시입니다. 전체작업팀의 강주연, 박지현, 박비원 보조연구원이 이 작업을 담당하게 됩니다.

import re

# 한글 마커와 XML 태그 매핑 정의
tag_mapping = {
    "<인명>": "<Person>",
    "</인명>": "</Person>",
    "<지명>": "<Place>",
    "</지명>": "</Place>",
    "<시간>": "<Date>",
    "</시간>": "</Date>",
    "<기관명>": "<Organization>",
    "</기관명>": "</Organization>",
    "<서명>": "<Book>",
    "</서명>": "</Book>",
    "<문화유산>": "<Heritage>",
    "</문화유산>": "</Heritage>",
    "<사건명>": "<Event>",
    "</사건명>": "</Event>",
    "<작품명>": "<Work>",
    "</작품명>": "</Work>",
}

def convert_txt_to_xml(input_filepath, output_filepath):
    """
    LST 파일의 한글 마커를 XML 태그로 변환하고 XML 구조를 구성합니다.
    """
    try:
        with open(input_filepath, 'r', encoding='utf-8') as f:
            content = f.read()

        # 1. 한글 마커를 XML 태그로 치환
        for ko_tag, xml_tag in tag_mapping.items():
            content = content.replace(ko_tag, xml_tag)

        # 2. 텍스트를 단락별로 분리
        # 이 예시에서는 줄바꿈(\n)을 단락의 구분자로 가정합니다.
        paragraphs = content.strip().split('\n')

        xml_output = []
        xml_output.append('<?xml version="1.0" encoding="UTF-8"?>')
        xml_output.append('<Document>')

        txt_id_counter = 10000

        for paragraph in paragraphs:
            if paragraph.strip():
                # txt_id를 부여하여 <p> 태그로 감싸기
                txt_id_counter += 1
                p_tag = f'<p xml:id="txt_{txt_id_counter}" xml:lang="ko">{paragraph.strip()}</p>'
                xml_output.append(p_tag)

        xml_output.append('</Document>')

        # XML 파일로 저장
        with open(output_filepath, 'w', encoding='utf-8') as f:
            f.write('\n'.join(xml_output))

        return True

    except Exception as e:
        print(f"변환 중 오류 발생: {e}")
        return False

# 예시 파일 실행
# 파일명: 자연마을01_태깅완료.lst -> 자연마을01.xml
input_file = "자연마을01_태깅완료.lst"
output_file = "자연마을01.xml"

# 실제 파일은 전체작업팀에 전달된 txt2xml 자동 변환 스크립트를 사용합니다.
# convert_txt_to_xml(input_file, output_file)

3. 파일 변환 예시

원본 LST 파일 (자연마을01_태깅완료.lst)

이 파일은 각 팀의 XML 담당자가 한글 마커를 삽입하고 검수가 완료된 파일입니다. <인명>최치원</인명>은 857년에 신라의 서울 <지명>경주</지명>에서 태어났다. <작품명>해운대가</작품명>는 <인명>최치원</인명>이 지은 시조이다. <기관명>동래부</기관명>에서 발행한 <서명>동래부지</서명>에는 <문화유산>동래읍성</문화유산>에 대한 기록이 있다.

변환 후 XML 파일 (자연마을01.xml)

Python 스크립트를 실행하여 변환된 최종 결과물입니다.

<?xml version="1.0" encoding="UTF-8"?>
<Document>
<p xml:id="txt_10001" xml:lang="ko"><Person>최치원</Person>은 857년에 신라의 서울 <Place>경주</Place>에서 태어났다.</p>
<p xml:id="txt_10002" xml:lang="ko"><Work>해운대가</Work><Person>최치원</Person>이 지은 시조이다.</p>
<p xml:id="txt_10003" xml:lang="ko"><Organization>동래부</Organization>에서 발행한 <Book>동래부지</Book>에는 <Heritage>동래읍성</Heritage>에 대한 기록이 있다.</p>
</Document>

4. 변환 내용 상세 설명

다음 표는 LST 파일이 XML 파일로 변환되면서 바뀐 주요 요소들을 설명합니다.

구분 LST 파일 (원본) XML 파일 (변환) 변환 내용
파일 구조 단순 텍스트(.lst) XML 형식으로 감싸기 XML선언부 <?xml version="1.0" encoding="UTF-8"?>와 <Document> 태그 추가
태그 치환 <인명> <Person> 한글 마커가 의미론적 영어 태그로 자동 치환
<지명> <Place> 모든 지정된 한글 태그가 해당 영어 태그로 변환
단락 구조화 단락 텍스트 <p xml:id="txt_#####" xml:lang="ko">...</p> 각 단락에 고유 ID(txt_#####)가 부여되고 <p> 태그로 감싸져 구조화됨. 고유 ID는 권별로 시작되는 숫자가 다르며, 다음 텍스트에서 1씩 증가
속성 추가 (없음) xml:id, xml:lang XML 표준에 따라 고유 식별자(xml:id)와 언어 정보(xml:lang="ko")가 자동으로 삽입됨.
ID 부여 (없음) txt_10001, txt_10002, txt_10003 CSV 파일의 id 필드와 동일한 역할을 하는 단락별 고유 식별자가 순차적으로 부여됨.

5. 작업 참고 사항

  • LST 파일 준비: 각 팀 검수자는 2월 19일 이전에 검수가 끝난 *.lst 파일을 전체작업팀에게 전달해야 합니다. 파일명은 [자연마을/부산인물][권번호]_태깅완료.lst 형식이어야 합니다.
  • XML ID: XML 변환 시 부여되는 xml:id는 나중에 CSV 파일의 id와 연동되어 데이터 분석 및 지식 그래프 구축의 핵심 키로 사용됩니다.
  • XML 최종 제출: 전체작업팀은 자동 변환 후 최종적으로 [자연마을/부산인물][권번호].xml 파일(자연마을01.xml, 부산인물02.xml 등)을 생성하여 Person 심교우에게 제출해야 합니다.
  • 결과보고서: XML 변환 과정에서 특이사항이나 논의가 필요한 부분(예: 태그 오류 발견 등)은 2월 27일까지 제출할 결과보고서에 기록해야 합니다.
  • 문의: 스크립트 관련 기술적인 문의는 전체작업팀의 강주연, 박지현, 박비원 보조연구원에게 하시기 바랍니다.