분석 파이프라인 전체 개요
바른 형태소 분석 파이프라인 전체 개요
바른의 한국어 형태소 분석은 하나의 거대한 모델이 한 번에 답을 내놓는 방식이 아닙니다. 분절(Segmenter) → 품사 태깅(PosTagger) → 후처리(Postprocess) 의 세 단계를 거쳐서, 입력한 문장을 문장·어절·형태소의 계층 구조로 정확하게 분석해냅니다.
이 글은 "바른이 한국어를 어떻게 분석하는가"를 한눈에 보여주기 위한 개요입니다. 각 단계의 자세한 원리는 분절 규칙, 복합명사 분해, 용언 활용·형태 복원 문서에서 이어집니다.
graph TD
IN[입력 문장] --> SEG[분절 Segmenter];
SEG --> TAG[품사 태깅 PosTagger];
TAG --> POST[후처리 Postprocess];
POST --> SPACE[띄어쓰기·붙여쓰기 보정];
POST --> COMP[복합명사·복합용언 처리];
POST --> OFFSET[형태 복원·위치 추적];
SPACE --> OUT[문장·어절·형태소 결과];
COMP --> OUT;
OFFSET --> OUT;
1단계 — 분절(Segmenter)
분절 단계는 어절 내부를 의미 있는 조각으로 나누는 과정입니다.
바른은 이 단계에서 트랜스포머 기반의 분절 모델(seg-model.onnx)을 사용합니다.
- 입력 문장을 글자 단위로 모델에 넣고, 각 글자에 분절 레이블을 붙입니다.
- 한 번에 처리하는 길이는 80자이며, 이보다 긴 문장은 적절히 나누어 처리합니다.
- 이 과정에서 체언(N), 조사(J), 용언(V), 어미(E), 부사어(A), 관형어(M), 감탄사(I), 기호(S)의 8가지 큰 형태 단위로 구분해냅니다.
왜 분절을 따로 하나요?
트랜스포머 모델에서 한국어 토크나이저는 늘 골치 아픈 문제입니다. 한국어는 교착어라서 하나의 어절 안에 여러 형태소가 붙어 있고, 활용·축약·생략이 끊임없이 일어납니다. 바른은 품사를 붙이기 전에 먼저 "어디서 끊어야 하는가"를 전담하는 분절 단계를 두어, 이 문제를 정면으로 해결합니다.
2단계 — 품사 태깅(PosTagger)
분절된 조각 하나하나에 품사를 붙이는 단계입니다.
품사 태깅 모델(tag-model.onnx)이 각 형태소에 국립국어원 기준 47개 품사 중 하나를 배정합니다.
- 한 번에 처리하는 시퀀스 길이는 40입니다.
- 각 형태소에는 태그와 함께
probability(softmax 확신도)가 붙습니다. - 결과 형태소가 어디에서 왔는지(
out_of_vocab)도 함께 표시합니다. 워드 임베딩에 있던 단어인지, 미등록단어인지, 사용자 사전·기본 사전·우리말샘에서 온 단어인지를 구별해줍니다.
3단계 — 후처리(Postprocess)
모델이 내놓은 형태소 배열을 사람이 읽기 좋은 결과로 다듬는 단계입니다. 바른의 후처리는 단순한 정리가 아니라 한국어 형태론 지식이 집약된 핵심 단계입니다.
- 띄어쓰기·붙여쓰기 보정:
auto_spacing,auto_jointing옵션에 따라 어절 경계를 조정합니다.아름다운강산→아름다운 강산,떨여 졌는데→떨어졌는데와 같이 바로잡습니다. - 복합명사·복합용언 처리: 등재된 복합명사를 분해하고, 보조용언 구성을 인식합니다.
- 형태 복원·위치 추적: 활용·축약·생략으로 복원된 형태소가 원문 음절의 정확한 위치를 가지도록
오프셋을 다시 계산합니다. 예를 들어
킨데요는키+이+ㄴ데+요로 복원되는데,키·이·ㄴ이 모두 같은 시작 위치를 가지도록 처리합니다.
결과 구조
분석 결과는 다음과 같은 계층 구조를 가집니다.
문장은 어절(Token)의 배열이고, 어절은 형태소(Morpheme)의 배열입니다.
모든 조각은 위치 정보를 담은 TextSpan 단위로 표현됩니다.
classDiagram
Sentence *-- Token
Token *-- Morpheme
class Sentence {
list~Token~ tokens
TextSpan text
String refined
}
class Token {
list~Morpheme~ morphemes
TextSpan text
String lemma
String tagged
}
class Morpheme {
Tag tag
float probability
OutOfVocab outOfVocab
}
| 단계 | 사용 모델/처리 | 핵심 역할 |
|---|---|---|
| 분절 | seg-model.onnx |
어절 내부를 8대 형태 단위로 분리 |
| 품사 태깅 | tag-model.onnx |
47품사 배정 + 확신도·출처 표시 |
| 후처리 | 규칙 + 사전 | 띄어쓰기·복합어·위치 복원으로 결과 완성 |
한 문장으로 정리하면
바른은 끊고(분절) → 이름표 붙이고(태깅) → 다듬는(후처리) 세 단계로, 99.6%의 품사 태깅 정확도와 99.7%의 어절 분리/복원 정확도를 만들어냅니다.
자주 묻는 질문
Q. 분절과 품사 태깅을 왜 분리하나요?
한국어는 한 어절 안에 여러 형태소가 활용·축약된 형태로 붙습니다. "어디서 끊을지"를 먼저 정확히 정한 뒤 품사를 붙이면, 각 단계가 더 쉬운 문제를 풀게 되어 전체 정확도가 올라갑니다.
Q. 형태소의 위치(offset)는 어떻게 계산되나요?
각 형태소의 TextSpan에 begin_offset과 length가 들어 있습니다.
활용·축약·생략으로 복원된 형태소는 원래 음절의 위치를 가리키며, 위치 값은 요청한 인코딩 타입
(UTF8/UTF16/UTF32)에 따라 달라집니다.
Q. 긴 문장도 분석할 수 있나요?
네. 분절은 80자 단위로 나누어 처리하므로 긴 문장도 문제없이 분석합니다.
문장 분리가 필요하면 auto_split_sentence를 켜고, 입력한 문장을 그대로 유지하려면
AnalyzeSyntaxList를 사용하세요.
도움이 되었나요?