Selenium과 SpaCy를 사용해서 해리포터 세계에 대한 Neo4j Knowledge Graph를 만드는 방법을 알아볼까요?
아마도 여러분은 이미 왕좌의 게임 네트워크를 보신 적이 있을 거예요. 앤드류 베버리지님이 만드셨죠.
앤드류는 책 속 인물들의 를 만들었어요. 두 인물이 특정 텍스트 거리 내에 나타나면, 이들이 어떤 식으로든 관련이 있거나 책에서 상호작용한다고 가정할 수 있는 거죠.
저도 비슷한 프로젝트를 만들기로 했는데, (적어도 저에게는) 네트워크 추출이 덜 알려진 인기 있는 책을 선택했어요. 그래서 해리포터와 철학자의 돌 책에서 캐릭터 네트워크를 추출하는 프로젝트가 탄생하게 되었답니다.

저는 최적의 방법을 찾기 위해 많은 실험을 했어요. 대부분의 오픈 소스 Named Entity Recognition 모델을 시도해서 어떤 것이 가장 효과적인지 비교해 봤지만, 결국 어떤 것도 충분하지 않다고 판단했죠.
다행히 우리에게는 해리포터 팬덤 페이지가 있어요. 여기에는 첫 번째 책에 등장하는 인물 목록도 포함되어 있죠. 게다가 각 캐릭터가 처음 등장한 챕터 정보도 알 수 있어서, 등장 인물을 더 명확하게 파악하는 데 도움이 될 거예요.
이 정보를 바탕으로 SpaCy의 규칙 기반 매처(rule-based matcher)를 사용해서 캐릭터에 대한 모든 언급을 찾을 거예요. 엔터티 발생을 모두 찾고 나면, 남은 작업은 동시 발생 측정 기준을 정의하고 결과를 에 저장하는 것뿐이에요.
왕좌의 게임 추출에 사용된 것과 동일한 동시 발생 임계값을 사용할 건데요. 두 문자가 14 단어 이내에 나타나면, 이들이 어떻게든 상호작용했다고 가정하고 해당 상호작용 횟수를 관계 가중치로 저장할 거예요.
Agenda
- 해리포터 팬덤 페이지 스크래핑
- 책 텍스트 전처리 (공동 참조 해결)
- SpaCy의 규칙 기반 매칭을 통한 개체 인식
- 등장인물 간의 관계 추론
- 결과를 Neo4j Graph Database에 저장
따라오고 싶으신 분들을 위해 Google Colab 노트북을 준비해 뒀어요.
해리포터 팬덤 페이지 스크랩
웹 스크래핑을 위해 Selenium을 사용할 거예요. 앞서 언급했듯이, 해리포터와 마법사의 돌 책에 나오는 캐릭터를 스크래핑하는 것부터 시작해 볼게요. 캐릭터 목록은 챕터별로 정리되어 있고, CC-BY-SA 라이선스를 따르기 때문에 저작권 침해 걱정은 안 해도 돼요.
이제 처음 등장한 챕터 정보가 포함된 캐릭터 목록이 생겼네요. 각 캐릭터는 해당 캐릭터에 대한 자세한 정보가 담긴 웹페이지로 연결되어 있기도 하고요.
예를 들어, 헤르미온느 그레인저 페이지를 살펴보면, 추가 정보가 포함된 구조화된 테이블을 볼 수 있어요. 우리는 과 집, 혈액형 같은 캐릭터 세부 정보를 추가해서 엔터티 추출을 통해 Knowledge Graph를 더욱 풍부하게 만들 거예요.
가독성과 명확성을 위해 이 과정에 사용된 모든 코드를 추가하진 않았어요. 별칭에 대한 몇 가지 예외도 추가했는데요. 예를 들어 해리포터는 다음과 같은 별칭을 가지고 있어요.
- (폴리주스로 변장)
저희는 폴리주스로 위장한 모든 별칭은 무시하고 싶어요. 그리고 해리가 Stanley Shunpike에게 자신을 Neville Longbottom이라고 말한 부분도 건너뛸 거예요.
책에서 명명된 개체 추출을 계속하기 전에 문자에 대해 스크랩된 정보를 Neo4j에 저장해요.
속성:
- name
- url
- 종
관계:
- 집
Cypher를 사용해 본 적이 있다면 혈통, 성별, 가명뿐만 아니라 가족 및 충성도와 같은 정보를 그래프에 저장했다는 사실을 눈치채셨을 거예요.

