콘텐츠로 이동

분석 파이프라인 전체 개요

바른 형태소 분석 파이프라인 전체 개요

바른의 한국어 형태소 분석은 하나의 거대한 모델이 한 번에 답을 내놓는 방식이 아닙니다. 분절(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)는 어떻게 계산되나요?

각 형태소의 TextSpanbegin_offsetlength가 들어 있습니다. 활용·축약·생략으로 복원된 형태소는 원래 음절의 위치를 가리키며, 위치 값은 요청한 인코딩 타입 (UTF8/UTF16/UTF32)에 따라 달라집니다.

Q. 긴 문장도 분석할 수 있나요?

네. 분절은 80자 단위로 나누어 처리하므로 긴 문장도 문제없이 분석합니다. 문장 분리가 필요하면 auto_split_sentence를 켜고, 입력한 문장을 그대로 유지하려면 AnalyzeSyntaxList를 사용하세요.

도움이 되었나요?