# 챕터 추출 패턴 가이드

> 정기호 원장 영상의 구조적 특징을 기반으로 챕터 타임스탬프를 추출합니다.

---

## 영상 유형별 구조

### Type A: 시술 소개 영상 (3-10분)

```
0:00  인트로 (인사)
      └─ "안녕하세요. 제이미성형외과 정기호 원장입니다"
      
0:15~ 문제 제기 / 공감
      └─ "~로 고민하시는 분들", "~때문에 걱정"
      
0:30~ 시술 소개
      └─ "[시술명]이란", "어떤 방법", "특징"
      
1:00~ 수술 과정 / 방법
      └─ "수술은", "진행", "과정", "방법"
      
2:00~ 장점 / 효과
      └─ "장점", "효과", "결과", "좋은 점"
      
3:00~ 회복 / 주의사항
      └─ "회복 기간", "주의", "관리", "~후에"
      
마지막 20초  마무리 / CTA
      └─ "상담", "문의", "감사합니다"
```

### Type B: 짧은 설명 영상 (1-3분)

```
0:00  인트로
0:10~ 핵심 설명
0:40~ 장점/특징
1:20~ 마무리
```

### Type C: Q&A / FAQ 영상

```
0:00  인트로 + 질문 소개
0:15~ 답변 1
0:45~ 답변 2 (있는 경우)
1:15~ 정리 / 마무리
```

---

## 챕터 감지 키워드

### Primary Keywords (높은 우선순위)

| 챕터 유형 | 키워드 |
|----------|--------|
| **인트로** | "안녕하세요", "제이미성형외과", "정기호 원장" |
| **시술 소개** | "[시술명]이란", "무엇인가요", "어떤 수술" |
| **수술 과정** | "수술 과정", "진행", "방법은", "어떻게" |
| **장점** | "장점", "좋은 점", "효과", "결과" |
| **회복** | "회복 기간", "회복은", "관리", "주의사항" |
| **마무리** | "상담", "문의", "감사합니다", "추천드립니다" |

### Secondary Keywords (보조)

| 챕터 유형 | 키워드 |
|----------|--------|
| **문제 제기** | "고민", "걱정", "불편", "힘든" |
| **비교** | "차이", "비교", "vs", "다른 점" |
| **대상** | "적합한 분", "추천", "이런 분" |
| **비용/시간** | "시간", "기간", "비용" |

---

## 챕터 추출 알고리즘

### Step 1: 텍스트에서 키워드 탐지

```python
def detect_chapter_candidates(subtitles, keywords):
    candidates = []
    for i, sub in enumerate(subtitles):
        text = sub['text']
        start_time = parse_start_time(sub['timestamp'])
        
        for chapter_type, kw_list in keywords.items():
            for kw in kw_list:
                if kw in text:
                    candidates.append({
                        'time': start_time,
                        'type': chapter_type,
                        'keyword': kw,
                        'context': text
                    })
                    break
    return candidates
```

### Step 2: 중복 제거 및 정리

```python
def deduplicate_chapters(candidates, min_gap_seconds=15):
    """
    같은 유형의 챕터가 15초 이내에 있으면 첫 번째만 유지
    """
    result = []
    last_by_type = {}
    
    for c in sorted(candidates, key=lambda x: x['time']):
        ctype = c['type']
        if ctype in last_by_type:
            if c['time'] - last_by_type[ctype] < min_gap_seconds:
                continue
        result.append(c)
        last_by_type[ctype] = c['time']
    
    return result
```

### Step 3: 챕터 제목 생성

```python
chapter_titles = {
    'intro': '인트로',
    'problem': '이런 고민 있으신가요?',
    'explanation': '{procedure_name}이란?',
    'procedure': '수술 과정',
    'benefits': '장점 및 효과',
    'recovery': '회복 및 관리',
    'closing': '마무리'
}
```

---

## 시간 형식 변환

### SBV → YouTube 챕터 형식

```python
def sbv_to_chapter_time(sbv_time):
    """
    "0:01:23.450" → "1:23"
    "0:00:45.120" → "0:45"
    """
    parts = sbv_time.split(':')
    if len(parts) == 3:
        h, m, s = parts
        s = s.split('.')[0]  # 밀리초 제거
        
        h, m, s = int(h), int(m), int(s)
        
        if h > 0:
            return f"{h}:{m:02d}:{s:02d}"
        else:
            return f"{m}:{s:02d}"
    return sbv_time
```

---

## 챕터 출력 형식

### YouTube 설명란용 형식

```
0:00 인트로
0:17 하이브리드 쌍꺼풀이란?
0:33 수술 과정
0:50 장점 및 특징
1:10 회복 기간
1:25 마무리
```

### 상세 형식 (내부 문서용)

```markdown
| 시간 | 챕터 | 감지 키워드 | 컨텍스트 |
|------|------|------------|----------|
| 0:00 | 인트로 | "안녕하세요" | 인사말 |
| 0:17 | 시술 소개 | "이란" | "하이브리드 쌍꺼풀이란..." |
```

---

## 시술별 챕터 템플릿

### 눈 성형 영상

```
0:00 인트로
0:XX [시술명]이란?
0:XX 수술 방법
0:XX 장점 (자연스러움, 빠른 회복 등)
0:XX 회복 기간 및 주의사항
0:XX 마무리
```

### 이마/리프팅 영상

```
0:00 인트로
0:XX 노화의 원인
0:XX [시술명] 소개
0:XX 수술 과정
0:XX 효과 및 유지 기간
0:XX 회복 및 관리
0:XX 마무리
```

### Q&A 영상

```
0:00 인트로 및 질문 소개
0:XX Q1. [질문1]
0:XX Q2. [질문2]
0:XX Q3. [질문3]
0:XX 마무리
```

---

## Edge Cases

### 1. 챕터가 너무 적을 때

영상 길이 대비 챕터가 2개 이하면:
- 영상을 3등분하여 강제 챕터 생성
- "전반부", "중반부", "후반부" 사용

### 2. 인트로가 감지되지 않을 때

- 0:00에 "인트로" 강제 추가
- 첫 번째 자막 내용으로 제목 생성

### 3. 짧은 영상 (1분 미만)

- 챕터 최소 2개만 생성
- 0:00 인트로 + 마지막 구간

---

*Version 1.0.0 | 2025-12-23*