로도 알려져 있고 충성을 다하는 것 같아요.요정 복지 추진 협회. 안타깝게도 데이터에는 타임라인이 없으므로Fred Weasley는 이미 Little Miss Perfect의 처남이에요.
텍스트 전처리
우선, 우리는 책에 있는 텍스트를 손에 넣어야 해요. 저는GitHub 저장소여기에는 처음 네 권의 해리포터 책의 텍스트가 포함되어 있어요.
데이터에 라이선스가 첨부되어 있지 않으므로 공정한 사용의 한도 내에서 교육 목적으로 데이터를 사용할 수 있다고 가정해 볼게요. 실제로 책을 읽고 싶으시다면 가서 구매해 보세요.
GitHub 파일에서 텍스트를 가져오는 것은 매우 쉬워요.
원시 텍스트 콘텐츠에 대한 링크를 제공할 때는 주의를 기울여야 하며 제대로 작동해야 해요.
처음 엔터티 추출을 수행했을 때 다음을 사용하는 것을 잊어버렸어요.공동 참조 해결미리 기술을. 상호 참조 해결은 동일한 실제 개체를 참조하는 언어 표현을 결정하는 작업이에요.
간단히 말해서 우리는대명사를 참조된 엔터티로 바꿉니다.
실제 예를 보려면 내정보 추출 파이프라인 게시물을 참고해주세요.
텍스트에서 지식으로. 정보 추출 파이프라인
오픈 소스 공동 참조 해결 모델을 검색해 봤지만, 제가 아는 한 두 가지밖에 없어요. 첫 번째는NeuralCorefSpaCy 위에서 작동하며AllenNLP두 번째 모델을 제공해요. 이전에 NeuralCoref를 이미 사용한 적이 있으므로 AllenNLP 모델이 어떻게 작동하는지 살펴보기로 결정했어요.
불행하게도 AllenNLP 모델에 전체 장을 입력할 때 메모리가 빨리 부족해졌어요(Colab의 RAM은 16GB임). 그런 다음 한 장을 문장 목록으로 분할했지만 BERT 프레임워크를 사용했기 때문에 정말 느리게 작동했어요.
그래서 기본적으로 사용했어요.NeuralCoref, 전체 장을 쉽게 처리할 수 있고 더 빠르게 작동해요. 이전에 이미 사용한 코드를 복사했어요.
이제 텍스트가 준비되었으므로 텍스트에서 언급된 문자를 추출할 차례에요.
SpaCy의 규칙 기반 매칭을 통한 개체 인식
첫째, 저는 명명된 엔터티 인식 모델을 사용하고 싶었어요. 저는 SpaCy, HuggingFace, Flair, 심지어 Stanford NLP의 모델도 사용해 보았어요.
그 중 어느 것도 내 요구 사항을 충족할 만큼 잘 작동하지 않았어요. 그래서 모델을 훈련시키는 대신 SpaCy의규칙 기반 패턴 일치특징을 사용하기로 했어요.
우리는 HP 팬덤 사이트에서 스크랩한 데이터를 기반으로 어떤 캐릭터를 찾고 있는지 이미 알고 있어요. 이제 우리는 텍스트에서 그것들을 가능한 한 완벽하게 일치시키는 방법을 찾아야 해요.
각 문자에 대한 텍스트 패턴을 정의해야 해요.
먼저, 찾고 있는 패턴으로 전체 이름을 추가해요. 그런 다음 이름을 공백으로 나누고 해당 용어의 모든 단어에서 패턴을 만들죠. 예를 들어 Albus Dumbledore에 대한 matcher 패턴을 정의하는 경우, 해당 문자를 나타낼 수 있는 세 가지 다른 텍스트 패턴이 생성될 거예요.
- 이름 : 알버스 덤블도어
- 이름: 알버스
- 성 : 덤블도어
몇 가지 예외도 있어요. 저는 다음과 같은 목록을 정의했어요. stop words인데, 이는 특정 문자에 대한 단일 단어 패턴에 포함되어서는 안 되죠.
예를 들어, 책에는 '동물원의 수호자'라는 캐릭터가 등장해요. 'of' 또는 'the'와 같은 단어를 항목의 matcher 패턴으로 정의하지 않는 것이 매우 직관적일 수 있어요.
다음으로, 우리는 모든 단일 단어가 title cased인지 확인해요. 이는 "검은색"이 "시리우스 블랙"을 지칭한다는 언급을 피하기 위한 거예요. "Black"이 title case인 경우에만 "Sirius Black"이 참조된 것으로 간주하는 거죠. "Black"이 문장 시작 부분에 있기 때문에 title case일 수 있기 때문에 완벽한 솔루션은 아니지만, 충분히 좋은 솔루션이라고 생각해요.
제가 소개한 특별한 사례는 본문에서 '로널드 위즐리'가 주로 '론'으로 언급되는 것이에요. 마지막으로 'Vernon Dursley의 비서' 또는 'Draco Malfoy의 수리부엉이'와 같은 개체를 분할하지 않도록 했어요.
이 접근 방식에는 두 가지 장애물을 극복해야 해요. 첫 번째 문제는 다음 텍스트예요. “알버스 덤블도어는 좋은 마법사예요”
세 개의 일치 항목을 생성하죠. matcher 패턴에서 이름의 전체와 일부를 사용했기 때문에 세 가지 결과를 얻게 되는 거예요. 이 문제를 해결하기 위해 우리는 더 확장된 entity를 선호해요.
여러 단어로 구성된 일치 항목과 같은 위치에 단일 단어로 구성된 일치 항목이 있는 경우, 여러 단어로 구성된 일치 항목을 선호하는 거죠.
더 긴 단어 entity 우선 순위를 구현하는 것은 매우 기본적이에요. 먼저, 더 확장된 entity가 이미 존재하는지 확인해요. 그런 다음 현재 결과가 동일한 위치에 있는 기존 항목보다 긴지 확인하고, 아직 기존 항목이 없으면 마지막으로 새 결과를 추가하는 거죠.
흥미로운 점은 맨 마지막 “else” 절이에요. 때로는 단일 위치에 더 많은 개체가 할당되는 경우도 있거든요. 다음 문장을 고려해 보세요:
“위즐리, 이리로 와요!”
선택할 수 있는 위즐리 캐릭터가 많이 있어요. 이것이 우리가 극복해야 할 두 번째 문제인데, 이는 주로 사람이 성으로 언급되고 해당 성을 가진 인물이 많을 때 발생하죠.
우리는 entity 명확성을 위한 일반적인 솔루션을 마련해야 해요.
조금 더 긴 기능이에요. 명확성이 필요한 entity를 식별하는 것부터 시작하죠.
저는 "더슬리(Dursley)"라는 용어를 명확하게 하는 독특한 논리를 도입했어요. "미스터"라면 "Dursley" 용어 앞에는 Vernon을 참조하고, "Mrs."가 있으면 Vernon을 참조해요. 존재한다면 "Petunia"를 선택하는 거죠.
다음으로 좀 더 일반적인 솔루션이 있어요. 알고리즘은 참조를 nearest neighbor 옵션에서 제외해요.
예를 들어, “해리 포터”, “제임스 포터”, “릴리 포터” 중에서 선택할 수 있다고 가정해 볼게요. 이 경우 알고리즘은 텍스트에서 세 entity 중 가장 가까운 entity를 식별하고 현재 항목에 해당 값을 할당해요. 같은 장 내에서 전체 이름이나 이름이 언급되지 않는 몇 가지 예외가 있으며, 최후의 수단으로 하드 코딩된 옵션을 추가했어요.
캐릭터 간의 관계 추론
우리는 어려운 부분을 마쳤어요. 등장인물 간의 관계를 유추하는 방법은 매우 간단해요. 먼저, 두 캐릭터 사이의 상호작용이나 관계의 거리 임계값을 정의해야 하죠. 언급한 대로 GoT 추출에 사용된 것과 동일한 거리 임계값을 사용해요.
즉, 두 문자가 동시에 발생하는 경우 14 단어 이내, 그렇다면 우리는 그들이 상호작용했음에 틀림없다고 가정하는 거예요. 또한 결과가 왜곡되지 않도록 항목을 병합했어요.
entity에 가입한다는 것은 무엇을 의미할까요? 다음 두 문장이 있다고 가정해 볼게요.
"해리는 좋은 하루를 보내고 있었어요. 오후에 덤블도어 교수님과 이야기를 나누러 갔어요."
entity 추출 프로세스에서는 "Harry", Harry를 참조하는 "He" 및 "Dumbledore"라는 세 개의 entity를 식별해요. 순진한 접근 방식을 취하면 "Harry"에 대한 두 언급이 "Dumbledore"에 가깝기 때문에 Harry와 Dumbledore 사이의 두 가지 상호 작용을 추론할 수 있죠.
그러나 저는 그것을 피하고 싶기 때문에 단일 entity와 동일한 문자를 참조하는 시퀀스의 병합 entity를 사용해요. 마지막으로, 문자 쌍 사이의 상호 작용 횟수를 계산해야 해요.
Neo4j Graph Database에 결과 저장
캐릭터 간 상호작용 네트워크를 추출했고, 그 결과를 Graph Database에 저장하는 일만 남았어요. 가져오기 쿼리는 매우 간단해요. 를 만들면 되죠.
만약 여러분이 Colab 노트북을 사용한다면, 무료로 Neo4j Sandbox 또는 무료 AuraDB instance를 만들어서 결과를 저장하는 것이 가장 쉬울 거예요.
결과를 살펴보기 위해 상호작용 네트워크를 시각화해 볼까요?

