엔티티 연결과 중의성 해소(Entity Linking & Disambiguation)

개체명 인식(NER)이 "Paris"를 찾았습니다. 엔티티 연결(Entity Linking)은 이것이 프랑스의 파리(Paris, France)인지, 패리스 힐튼(Paris Hilton)인지, 미국 텍사스의 패리스(Paris, Texas)인지, 트로이의 왕자 파리스(Paris)인지를 결정합니다. 연결이 없으면 지식 그래프(knowledge graph)는 모호한 상태로 남게 됩니다.

유형: Build 언어: Python 선수 강의: Phase 5 · 06 (NER), Phase 5 · 24 (Coreference Resolution) 예상 시간: 약 60분

학습 목표

  • 엔티티 연결(Entity Linking; EL)이 멘션(mention)을 지식 베이스(Knowledge Base; KB)의 고유 항목으로 연결하는 과제임을 설명합니다.
  • 후보 생성(candidate generation)과 중의성 해소(disambiguation)를 분리해 이해합니다.
  • 사전 확률+문맥(prior + context), 임베딩 기반(embedding-based), 생성형(generative) 엔티티 연결의 차이를 비교합니다.
  • 멘션 재현율(mention recall), 중의성 해소 정확도(disambiguation accuracy), NIL 탐지를 평가합니다.

문제

다음과 같은 문장이 있다고 합시다. "Jordan beat the press." 개체명 인식(NER)은 "Jordan"을 PERSON으로 태깅했습니다. 좋습니다. 하지만 어떤 조던(Jordan)일까요?

  • 마이클 조던(Michael Jordan, 농구 선수)?
  • 마이클 B. 조던(Michael B. Jordan, 배우)?
  • 마이클 I. 조던(Michael I. Jordan, UC 버클리의 머신러닝 교수 — 머신러닝 논문에서 실제로 자주 일어나는 혼동입니다)?
  • 요르단(Jordan, 국가)?
  • 조던(Jordan, 히브리 이름)?

엔티티 연결(EL)은 각 멘션을 지식 베이스의 고유 항목으로 해소(resolve)하는 작업입니다. 지식 베이스로는 위키데이터(Wikidata), 위키피디아(Wikipedia), DBpedia, 또는 도메인 특화 KB를 사용할 수 있습니다. 하위 과제는 두 가지입니다.

  1. 후보 생성(Candidate generation). "Jordan"이 주어졌을 때, 어떤 KB 항목이 가능성 있는 후보일까요?
  2. 중의성 해소(Disambiguation). 문맥이 주어졌을 때, 어떤 후보가 올바른 답일까요?

두 단계 모두 학습 가능하며, 둘 다 벤치마크가 잘 정립되어 있습니다. 결합된 파이프라인은 지난 10년 동안 안정적으로 유지되어 왔습니다. 시간에 따라 바뀌는 것은 중의성 해소기(disambiguator)의 품질입니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.개체명 인식(NER)만으로는 해결할 수 없지만 엔티티 연결(Entity Linking)이 해결하는 문제는 무엇인가요?

2.엔티티 연결이 후보 생성(candidate generation)과 중의성 해소(disambiguation)라는 두 개의 별도 단계로 나뉘는 이유는 무엇인가요?

0/2 답변 완료

개념

entity linking — mention → candidates → disambiguated KB id input "Jordan scored 45 points against the Lakers last night." candidate generation (alias-index lookup for "Jordan") Q41421 Michael Jordan Q810 Jordan (country) Q254110 Michael B. Jordan Q3308285 Michael I. Jordan (ML) disambiguation — score each candidate against context score = Jaccard(context, description) + 0.1 × P(entity | "Jordan") Q41421 score 0.109 basketball match Q810 Lakers not in country desc Q254110 no film keywords in context Q3308285 no ML keywords in context top score wins → Q41421 (Michael Jordan, basketball) — output linked to Wikidata

후보 생성(Candidate generation). 멘션의 표면형(surface form, 예: "Jordan")이 주어지면, 별칭 색인(alias index)에서 후보를 조회합니다. 위키피디아의 별칭 사전은 대부분의 명명된 엔티티(named entity)를 포괄합니다. 예를 들어 "JFK"는 존 F. 케네디(John F. Kennedy), 재클린 케네디(Jacqueline Kennedy), JFK 공항, 영화 〈JFK〉 등을 반환할 수 있습니다. 일반적인 색인은 멘션당 10~30개의 후보를 반환합니다.

