[1단계] 경량 NER의 실제 작동 방식

A. 규칙 기반 / 통계 기반 모델 (가장 경량)

  • spaCy en_core_web_sm 같은 소형 모델
  • 품사 태깅(POS, Part-Of-Speech) + 의존 구문 분석(dependency parsing) 조합
  • PERSON, ORG, GPE, DATECoNLL 표준 레이블로 분류
  • 속도 빠름, 도메인 일반성 낮음
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("OpenAI released GPT-4 in March 2023.")
 
for ent in doc.ents:
    print(ent.text, ent.label_)
# OpenAI  ORG
# GPT-4   PRODUCT
# March 2023  DATE

B. 소형 BERT 계열 (균형형)

  • bert-base-NER, ko-electra-base + NER fine-tuning(특정 태스크용 추가 학습)
  • 토큰 분류(Token Classification) 태스크: 각 토큰에 B-PER, I-PER, O 같은 BIO 태그 부여
  • spaCy보다 문맥 이해 높음, LLM보다 속도 매우 빠름

BERT엔티티추출BIO란

"삼성전자 이재용 회장이 발표했다"
 B-ORG  I-ORG  B-PER I-PER  O    O    O

C. LLM 기반 (Microsoft GraphRAG 기본값)

  • 경량 LLM (GPT-3.5-turbo, Haiku 등)에 구조화 프롬프트 주입
  • 출력을 JSON으로 강제해서 파싱 비용 최소화
청크 텍스트: "..."
다음 타입의 엔티티를 JSON으로 추출하라: [PERSON, ORG, LOCATION, CONCEPT]
형식: [{"name": ..., "type": ..., "description": ...}]

BERT가 spaCy NER보다 낫나

fine-tuning 여부로 갈린다. 일반 BERT를 그냥 쓰면 부동산 용어(“LTV”, “분양가상한제”) 같은 건 못 잡는다.

spaCy (규칙/통계)BERT 계열
일반 도메인나쁘지 않음더 좋음
특화 도메인 (부동산, 의료 등)많이 틀림fine-tuning 하면 훨씬 좋음
속도매우 빠름느림
비용거의 0GPU 필요

즉 도메인이 좁고 특수할수록 BERT + fine-tuning이 유리하고, 범용 기사 처리 같은 건 spaCy로 충분한 경우가 많다.


Cypher Query가 검색을 하는 건가?

맞다. 역할 분담을 명확히 하면 이렇다 (DB 저장 시).

NER / BIO 태그  →  그래프 구축 (인덱싱)
Cypher Query   →  그래프 검색 (쿼리)

NER은 “누가 누구랑 연결돼있다”는 관계 데이터를 만드는 것이고, Cypher는 그 그래프를 탐색하는 SQL 같은 언어다. 두 단계는 서로 포함 관계가 아니라 “저장 단계 → 검색 단계”로 이어지는 파이프라인이다.

전체 흐름

[원문 문서]
     ↓
청크로 쪼갬 (예: 500토큰씩)
     ↓
NER → 엔티티 추출 ("삼성전자=ORG", "이재용=PER")
     ↓
관계 추출 → 엣지 생성 ("이재용 -CEO_OF→ 삼성전자")
     ↓
Neo4j에 노드/엣지로 저장  ← 이게 인덱싱
     ↓
(선택) 각 노드에 임베딩 벡터도 같이 저장 (하이브리드용)

엣지 생성은 어떻게 하나?

NER이 엔티티를 추출했다고 엣지가 자동으로 생기진 않는다. 별도 단계가 있다. 크게 세 가지 방법.

방법 1: 공기(Co-occurrence) 기반, 가장 단순

같은 문장/청크에 두 엔티티가 같이 나오면 그냥 연결.

"삼성전자 이재용 회장이 갤럭시를 발표했다"
→ (이재용) - (삼성전자) 연결
→ (이재용) - (갤럭시) 연결
→ (삼성전자) - (갤럭시) 연결

관계 레이블 없이 “같이 나왔다”는 엣지만 생긴다. 정밀도가 낮다.

방법 2: 관계 분류 모델

엔티티 쌍을 모델에 넣어 관계 레이블을 분류한다.

입력: ("이재용", "삼성전자", "이재용 회장이 삼성전자를 이끌고 있다")
출력: CEO_OF

BERT 계열 모델을 관계 분류용으로 fine-tuning해서 쓴다. NER이랑 별개 모델이다.

방법 3: LLM 프롬프트로 한 번에

엔티티 추출 + 관계 추출을 동시에 시킨다.

"다음 텍스트에서 엔티티와 관계를 JSON으로 추출해라"
→ {"entity1": "이재용", "relation": "CEO_OF", "entity2": "삼성전자"}

Microsoft GraphRAG가 이 방식을 쓴다. LLM 호출 비용이 높지만 관계 품질은 제일 좋다.

한마디 요약

NER 방식은 spaCy(빠름/일반) → BERT(균형) → LLM(품질 최상)으로 단계가 올라가고, 엣지 생성도 공기 기반 → 관계 분류 → LLM 원샷 순으로 정밀도가 올라간다. 선택은 도메인 특수성과 비용 간 트레이드오프다.

연관노트