[kakao x goorm] 생성 AI 응용 서비스 개발자 양성 과정/회고록

[kakao x goorm] 형태소 분석과 토큰화, 그리고 텍스트 전처리

Hoonia 2025. 5. 15. 15:05

자연어 처리(NLP)를 시작할 때 가장 먼저 마주하게 되는 것은 텍스트 데이터를 어떻게 분석 가능한 형태로 바꿀 것인가 하는 문제다. 우리가 말하고 쓰는 자연어는 너무나 유연하고 복잡하다. 사람에게는 직관적으로 쉽게 이해되는 한 문장도 컴퓨터에게는 단순한 문자들의 나열일 뿐이다.

예를 들어 "영화 정말 재밌었어"라는 문장을 컴퓨터가 읽고 감정을 이해하게 하려면, 단순한 문자열이 아니라 구성 요소별로 쪼개고 구조를 파악하는 과정이 필요하다. 이때 핵심이 되는 것이 바로 형태소 분석(Morpheme Analysis)이다.
형태소 분석은 단순히 문장을 자르는 것을 넘어, 언어적 의미 단위를 식별하여 기계가 처리할 수 있는 수준으로 변환하는 작업이다.

오늘은 형태소 분석의 정의, 그 필요성, 한국어와 영어의 차이, 그리고 대표 분석 도구들을 살펴보면서, NLP 전처리 파이프라인의 기초를 다졌다.

형태소(Morpheme)란?

자연어 문장은 매우 다양하고 예측 불가능한 형태로 존재한다. 이처럼 복잡한 문장을 단순한 패턴으로 처리하기 위해서는 단어보다 더 작은 단위인 형태소 단위로 분해해야 한다. 형태소는 의미를 가지는 가장 작은 언어 단위이며, 보통 단어의 기본형이라고 생각할 수 있다.

예를 들어, 갔다라는 단어는 가다(동사 어간) + 았(과거 시제) + 다(어미)로 나눌 수 있다.

형태소 분석이 왜 필요한가?

형태소 분석은 다음과 같은 이유에서 매우 중요하다:

  • 정형화된 데이터 전환: 자연어는 비정형 데이터이기 때문에, 분석을 위해 정형 데이터로 변환하는 작업이 필요하다. 형태소 분석은 이 과정을 가능하게 한다.
  • 정확한 의미 파악: 문장에서 의미 있는 단위를 추출해 문맥을 이해하고, 텍스트의 핵심을 파악하는 데 도움을 준다.
  • 기계학습 입력 구조화: 감정 분석, 텍스트 분류, 요약, 번역 등 다양한 NLP 모델에서 필요한 학습 데이터를 구성할 수 있게 한다.
  • 중복 제거 및 차원 축소: 어형이 다양한 단어들을 기본형으로 통합해 중복을 줄이고 학습 효율을 높일 수 있다.
  • 언어 특성 대응: 특히 한국어처럼 조사, 어미, 접미사 등으로 의미가 다양하게 확장되는 언어에서는 형태소 분석 없이는 정확한 처리가 어렵다.

자립 형태소 vs. 의존 형태소

구분  정의  예시
자립 형태소 단독으로 사용 가능한 형태소 사람, 먹다, 집 등
의존 형태소 혼자 사용되지 않고 반드시 다른 형태소와 결합 -다, -았, -고 등

형태소 분석기의 종류와 비교

현재 공개된 형태소 분석기는 10종 이상으로, 대표적인 도구들은 다음과 같다:

  • Okt (구 Twitter)
  • Komoran
  • Kkma
  • RhinoMorph

이 중 수업에서는 RhinoMorph를 사용하였다. 이유는 다음과 같다:

  • 사용이 간편하고,
  • 높은 정확도와 빠른 처리 속도를 가지며,
  • 다양한 OS와 언어에서 사용 가능하다.

실제로 네이버 영화평 데이터에서 비교한 결과, kkma, okt, komoran, rhino 중 rhino가 가장 빠르고 오류도 적었다는 점에서 강점을 가진다.