중의성 해소: 세 가지 접근법.

  1. 사전 확률 + 문맥(Prior + context, Milne & Witten, 2008). P(엔티티 | 멘션) × 문맥 유사도(엔티티, 텍스트) 점수를 사용합니다. 잘 동작하고, 빠르며, 별도 학습이 필요 없습니다.
  2. 임베딩 기반(Embedding-based, ESS / REL / BLINK). 멘션과 문맥을 인코딩하고, 각 후보의 설명도 인코딩한 뒤, 최대 코사인 유사도(cosine similarity)를 선택합니다. 2020~2024년의 기본 접근법이었습니다.
  3. 생성형(Generative, GENRE 2021; LLM 기반 2023+). 엔티티의 정규화된 이름(canonical name)을 토큰 단위로 디코딩합니다. 유효한 엔티티 이름의 트라이(trie)로 제약하므로 출력이 유효한 KB id임이 보장됩니다.

종단 간(end-to-end) vs 파이프라인. 최신 모델(ELQ, BLINK, ExtEnD, GENRE)은 NER + 후보 생성 + 중의성 해소를 한 번에 처리합니다. 그래도 운영 환경에서는 구성 요소를 교체할 수 있는 파이프라인 시스템이 여전히 지배적입니다.

두 가지 측정 지표

  • 멘션 재현율(Mention recall, 후보 생성 단계). 정답 KB 항목이 후보 리스트에 들어 있는 골드 멘션의 비율입니다. 전체 파이프라인의 성능 하한(floor)을 결정합니다.
  • 중의성 해소 정확도/F1(Disambiguation accuracy / F1). 올바른 후보가 주어졌을 때, top-1이 얼마나 자주 맞는지를 나타냅니다.

항상 두 지표를 함께 보고합니다. 후보 재현율이 80%인 시스템은 중의성 해소가 99%여도 결국 파이프라인 전체 성능은 80%입니다.

직접 만들기

Step 1: 위키피디아 리다이렉트(redirects)로 별칭 색인 만들기

alias_to_entities = {
    "jordan": ["Q41421 (Michael Jordan)", "Q810 (Jordan, country)", "Q254110 (Michael B. Jordan)"],
    "paris":  ["Q90 (Paris, France)", "Q663094 (Paris, Texas)", "Q55411 (Paris Hilton)"],
    "apple":  ["Q312 (Apple Inc.)", "Q89 (apple, fruit)"],
}

위키피디아 별칭 데이터에는 약 1,800만 개의 (별칭, 엔티티) 쌍이 있습니다. 위키데이터 덤프(Wikidata dump)에서 내려받아 역색인(inverted index) 형태로 저장합니다.

Step 2: 문맥 기반 중의성 해소

def disambiguate(mention, context, alias_index, entity_desc):
    candidates = alias_index.get(mention.lower(), [])
    if not candidates:
        return None, 0.0
    context_words = set(tokenize(context))
    best, best_score = None, -1
    for entity_id in candidates:
        desc_words = set(tokenize(entity_desc[entity_id]))
        union = len(context_words | desc_words)
        score = len(context_words & desc_words) / union if union else 0.0
        if score > best_score:
            best, best_score = entity_id, score
    return best, best_score

자카드 중첩(Jaccard overlap)은 장난감 수준의 점수입니다. 임베딩의 코사인 유사도로 교체할 수 있습니다. 트랜스포머(transformer) 버전은 code/main.py의 Step 2를 참고합니다.

from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

def embed_mention(text, mention_span):
    start, end = mention_span
    marked = f"{text[:start]} [MENTION] {text[start:end]} [/MENTION] {text[end:]}"
    return encoder.encode([marked], normalize_embeddings=True)[0]

def embed_entity(entity_id, description):
    return encoder.encode([f"{entity_id}: {description}"], normalize_embeddings=True)[0]

