Tokenization·POS Tagging·NER로 구성하는 NLP 텍스트 처리 파이프라인
Tokenization, POS Tagging, NER의 역할과 처리 파이프라인, 품질 지표, 한국어·영어 구현 및 운영 설계를 정리한다.
2026-08-14 · 최초 발행 2024-04-29
텍스트를 구조화하는 과정
NLP 파이프라인은 문장을 그대로 모델이나 검색 인덱스에 넘기지 않는다. 먼저 텍스트를 의미 있는 단위로 나누고, 각 단위의 문법적 역할을 붙인 뒤, 업무상 중요한 고유 표현을 분리한다. Tokenization, POS Tagging, Named Entity Recognition(NER)은 이 흐름의 중심에 놓인다.
Tokenization은 문장을 토큰으로 나누는 작업이다. 공백 기반, 규칙 기반, 형태소 기반, 서브워드(BPE, WordPiece) 기반 방식이 있으며, 한국어처럼 교착어 특성이 있는 언어에서는 형태소 또는 서브워드 기반 접근이 적합하다.
POS Tagging은 토큰마다 품사(Part-of-Speech, POS)를 부여한다. HMM/CRF 같은 전통 기법에서 BiLSTM-CRF, Transformer 기반 모델로 발전해 왔다. 사용할 태그셋은 언어와 도메인에 따라 UPOS(Universal POS), 세종 품사 등으로 달라질 수 있다.
NER은 문장 속 인물, 기관, 장소, 시간, 제품처럼 고유명 또는 개념에 해당하는 범위를 찾는 작업이다. 범위 표기에는 BIO/BILOU 스킴을 사용하며, Gazetteer 보강과 사전학습 언어모델(PLM) 파인튜닝을 함께 쓰는 방식이 일반적이다.
입력 정규화부터 결과 전달까지
텍스트 처리 품질은 모델 이전 단계에서 흔들리기도 한다. Unicode 정규화(NFC/NFKC), 공백·특수문자 표준화, 이모티콘·URL·이메일에 대한 토큰화 규칙을 정해 입력 잡음을 줄이고 재현성을 확보해야 한다. 한글과 영어가 섞이는 입력을 다룬다면 언어 감지와 스크립트 혼용 처리 정책도 필요하다.
빈 입력이나 과도하게 긴 입력은 조기 종료하거나 청크로 나눈다. 인코딩 오류는 NFKC 정규화를 시도하고, 실패하면 로깅 후 건너뛴다. 모델 호출이 타임아웃되면 재시도 횟수를 제한하고 백오프를 적용한다.
토크나이저와 모델이 만드는 운영상의 차이
공백·규칙 기반 토크나이저는 빠르지만 OOV에 취약하다. 형태소 기반 방식은 의미를 보존하기 좋지만 설치와 언어 의존성이 따른다. 서브워드 방식은 OOV에 강하지만 해석성이 낮아질 수 있다. 스트리밍이나 온라인 처리에서는 상태 없는 토크나이저를 선호하고, 문맥에 민감한 규칙은 최소화하는 편이 낫다.
품사 태깅은 규칙, 통계, 신경 기반 접근 중 도메인과 리소스에 맞춰 선택한다. 태그셋을 통일하고 매핑 테이블을 관리하지 않으면 후속 시스템의 해석이 달라진다. 문맥 길이, 동형이의어, 복합어를 다루려면 문장 단위 입력과 문장경계(SBD) 품질도 함께 관리해야 한다.
NER에서는 BIO/BILOU 스키마를 일관되게 적용하고, PER·ORG·LOC·DATETIME·PRODUCT 같은 엔터티 타입을 정의한 뒤 도메인 요구에 맞게 확장한다. Gazetteer와 규칙을 결합하면 커버리지를 보강할 수 있으며, 임계치와 컨피던스에 따른 후처리가 필요하다.
검색, 운영 분석, 개인정보 처리에서의 사용
검색과 질의응답에서는 품사 정보를 바탕으로 키헤드를 추출하고, NER로 질의 속 엔터티를 확정할 수 있다. 인덱싱 과정에서는 고빈도 불용어를 제거하고 엔터티 필드별 역색인을 구성한다.
고객센터 티켓이나 로그에서는 제품명, 버전, 오류코드를 엔터티로 추출해 원인과 증상 매핑을 자동화할 수 있다. 품사 패턴은 불만 유형을 클러스터링하고 우선순위를 정하는 데도 활용된다.
보안·컴플라이언스 환경에서는 이름, 전화, 계좌, 주민번호 엔터티를 탐지한 뒤 마스킹 또는 가명처리에 사용한다. 컨피던스와 규칙을 함께 적용해 재식별 위험을 낮추고, 감사 로그는 유지한다.
| 관점 | Tokenization | POS Tagging | NER |
|---|---|---|---|
| 성능(정확도) | 규칙 일치율 중심 | 태그 정확도(Acc) | F1(라벨별/Micro) |
| 확장성 | 선형 확장 용이 | 문맥 길이 증가 시 비용 상승 | 라벨 수 증가 시 데이터 요구량 증가 |
| 일관성 | 버전 고정 시 높음 | 태그셋 변경 영향 큼 | 도메인 이동 시 드리프트 큼 |
| 안정성 | 예측가능/저리스크 | 모델 타임아웃 관리 필요 | 컨피던스·백오프 설계 필수 |
| 운영 편의 | 가볍고 모듈화 용이 | 사전/모델 관리 필요 | 가젯티어·룰·모델 동시 관리 |
검색·추천 정확도는 515%p 향상하고, NER 도입 시 FAQ 매칭 정확도는 820%p 개선될 수 있다. 상담 자동 분류 재작업률은 2040% 감소하며 PII 누락 검출률은 1025% 향상한다. 경량 모델 기준으로 처리 지연 p95 100ms 이하를 유지하면서 재현성과 감사 가능성을 높이는 것이 운영 목표다.
품질 목표를 서빙까지 연결하는 방법
처음에는 언어, 도메인, 라벨셋을 정의하고 F1≥0.9 같은 품질 목표와 지연 목표를 잡는다. 이후 말뭉치를 정제하고 어노테이션 가이드를 만들며, IAA(annotator agreement)를 검증한 뒤 BIO/BILOU 스키마를 확정한다.
토크나이저, 태그셋, NER 모델을 선택하는 과정에서는 Gazetteer와 정규식 규칙도 함께 설계한다. 컨피던스 임계치와 백오프 기준을 정한 뒤 교차검증, 라벨별 confusion 분석, OOV와 도메인 용어를 포함한 에러 카탈로그화를 수행한다.
배포 후에는 A/B 테스트, p95/p99 모니터링, 드리프트 탐지, 롤백과 카나리 전략을 운영한다. 하드 예제를 보강하고 반자동 재어노테이션과 모델·룰 갱신을 주기화해야 품질 저하를 관리할 수 있다.
Python으로 확인하는 처리 결과
전제조건은 다음과 같다.
- Python 3.10+
- pip install spacy stanza transformers[torch]
- 최신 모델/패키지 버전 확인 필요
영어 텍스트 처리
# python -m spacy download en_core_web_sm
import spacy
nlp = spacy.load("en_core_web_sm") # v3.x
doc = nlp("Apple plans to open a new office in Seoul in 2025.")
tokens = [t.text for t in doc]
pos = [(t.text, t.pos_) for t in doc]
ents = [(e.text, e.label_, e.start_char, e.end_char) for e in doc.ents]
print("Tokens:", tokens)
print("POS:", pos)
print("NER:", ents)
Stanza를 이용한 한국어 토큰화와 품사 태깅
import stanza
stanza.download('ko') # 1회
nlp = stanza.Pipeline('ko', processors='tokenize,pos', tokenize_pretokenized=False)
doc = nlp("애플이 2025년에 서울에 새로운 오피스를 설립할 계획이다.")
tokens = [w.text for s in doc.sentences for w in s.words]
pos = [(w.text, w.upos, w.xpos) for s in doc.sentences for w in s.words]
print("Tokens:", tokens)
print("POS:", pos)
Hugging Face 기반 한국어 NER
공개 모델 예로 monologg/koelectra-base-v3-ner 등이 있으며, 최신 정보 확인이 필요하다.
from transformers import pipeline
ner = pipeline("token-classification",
model="monologg/koelectra-base-v3-ner", # 최신 가용 모델 확인 필요
aggregation_strategy="simple") # 연속 토큰 병합
text = "애플이 2025년에 서울에 새로운 오피스를 설립할 계획이다."
results = ner(text)
# 결과: [{'entity_group': 'ORG', 'score': 0.99, 'word': '애플', 'start': 0, 'end': 2}, ...]
# 임계치 적용 예
threshold = 0.8
filtered = [r for r in results if r['score'] >= threshold]
print(filtered)
토크나이저와 모델 버전은 requirements.txt와 모델 리비전으로 고정해 재현성을 확보한다. 장문은 문장 단위로 청크화하고, 배치 추론(batch_size) 및 max_seq_length를 조정해 p95 지연시간을 안정화한다. 한국어 NER은 도메인 특화 어노테이션을 추가해 파인튜닝하면 F1 5~10%p 개선을 기대할 수 있다.
개인정보와 서빙 구조에서 확인할 지점
PII 엔터티 마스킹은 저장 전에 적용하고 원문 접근 권한을 최소화한다. 로그에는 컨피던스와 스팬만 저장한다. 컴플라이언스 환경은 리콜을 우선하고, 업무 영향이 큰 환경은 프리시전을 우선하는 식으로 과검출·미검출 정책을 구분한다.
경량 태깅은 CPU 마이크로서비스로, 대형 NER은 GPU 배치와 서빙을 혼합하는 구조를 고려할 수 있다. 지연시간에 민감한 경로에는 distillation과 INT8 양자화를 활용한다. 동일 쿼리와 엔터티를 캐시하고, Gazetteer 규칙은 사이드카에서 핫 리로드하는 방식도 적용할 수 있다.
라벨셋 버전과 태그 매핑 테이블을 관리하고, 드리프트 및 성능 회귀 테스트를 파이프라인화한다. 제3자 모델을 업데이트할 때는 토크나이저 변경 여부를 감시하는 호환성 테스트가 필요하다.