RhinoMorph 설치 및 간단 사용 예시

import rhinoMorph
rn = rhinoMorph.startRhino()

text = "형태소 분석을 시작해보자"
result = rhinoMorph.analysis(rn, text, pos=True)
print(result)

 

텍스트 전처리의 핵심 단계

자연어 데이터를 머신러닝 모델에 투입하기 위해서는 다음과 같은 전처리 과정이 필요하다:

  1. Tokenization (토큰화)
    • 문장을 단어 또는 형태소 단위로 분리
    • 한국어에서는 형태소 분석이 필요
    • 영어는 띄어쓰기 기반이지만, 아포스트로피(')와 같이 고려할 요소가 있음
  2. Cleaning (정제)
    • 불필요한 기호, 특수문자 제거
    • 단, 모든 특수문자를 무조건 제거하면 의미 손실이 발생할 수 있음
    • 예: "don't" → ["do", "n't"] or ["don't"]? 문맥에 따라 다름
  3. Normalization (정규화)
    • 같은 의미지만 다른 표기를 통일 ("U.S.A." → "USA", "it's" → "it is")
  4. Corpus 구성
    • 문서 집합(Corpus)을 구성하여 학습의 기반 자료로 사용

영어와 한국어의 토큰화 차이

  • 영어: 공백 기준으로 어느 정도 단어가 분리됨
    • 예: "I don't like it." → ["I", "don't", "like", "it", "."]
  • 한국어: 공백만으로는 분리 불가능
    • 예: "나는학교에간다" → ["나", "는", "학교", "에", "가", "ㄴ다"]

영어 토큰화 예제 (NLTK 활용)

import nltk
from nltk.tokenize import word_tokenize

text = "I don't like apples. They're too sour!"
tokens = word_tokenize(text)
print(tokens)
# 결과: ['I', 'do', "n't", 'like', 'apples', '.', 'They', "'re", 'too', 'sour', '!']

 

KoNLPy 설치 및 Okt 형태소 분석기

pip install konlpy
pip install JPype1
from konlpy.tag import Okt

okt = Okt()
text = "자연어 처리는 정말 재미있다."

# 형태소 분석
print(okt.pos(text))

# 명사 추출
print(okt.nouns(text))

 

전처리 이후 필요한 단계들

  1. Token Frequency / WordCloud 시각화
  2. 감정 분석 모델 학습
  3. Tokenizing → Sequencing → Padding
  4. One-hot Encoding (필요 시)
    • 일반적으로 Embedding 레이어가 있는 모델에서는 직접 One-hot을 하지 않고 인덱싱을 통해 처리함

오늘의 회고

자연어 처리에서 형태소 분석은 마치 인간의 말을 기계가 이해할 수 있는 언어로 번역해주는 첫 작업이라 할 수 있다. 오늘 학습을 통해 알게 된 가장 중요한 사실은, 단어를 그냥 자른다고 끝나는 게 아니라 의미 있는 단위로 분석하는 것이 핵심 이라는 점이었다.

한국어의 경우 어미와 조사 등으로 인해 형태가 유연하게 변형되기 때문에, 단순한 띄어쓰기나 규칙 기반 처리로는 정확한 분석이 어렵다. 이 때문에 형태소 분석기는 한국어 텍스트 처리에서 필수적이며, 이 분석이 감정 분석, 키워드 추출, 텍스트 요약, 분류 등의 핵심 작업으로 이어진다.

앞으로 자연어 기반 모델을 설계하고 학습시킬 때, 이 형태소 단위의 분석을 어떻게 효율적으로 할 것인지가 결과를 좌우하게 될 것이다. 형태소 분석을 '기술적인 전처리'가 아니라 '의미를 구성하는 언어의 구조 분석'이라고 생각하면, 훨씬 더 강력한 자연어 처리 모델을 만들 수 있을 것이다.