언뜻 보면 결과가 꽤 괜찮아 보이죠? 네트워크의 중심에는 해리포터가 있는데, 이 책은 대부분 해리포터의 관점에서 나왔기 때문에 이해할 수 있어요.
일치자 패턴에 불용어를 몇 개 더 추가했어야 했는데, 여러분은 살면서 배우는 거죠!
결론
사전 정의된 항목을 기반으로 한 규칙 기반 매칭이 얼마나 좋은 결과를 얻었는지 정말 자랑스러워요. 언제나 그렇듯이 코드는 다음에서 사용할 수 있습니다..
두 번째 또는 세 번째 책에서 이 접근 방식을 시도해 볼 수도 있겠어요. 아마도 약간의 Fine-tuning이 필요한 유일한 것은 엔터티 명확성 프로세스일 거예요.
당신은 사용할 수 있습니다Neo4j 그래프 알고리즘 놀이터기다리고 싶지 않다면 해리포터 Knowledge Graph에서 그래프 알고리즘을 테스트할 수 있는 애플리케이션이에요.
Knowledge Graph 구축을 고려 중이신가요?
다운로드개발자 가이드: Knowledge Graph 구축 방법자신있게 구축을 시작하기 위해 알아야 할 모든 것을 단계별로 안내합니다.
에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.
'Ontology & Knowledge Graph' 카테고리의 다른 글
| Neo4j와 LangChain으로 비정형 지식 그래프를 통합하여 QA 성능 향상시키기 (1) | 2026.08.06 |
|---|---|
| GenAI를 위한 LLM과 Knowledge Graph 통합: 활용 사례 및 Best Practices (0) | 2026.08.05 |
| 혁신을 뒤바꾸다: Digital Twin으로 승리! (1) | 2026.08.04 |
| RAG 튜토리얼: 지식 그래프 기반 RAG 시스템 구축 방법 (0) | 2026.07.26 |
| 데이터 모델링, 이제 테이블 위로 올려보자! (1) | 2026.07.26 |
