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 수동 설계

방식시간정확도재사용성
ERExtractionTemplate1분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로 드라마 특화 학습
  • 시간축 추가 (관계 변화 추적)
  • 암시적 관계 추론 강화

관련 개념


관련 소스: data-to-kg (파이프라인), neo4j-movie-vector-retriever (그래프 활용)

인정: YouTube 공원나연 채널 (2024-11-13)