색인 시점에는 모든 KB 엔티티를 한 번 임베딩해 둡니다. 질의 시점에는 멘션과 문맥을 한 번 임베딩한 뒤, 후보 풀(candidate pool)에 대해 내적(dot product)을 계산하고 최댓값을 선택합니다.

Step 4: 생성형 엔티티 연결(개념)

GENRE는 엔티티의 위키피디아 제목(title)을 문자 단위로 디코딩합니다. 제약 디코딩(constrained decoding, lesson 20 참고)을 통해 유효한 제목만 출력될 수 있도록 제한합니다. KB에 기반한 트라이와 긴밀히 결합되어 있습니다. 이 흐름을 잇는 최신 후속작은 REL-GEN과 구조화된 출력(structured output)을 사용하는 LLM 프롬프트 기반 엔티티 연결입니다.

prompt = f"""Text: {text}
Mention: {mention}
List the best Wikipedia title for this mention.
Respond with JSON: {{"title": "..."}}"""

화이트리스트(예: Outlines choice)와 결합하면, 2026년에 출시(ship)하기 가장 단순한 엔티티 연결 파이프라인이 됩니다.

Step 5: AIDA-CoNLL에서 평가하기

AIDA-CoNLL은 표준 엔티티 연결 벤치마크입니다. 로이터(Reuters) 기사 1,393개와 멘션 약 34,000개, 위키피디아 엔티티가 포함되어 있습니다. KB 내 정확도(in-KB accuracy, P@1)와 KB 외 NIL 탐지율(out-of-KB NIL-detection rate)을 보고합니다.

자주 만나는 함정(Pitfalls)

  • NIL 처리. 일부 멘션은 KB에 존재하지 않습니다. 새로 등장한 엔티티(emerging entity)나 잘 알려지지 않은 인물이 그렇습니다. 시스템은 잘못된 엔티티를 추측하는 대신 NIL을 예측해야 합니다. NIL 성능은 별도로 측정합니다.
  • 멘션 경계 오류(Mention boundary errors). 상위 단계의 NER가 부분 스팬(partial span)을 놓치는 경우입니다. 예를 들어 "Bank of America"를 "Bank"만 태깅하면 엔티티 연결 재현율이 떨어집니다.
  • 인기도 편향(Popularity bias). 학습된 시스템은 자주 등장하는 엔티티를 과도하게 예측하는 경향이 있습니다. 머신러닝 논문에서 "Michael I. Jordan" 멘션이 농구 선수 조던으로 연결되는 일이 잦습니다.
  • 교차 언어 엔티티 연결(Cross-lingual EL). 중국어 텍스트의 멘션을 영어 위키피디아 엔티티로 매핑하는 작업입니다. 다국어 인코더(multilingual encoder) 또는 번역 단계가 필요합니다.
  • KB 노후화(KB staleness). 새로 생긴 회사, 사건, 인물은 작년 위키피디아 덤프에 없습니다. 운영 파이프라인에는 갱신 루프(refresh loop)가 필요합니다.

사용하기

2026년 기준 스택은 다음과 같습니다.

상황선택
범용 영어 + 위키피디아BLINK 또는 REL
교차 언어, KB = 위키피디아mGENRE
LLM 친화적, 하루 멘션 수가 적은 경우후보 리스트 + 제약된 JSON으로 Claude/GPT-4 프롬프트
도메인 특화 KB(의료, 법률)KB 인지 검색(KB-aware retrieval)이 있는 커스텀 BERT + 도메인 AIDA 형식 데이터셋으로 파인튜닝
매우 낮은 지연 시간이 필요한 경우정확 일치 사전 확률만 사용(Milne-Witten 베이스라인)
연구용 최첨단(SOTA)GENRE / ExtEnD / 생성형 LLM 기반 EL

2026년에 운영 환경에 배포되는 패턴은 다음과 같습니다. NER → 상호참조 해결(coref) → 각 멘션에 대한 엔티티 연결 → 클러스터를 클러스터당 하나의 정규 엔티티로 병합. 출력은 문서 내 엔티티마다 하나의 KB id이며, 멘션마다 하나가 아닙니다.

산출물 만들기

outputs/skill-entity-linker.md로 저장합니다.

