NER(Named Entity Recognition, 개체명 인식)은 텍스트에서 인물, 장소, 조직, 날짜, 금액 등의 개체를 자동으로 식별하고 분류하는 자연어처리 태스크다.
NER 태그 유형
| 태그 | 설명 | 예시 |
|---|
| PER | 인물 | 홍길동, Elon Musk |
| ORG | 조직/기관 | 삼성전자, AWS |
| LOC/GPE | 장소/지정 정치 지명 | 서울, 미국 |
| DAT | 날짜 | 2024년 1월 |
| MON | 금액 | 5억 원, $100M |
| MISC | 기타 | 이벤트, 제품명 |
BIO 태깅 방식
문장: "삼성전자가 서울에서 신제품을 발표했다."
태그: B-ORG I-ORG O B-LOC O O O O O
B: 개체의 시작 (Beginning)
I: 개체 계속 (Inside)
O: 개체 아님 (Outside)
python
from transformers import pipeline, AutoTokenizer, AutoModelForTokenClassification
import torch
# 사전 학습된 한국어 NER 모델
ner_pipeline = pipeline(
"token-classification",
model="snunlp/KR-FinBert-SC",
aggregation_strategy="simple",
device=0 if torch.cuda.is_available() else -1,
)
text = "삼성전자는 2024년 3월에 서울 강남구에서 갤럭시 S24를 50만 원에 출시했다."
entities = ner_pipeline(text)
for entity in entities:
print(f"{entity['word']} → {entity['entity_group']} (신뢰도: {entity['score']:.3f})")
커스텀 NER 학습 (spaCy)
python
import spacy
from spacy.training import Example
nlp = spacy.blank("ko")
ner = nlp.add_pipe("ner")
# 학습 데이터 정의
TRAIN_DATA = [
("네이버가 라인을 인수했다.", {"entities": [(0, 3, "ORG"), (5, 8, "ORG")]}),
("이재용이 서울에서 발표했다.", {"entities": [(0, 3, "PER"), (6, 8, "LOC")]}),
]
for _, annotations in TRAIN_DATA:
for ent in annotations["entities"]:
ner.add_label(ent[2])
optimizer = nlp.begin_training()
for epoch in range(30):
examples = []
for text, annotations in TRAIN_DATA:
doc = nlp.make_doc(text)
examples.append(Example.from_dict(doc, annotations))
nlp.update(examples, sgd=optimizer)
nlp.to_disk("./my-ko-ner")