124 lines
3.7 KiB
Markdown
124 lines
3.7 KiB
Markdown
# KORMARC / MARC21 서지파일 핸들링 정보 수집
|
||
|
||
## MARC21이란?
|
||
- **M**achine-**R**eadable **C**ataloging
|
||
- 도서관 서지 데이터 표준 형식
|
||
- ISO 2709 기반 바이너리 포맷
|
||
- 레코드 구조: 리더(24바이트) + 디렉토리 + 필드 데이터
|
||
|
||
## 레코드 구조
|
||
```
|
||
[리더 24바이트][디렉토리][필드1][필드2]...[필드n][레코드 종료 문자(0x1D)]
|
||
```
|
||
|
||
### 리더 (Leader)
|
||
- 24바이트 고정 길이
|
||
- 레코드 길이, 상태, 레코드 유형, 지시자/서브필드 길이 등 포함
|
||
|
||
### 필드 구조
|
||
- **제어 필드 (001~009)**: 지시자/서브필드 없음, 데이터만
|
||
- **데이터 필드 (010~999)**: 지시자 2개 + 서브필드 (delimiter `$` + 코드 + 데이터)
|
||
- 예: `245 10$a제목$bsubtitle`
|
||
|
||
### 주요 태그
|
||
| 태그 | 내용 |
|
||
|------|------|
|
||
| 001 | 제어번호 |
|
||
| 005 | 최종 수정일시 |
|
||
| 008 | 고정길이 데이터 (언어, 출판국 등) |
|
||
| 020 | ISBN |
|
||
| 040 | 카탈로그링 기관 |
|
||
| 100 | 주 저자 |
|
||
| 245 | 제목 |
|
||
| 250 | 판사항 |
|
||
| 260 | 출판정보 |
|
||
| 300 | 물리적 설명 |
|
||
| 500 | 일반 주석 |
|
||
| 650 | 주제 (LC) |
|
||
| 700 | 부가 저자 |
|
||
| 856 | 전자 자원 URL |
|
||
|
||
## KORMARC
|
||
- 한국형 MARC 형식
|
||
- MARC21을 기반으로 한국 서지 특화
|
||
- 차이점:
|
||
- 한글 처리 (EUC-KR 또는 UTF-8)
|
||
- 한국 도서관 분류법 연동
|
||
- 국립중앙도서관 기준
|
||
- 일부 필드/서브필드가 한국 특화
|
||
|
||
## Python 라이브러리
|
||
|
||
### pymarc (핵심)
|
||
- **설치**: `pip install pymarc`
|
||
- **용도**: MARC21 읽기/쓰기/수정
|
||
- **기능**:
|
||
- `MARCReader`: 배치 파일 읽기
|
||
- `Record`: 단일 레코드 객체
|
||
- `Field`: 필드 (태그 + 지시자 + 서브필드)
|
||
- `Subfield`: 서브필드 (코드 + 값)
|
||
- MARC/XML 변환
|
||
- MARC/JSON 변환
|
||
- MARC/CSV 변환
|
||
|
||
### pymarc 기본 사용법
|
||
```python
|
||
from pymarc import MARCReader, Record, Field, Subfield
|
||
|
||
# 읽기
|
||
with open('data.mrc', 'rb') as fh:
|
||
reader = MARCReader(fh)
|
||
for record in reader:
|
||
print(record.title) # 245 필드 자동 추출
|
||
print(record['245']['a']) # 서브필드 직접 접근
|
||
print(record.isbn()) # 020 필드 자동 추출
|
||
|
||
# 쓰기
|
||
record = Record()
|
||
record.add_field(
|
||
Field(tag='245', indicators=['1', '0'], subfields=[
|
||
Subfield(code='a', value='제목'),
|
||
Subfield(code='b', value='부제목'),
|
||
])
|
||
)
|
||
record.add_field(
|
||
Field(tag='100', indicators=['1', ' '], subfields=[
|
||
Subfield(code='a', value='저자명'),
|
||
])
|
||
)
|
||
|
||
# 파일 저장
|
||
with open('output.mrc', 'wb') as fh:
|
||
fh.write(record.as_marc())
|
||
```
|
||
|
||
### 기타 라이브러리
|
||
| 라이브러리 | 용도 |
|
||
|-----------|------|
|
||
| `pymarc` | MARC21 읽기/쓰기/수정 (핵심) |
|
||
| `marcjson` | MARC → JSON 변환 |
|
||
| `pymarc[xml]` | MARC → MARCXML 변환 |
|
||
| `tablib` | 범용 데이터셋 (CSV/JSON/XLS 지원) |
|
||
| `pydantic` | 데이터 모델 검증 |
|
||
|
||
## MARC 바이너리 포맷 상세
|
||
- 인코딩: ISO 2709
|
||
- 레코드 종료: `0x1D` (GS)
|
||
- 필드 종료: `0x1E` (RS)
|
||
- 서브필드 구분: `0x1F` (US) 또는 `$`
|
||
- 리더 길이: 24바이트 (고정)
|
||
- 디렉토리: 각 필드의 태그(3) + 길이(4) + 위치(5) = 12바이트 × 필드 수
|
||
|
||
## LLM 연동 아이디어
|
||
1. **일괄 편집**: 여러 레코드의 특정 필드를 LLM으로 일괄 수정
|
||
2. **자동 분류**: 제목/초록 기반 주제 분류
|
||
3. **형식 변환**: 자연어 → MARC 레코드 생성
|
||
4. **검증**: MARC 규칙 준수 여부 자동 확인
|
||
5. **번역**: 필드 값 번역 (다국어 서지 작성)
|
||
|
||
## 한국 국립중앙도서관 참고
|
||
- KORMARC 사양: https://www.nl.go.kr
|
||
- KORMARC는 MARC21을 기반으로 한국 특화 필드 추가
|
||
- 인코딩: UTF-8 권장 (구형은 EUC-KR)
|
||
- 필드 매핑: MARC21 ↔ KORMARC 변환 테이블 필요
|