---
name: entity-linker
description: Design an entity linking pipeline — KB, candidate generator, disambiguator, evaluation.
version: 1.0.0
phase: 5
lesson: 25
tags: [nlp, entity-linking, knowledge-graph]
---

Given a use case (domain KB, language, volume, latency budget), output:

Guide the student in Korean.

1. Knowledge base. Wikidata / Wikipedia / custom KB. Version date. Refresh cadence.
2. Candidate generator. Alias-index, embedding, or hybrid. Target mention recall @ K.
3. Disambiguator. Prior + context, embedding-based, generative, or LLM-prompted.
4. NIL strategy. Threshold on top score, classifier, or explicit NIL candidate.
5. Evaluation. Mention recall @ 30, top-1 accuracy, NIL-detection F1 on held-out set.

Refuse any EL pipeline without a mention-recall baseline (you cannot evaluate a disambiguator without knowing candidate gen surfaced the right entity). Refuse any pipeline using LLM-prompted EL without constrained output to valid KB ids. Flag systems where popularity bias affects minority entities (e.g. name-clashes) without domain fine-tuning.

이 스킬은 도메인 KB, 언어, 처리량, 지연 시간 예산을 입력으로 받아 지식 베이스, 후보 생성기, 중의성 해소기, NIL 전략, 평가 방식을 설계하도록 합니다. 멘션 재현율 베이스라인이 없는 엔티티 연결 파이프라인은 거부하고, 유효한 KB id로 출력을 제약하지 않는 LLM 프롬프트 기반 EL도 거부하며, 인기도 편향이 소수 엔티티(예: 이름 충돌)에 영향을 주는데 도메인 파인튜닝이 없는 시스템에는 경고를 표시(flag)하도록 안내합니다.

연습문제

  1. 쉬움. code/main.py의 사전 확률+문맥 중의성 해소기를 모호한 멘션 10개(Paris, Jordan, Apple 등)에 적용합니다. 올바른 엔티티를 직접 라벨링하고 정확도를 측정합니다.
  2. 중간. 문장 트랜스포머(sentence transformer)로 모호한 멘션 50개를 인코딩합니다. 각 후보 설명도 임베딩합니다. 임베딩 기반 중의성 해소와 자카드 문맥 중첩을 비교합니다.
  3. 어려움. 1,000 엔티티 규모의 도메인 KB를 만듭니다(예: 회사의 직원과 제품). NER + EL을 종단 간(end-to-end)으로 구현합니다. 따로 떼어둔 문장 100개에서 정밀도(precision)와 재현율(recall)을 측정합니다.

핵심 용어

용어흔한 설명실제 의미
엔티티 연결(Entity Linking; EL)위키피디아에 연결멘션을 KB의 고유 항목으로 매핑한다.
후보 생성(Candidate generation)누구일 수 있나?멘션에 대해 그럴듯한 KB 항목들의 후보 목록을 반환한다.
중의성 해소(Disambiguation)올바른 것 고르기문맥을 사용해 후보를 점수화하고 최종 답을 선택한다.
별칭 색인(Alias index)단순 조회 테이블표면형(surface form)에서 후보 엔티티들로의 매핑이다.
NILKB에 없음일치하는 KB 항목이 없음을 명시적으로 예측하는 것이다.
지식 베이스(Knowledge Base; KB)지식 베이스위키데이터, 위키피디아, DBpedia, 또는 도메인 KB이다.
AIDA-CoNLL벤치마크골드 엔티티 링크가 부여된 로이터 기사 1,393개 모음이다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

entity-linker

Design an entity linking pipeline — KB, candidate generator, disambiguator, evaluation.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.시스템의 중의성 해소 정확도(disambiguation accuracy)가 99%이지만 후보 생성(candidate generation) 단계의 멘션 재현율(mention recall)이 75%입니다. 유효한 종단 간(end-to-end) 정확도 상한은 얼마인가요?

2.머신러닝 논문에서 'Jordan'이라는 멘션이 ML 교수 마이클 I. 조던 대신 농구 선수 마이클 조던으로 연결되었습니다. 가장 가능성 높은 원인은 무엇인가요?

3.엔티티 연결 시스템이 항상 최고 점수의 후보를 할당하는 대신 NIL을 명시적으로 예측해야 하는 이유는 무엇인가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다