Summary
드라마 스토리텍스트에서 자동으로 등장인물과 관계를 추출하여 그래프로 시각화하는 완전 자동화 파이프라인. Neo4j GraphRAG의 ERExtractionTemplate을 활용한 정보 추출(Information Extraction) 실전 예제. 비정형 텍스트 → 구조화된 그래프 데이터로의 변환 과정을 상세히 설명.
Key Claims
- ERExtractionTemplate — Neo4j GraphRAG에서 제공하는 자동 추출 템플릿
- 완전 자동화 — 사용자가 드라마 줄거리만 입력하면 관계도 자동 생성
- LLM 기반 정보 추출 — 자연어 이해를 통한 엔티티-관계 추출
- 비정형 → 정형화 — 텍스트에서 구조화된 그래프 데이터로 변환
- 실시간 시각화 — 추출된 관계도를 즉시 시각화
Key Concepts Introduced
1. ERExtractionTemplate (Entity-Relationship Extraction Template)
from neo4j_graphrag.templates import ERExtractionTemplate
template = ERExtractionTemplate()
# 드라마 줄거리 입력
> [!caution] 검토 필요
>
> 원본 자료 재방문 권장 (최초 수집: 2024-11-13)
story = "Alice는 Bob의 누나다. Bob은 Charlie를 사랑한다..."
# 자동 추출
entities, relationships = template.extract(story)
# entities: [Alice (Person), Bob (Person), Charlie (Person)]
# relationships: [(Alice, SIBLING, Bob), (Bob, LOVES, Charlie)]2. Entity 추출
입력 텍스트: "드라마 주인공 Alice는 대재벌 Bob의 비서로 일한다..."
Entity 추출:
- Alice (타입: Person, 역할: 비서)
- Bob (타입: Person, 타입: 재벌)
- [회사명 없음]
3. Relationship 추출
추출된 관계:
- Alice --WORKS_FOR--> Bob
- Alice --WORKS_AS--> Secretary
- Bob --OWNS--> Company
4. Neo4j에 저장
CREATE (alice:Person {name: "Alice", role: "비서"})
CREATE (bob:Person {name: "Bob", role: "재벌"})
CREATE (alice)-[:WORKS_FOR]->(bob)5. 시각화
그래프 노드:
○ Alice (파란색)
○ Bob (빨간색)
○ Charlie (녹색)
관계 엣지:
→ SIBLING, WORKS_FOR, LOVES 등
ERExtractionTemplate vs 수동 설계
| 방식 | 시간 | 정확도 | 재사용성 |
|---|---|---|---|
| ERExtractionTemplate | 1분 | 85~90% | 매우 높음 (모든 텍스트) |
| 수동 Ontology 설계 | 수시간 | 95%+ | 낮음 (도메인 특화) |
Tradeoff:
- ERExtractionTemplate: 빠르고 재사용 가능하지만 미세한 오류 가능
- 수동 설계: 느리지만 도메인 최적화 가능
실전 파이프라인
Step 1: 드라마 데이터 수집
drama_stories = [
"로맨스 드라마: Alice와 Bob은 회사에서 만나 사랑에 빠진다...",
"사극: 왕 Charlie는 신하 Bob을 신뢰하지만 Alice는 반대한다...",
# ...
]Step 2: Entity-Relationship 자동 추출
from neo4j_graphrag.templates import ERExtractionTemplate
results = []
for story in drama_stories:
entities, rels = ERExtractionTemplate().extract(story)
results.append((entities, rels))Step 3: 중복 제거 및 정규화
# 여러 드라마에서 "Alice"라는 이름 등장 → 이름 기준으로 통합
merged_entities = merge_entities_by_name(all_entities)Step 4: Neo4j에 저장 & 시각화
from langchain.graphs import Neo4jGraph
graph = Neo4jGraph()
for entity in merged_entities:
graph.create_node(entity)
for rel in relationships:
graph.create_relationship(rel)
# 시각화 (Neo4j Browser 또는 Python 라이브러리)
visualize_graph(graph)정확도 개선 전략
| 전략 | 설명 |
|---|---|
| 프롬프트 최적화 | ”드라마 장르에서 주로 나타나는 관계: 부자관계, 연인, 경쟁자 등” |
| 도메인 데이터 활용 | 드라마 특화 엔티티 타입 목록 제공 |
| 다단계 추출 | Entity → Relationship → Attribute 순차 추출 |
| 검증 루프 | 추출 결과에 LLM이 “맞나요?” 물어보기 |
활용 사례
1. 드라마 추천 시스템
사용자가 본 드라마의 관계도 학습
→ 유사 관계도의 다른 드라마 추천
2. 드라마 분석
"사랑"이라는 관계가 많은 드라마 vs "음모"가 많은 드라마 분류
3. 캐릭터 분석
특정 배우의 주요 역할 타입 (비서, 재벌, 경찰 등) 추출
한계 및 개선 방향
현재 한계:
- 암시적 관계 추출 어려움 (예: “A는 B를 싫어하지만, B는 모른다” → 복잡한 심리 관계)
- 시간 흐름 반영 불가 (드라마는 회차별 관계 변화)
- 방언/특수 표현 이해 부족
개선 방향:
- Few-shot examples로 드라마 특화 학습
- 시간축 추가 (관계 변화 추적)
- 암시적 관계 추론 강화
관련 개념
- EntityExtraction — 엔티티 자동 추출 기초
- RelationshipExtraction — 관계 자동 추출 기초
- GraphRAG — 그래프 기반 RAG
- — 정보 추출 일반 이론
- Knowledge Graph — 최종 산출물 구조
관련 소스: data-to-kg (파이프라인), neo4j-movie-vector-retriever (그래프 활용)
인정: YouTube 공원나연 채널 (2024-11-13)