🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

NLP 개요와 텍스트 전처리 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 3. · 14 Views

NLP 개요와 텍스트 전처리 완벽 가이드

자연어 처리(NLP)의 기초 개념부터 텍스트 전처리의 핵심 기법까지 다룹니다. 토큰화, 정규화, 불용어 제거, 형태소 분석 등 실무에서 바로 활용할 수 있는 전처리 파이프라인을 배워봅니다.


목차

  1. NLP란 무엇인가
  2. 주요 NLP 태스크 소개
  3. 토큰화 (Tokenization)
  4. 정규화와 정제
  5. 불용어 제거
  6. 형태소 분석 (한국어)

1. NLP란 무엇인가

김개발 씨는 최근 회사에서 새로운 프로젝트를 맡게 되었습니다. 고객 리뷰를 분석해서 긍정과 부정을 자동으로 분류하는 시스템을 만들어야 합니다.

하지만 막상 시작하려니 막막했습니다. "컴퓨터가 어떻게 사람의 말을 이해할 수 있지?"

**NLP(Natural Language Processing)**는 컴퓨터가 인간의 언어를 이해하고 처리할 수 있도록 하는 인공지능의 한 분야입니다. 마치 외국어를 배운 통역사가 두 나라 사람 사이에서 소통을 도와주는 것처럼, NLP는 인간과 컴퓨터 사이의 언어 장벽을 허물어줍니다.

이를 통해 챗봇, 번역기, 감성 분석 등 다양한 응용 프로그램을 만들 수 있습니다.

다음 코드를 살펴봅시다.

# NLP의 기본 흐름을 보여주는 간단한 예제
import nltk
from nltk.tokenize import word_tokenize

# 원본 텍스트 입력
raw_text = "NLP는 정말 흥미로운 분야입니다!"

# 1단계: 텍스트를 단어 단위로 분리 (토큰화)
tokens = word_tokenize(raw_text)
print(f"토큰화 결과: {tokens}")

# 2단계: 각 토큰을 소문자로 변환 (정규화)
normalized = [token.lower() for token in tokens]
print(f"정규화 결과: {normalized}")

# 이것이 NLP 전처리의 가장 기본적인 흐름입니다

김개발 씨는 입사 2년 차 개발자입니다. 어느 날 팀장님이 회의실로 불렀습니다.

"김 대리, 우리 쇼핑몰에 쌓인 고객 리뷰가 10만 건이 넘는데, 이걸 일일이 읽을 수가 없어요. 자동으로 분석할 수 있는 방법 없을까요?" 김개발 씨는 고민에 빠졌습니다.

사람이 쓴 글을 컴퓨터가 어떻게 이해할 수 있단 말일까요? 숫자나 이미지는 그렇다 치더라도, 언어는 너무나 복잡하고 모호한 것 아닌가요?

바로 이 문제를 해결하는 것이 NLP, 즉 자연어 처리입니다. 쉽게 비유하자면, NLP는 마치 숙련된 통역사와 같습니다.

한국어를 전혀 모르는 외국인 친구가 있다고 상상해보세요. 여러분이 하는 말을 그 친구가 이해하려면 통역사가 필요합니다.

통역사는 여러분의 말을 듣고, 의미를 파악한 뒤, 친구가 이해할 수 있는 형태로 바꿔서 전달합니다. NLP도 마찬가지입니다.

인간의 언어를 컴퓨터가 이해할 수 있는 형태로 바꿔주는 역할을 합니다. NLP가 없던 시절에는 어땠을까요?

컴퓨터는 오직 숫자만 이해할 수 있었습니다. "좋아요"라는 단어와 "싫어요"라는 단어가 컴퓨터에게는 그저 의미 없는 기호의 나열이었습니다.

개발자들이 일일이 규칙을 만들어야 했고, 조금만 표현이 달라져도 인식하지 못했습니다. "굿!", "좋음", "괜찮네요" 같은 다양한 표현을 모두 처리하려면 끝없는 규칙을 추가해야 했습니다.

NLP의 등장으로 상황이 완전히 달라졌습니다. 이제 컴퓨터는 텍스트의 패턴을 학습하고, 문맥을 파악하며, 심지어 감정까지 분석할 수 있게 되었습니다.

구글 번역이 자연스러운 번역을 제공하고, 시리와 알렉사가 우리 말을 알아듣는 것이 모두 NLP 덕분입니다. 위의 코드를 살펴보겠습니다.

먼저 원본 텍스트를 입력받습니다. 이 텍스트는 아직 컴퓨터가 이해하기 어려운 상태입니다.

그래서 word_tokenize 함수를 사용해 텍스트를 단어 단위로 쪼갭니다. 이것을 토큰화라고 합니다.

마지막으로 모든 토큰을 소문자로 변환하는 정규화 과정을 거칩니다. 이렇게 전처리된 데이터는 이제 본격적인 분석에 사용될 준비가 된 것입니다.

실제 현업에서 NLP는 어디에 활용될까요? 고객 서비스 챗봇, 스팸 메일 필터링, 뉴스 기사 자동 분류, 검색 엔진 최적화, 음성 인식 서비스 등 셀 수 없이 많습니다.

여러분이 매일 사용하는 스마트폰 키보드의 자동 완성 기능도 NLP 기술이 적용된 것입니다. 하지만 NLP에는 어려운 점도 있습니다.

인간의 언어는 모호성이 있습니다. "배가 아프다"에서 배는 과일일까요, 신체 부위일까요, 아니면 탈것일까요?

문맥에 따라 의미가 완전히 달라집니다. 또한 신조어, 은어, 오타 등 끊임없이 변화하는 언어의 특성도 NLP를 어렵게 만듭니다.

다시 김개발 씨의 이야기로 돌아가봅시다. 팀장님의 요청을 받은 김개발 씨는 NLP에 대해 공부하기 시작했습니다.

"아, 그래서 텍스트 전처리가 중요하구나!" 컴퓨터가 텍스트를 제대로 분석하려면, 먼저 데이터를 깔끔하게 정리해야 한다는 것을 깨달았습니다.

실전 팁

💡 - NLP 프로젝트를 시작하기 전에 항상 데이터의 특성을 먼저 파악하세요

  • 한국어 NLP는 영어와 다른 전처리가 필요하므로 적합한 라이브러리를 선택해야 합니다

2. 주요 NLP 태스크 소개

박시니어 씨가 김개발 씨에게 물었습니다. "NLP가 뭔지는 알겠는데, 구체적으로 뭘 할 수 있는지 알아?" 김개발 씨는 챗봇 정도만 떠올랐습니다.

"NLP로 할 수 있는 일이 그렇게 많나요?"

NLP 태스크는 자연어 처리로 해결할 수 있는 다양한 문제 유형을 말합니다. 마치 의사가 진료, 수술, 처방 등 다양한 업무를 하듯이, NLP도 분류, 추출, 생성 등 여러 가지 작업을 수행할 수 있습니다.

프로젝트 목표에 맞는 적절한 태스크를 선택하는 것이 성공의 첫걸음입니다.

다음 코드를 살펴봅시다.

# 대표적인 NLP 태스크들을 간단히 체험해보는 예제
from textblob import TextBlob

# 1. 감성 분석 (Sentiment Analysis)
text = "This product is absolutely amazing!"
blob = TextBlob(text)
sentiment = blob.sentiment.polarity  # -1(부정) ~ 1(긍정)
print(f"감성 점수: {sentiment}")  # 긍정적인 문장

# 2. 개체명 인식 (Named Entity Recognition) 예시
sample = "Apple was founded by Steve Jobs in California."
# 실제로는 spaCy나 transformers 사용
entities = ["Apple(회사)", "Steve Jobs(인물)", "California(장소)"]
print(f"인식된 개체: {entities}")

# 3. 텍스트 분류 카테고리 예시
categories = ["스포츠", "정치", "경제", "연예", "기술"]
print(f"뉴스 분류 카테고리: {categories}")

김개발 씨는 NLP 공부를 계속했습니다. 그런데 자료를 찾아볼수록 머리가 복잡해졌습니다.

감성 분석, NER, 기계 번역, 질의응답... 용어가 너무 많았습니다.

"이게 다 뭐지?" 박시니어 씨가 화이트보드 앞에 섰습니다. "NLP 태스크를 크게 분류해볼게요.

쉽게 생각하면 됩니다." 첫 번째는 **텍스트 분류(Text Classification)**입니다. 이메일이 스팸인지 아닌지, 뉴스가 어떤 카테고리인지, 리뷰가 긍정인지 부정인지 판단하는 것입니다.

마치 우체부가 편지를 주소별로 분류하는 것과 같습니다. 김개발 씨가 맡은 고객 리뷰 분석 프로젝트가 바로 이 텍스트 분류에 해당합니다.

두 번째는 **감성 분석(Sentiment Analysis)**입니다. 텍스트 분류의 특수한 형태로, 글에 담긴 감정이나 의견을 파악합니다.

"이 영화 진짜 재밌어요!"는 긍정, "서비스가 너무 불친절해요"는 부정으로 분류됩니다. SNS 여론 분석이나 브랜드 평판 모니터링에 많이 활용됩니다.

세 번째는 **개체명 인식(Named Entity Recognition, NER)**입니다. 텍스트에서 사람, 장소, 조직, 날짜 등 의미 있는 개체를 찾아내는 작업입니다.

"삼성전자가 서울에서 신제품을 발표했다"라는 문장에서 삼성전자(회사), 서울(장소)을 추출합니다. 뉴스 기사 분석이나 정보 추출에 필수적인 기술입니다.

네 번째는 **기계 번역(Machine Translation)**입니다. 구글 번역이나 파파고처럼 한 언어를 다른 언어로 자동 변환하는 것입니다.

최근에는 Transformer 기반 모델 덕분에 품질이 비약적으로 향상되었습니다. 다섯 번째는 **질의응답(Question Answering)**입니다.

주어진 문서나 지식 베이스에서 질문에 대한 답을 찾아내는 태스크입니다. ChatGPT나 구글 검색의 직접 답변 기능이 이에 해당합니다.

여섯 번째는 **텍스트 요약(Text Summarization)**입니다. 긴 문서를 핵심만 추려서 짧게 요약하는 작업입니다.

뉴스 기사 요약이나 논문 초록 생성에 활용됩니다. 위의 코드에서는 TextBlob을 사용한 간단한 감성 분석을 보여줍니다.

polarity 값이 1에 가까울수록 긍정적인 문장입니다. 실제 프로덕션 환경에서는 더 정교한 모델을 사용하지만, 기본 원리는 같습니다.

박시니어 씨가 덧붙였습니다. "중요한 건 태스크를 명확히 정의하는 거야.

'고객 리뷰 분석'이라는 막연한 목표보다 '리뷰를 긍정/부정/중립으로 분류'라는 구체적인 태스크로 정의해야 해." 김개발 씨는 고개를 끄덕였습니다. 이제 자신의 프로젝트가 감성 분석 태스크라는 것을 명확히 알게 되었습니다.

목표가 분명해지니 어디서부터 시작해야 할지도 보이기 시작했습니다.

실전 팁

💡 - 프로젝트 시작 전 어떤 NLP 태스크인지 명확히 정의하세요

  • 복잡한 문제는 여러 태스크의 조합으로 해결할 수 있습니다

3. 토큰화 (Tokenization)

김개발 씨가 드디어 코드를 작성하기 시작했습니다. 첫 번째 관문은 텍스트를 컴퓨터가 처리할 수 있는 단위로 쪼개는 것이었습니다.

"문장을 그냥 띄어쓰기로 나누면 되는 거 아닌가?" 하지만 현실은 그렇게 단순하지 않았습니다.

**토큰화(Tokenization)**는 텍스트를 의미 있는 단위인 토큰으로 분리하는 과정입니다. 마치 레고 블록을 개별 조각으로 분해하는 것과 같습니다.

문장을 단어, 문장, 또는 서브워드 단위로 나눌 수 있으며, 이는 모든 NLP 전처리의 첫 단계입니다.

다음 코드를 살펴봅시다.

# 다양한 토큰화 방법 비교
from nltk.tokenize import word_tokenize, sent_tokenize

text = "Hello, World! NLP is amazing. Let's learn it."

# 1. 단어 토큰화 (Word Tokenization)
word_tokens = word_tokenize(text)
print(f"단어 토큰: {word_tokens}")
# ['Hello', ',', 'World', '!', 'NLP', 'is', 'amazing', '.', ...]

# 2. 문장 토큰화 (Sentence Tokenization)
sent_tokens = sent_tokenize(text)
print(f"문장 토큰: {sent_tokens}")
# ['Hello, World!', 'NLP is amazing.', "Let's learn it."]

# 3. 단순 공백 분리와의 차이
simple_split = text.split()
print(f"단순 분리: {simple_split}")
# ['Hello,', 'World!', ...] - 문장부호가 붙어있음

# NLTK는 문장부호를 별도 토큰으로 분리합니다

김개발 씨는 간단하게 생각했습니다. 파이썬의 split() 함수로 띄어쓰기 기준으로 나누면 되지 않을까?

그래서 코드를 작성했습니다. 하지만 결과를 보고 당황했습니다.

"Hello,"가 하나의 토큰으로 나왔습니다. 쉼표가 단어에 붙어버린 것입니다.

"World!"도 마찬가지였습니다. 이대로 분석하면 "Hello"와 "Hello,"가 서로 다른 단어로 취급됩니다.

같은 의미인데 말이죠. 박시니어 씨가 설명했습니다.

"그래서 토큰화가 필요한 거야. 단순히 공백으로 자르는 게 아니라, 의미 있는 단위로 똑똑하게 분리해야 해." 토큰화를 레고에 비유해봅시다.

레고로 만든 집이 있습니다. 이 집을 분석하려면 먼저 개별 블록으로 분해해야 합니다.

그래야 "이 집은 빨간 블록 10개, 파란 블록 15개로 만들어졌구나"라고 파악할 수 있습니다. 토큰화도 마찬가지입니다.

문장이라는 구조물을 토큰이라는 블록으로 분해하는 것입니다. 토큰화에는 여러 종류가 있습니다.

단어 토큰화는 텍스트를 단어 단위로 분리합니다. 가장 흔히 사용되는 방식입니다.

문장 토큰화는 텍스트를 문장 단위로 분리합니다. 긴 문서를 처리할 때 먼저 문장으로 나누고, 각 문장을 다시 단어로 나누는 2단계 접근이 일반적입니다.

최근에는 서브워드 토큰화도 많이 사용됩니다. 단어를 더 작은 단위로 쪼개는 방식입니다.

예를 들어 "playing"을 "play"와 "ing"로 분리합니다. 이렇게 하면 처음 보는 단어도 구성 요소를 통해 의미를 유추할 수 있습니다.

GPT나 BERT 같은 현대 언어 모델들이 이 방식을 사용합니다. 위의 코드를 자세히 살펴보겠습니다.

NLTK의 word_tokenize 함수는 "Hello,"를 "Hello"와 ","로 분리합니다. 단순 split()과의 결정적인 차이입니다.

sent_tokenize는 마침표, 느낌표 등을 인식해서 문장 경계를 찾아냅니다. "Let's"처럼 축약형도 올바르게 처리합니다.

하지만 주의할 점이 있습니다. 영어용 토큰화 도구를 한국어에 그대로 적용하면 제대로 작동하지 않습니다.

한국어는 띄어쓰기가 불규칙하고, 조사가 단어에 붙어있기 때문입니다. "나는"에서 "나"와 "는"을 분리하려면 한국어 전용 도구가 필요합니다.

이 부분은 뒤에서 형태소 분석을 다룰 때 자세히 알아보겠습니다. 김개발 씨는 NLTK로 토큰화를 적용했습니다.

결과가 훨씬 깔끔해졌습니다. "이제 다음 단계로 넘어갈 수 있겠군요!" 토큰화가 끝나면 이 토큰들을 정제하고 정규화하는 과정이 기다리고 있습니다.

실전 팁

💡 - 영어는 NLTK나 spaCy, 한국어는 KoNLPy나 Mecab을 사용하세요

  • 서브워드 토큰화는 Hugging Face의 tokenizers 라이브러리가 편리합니다

4. 정규화와 정제

토큰화를 마친 김개발 씨는 데이터를 살펴보다가 한숨을 쉬었습니다. "GOOD", "good", "Good"이 전부 다른 토큰으로 처리되고 있었습니다.

게다가 "안녕하세요ㅋㅋㅋㅋㅋ" 같은 데이터도 있었습니다. 이대로 분석해도 될까요?

**정규화(Normalization)**는 같은 의미의 다른 표현을 하나로 통일하는 과정이고, **정제(Cleaning)**는 분석에 불필요한 노이즈를 제거하는 과정입니다. 마치 도서관 사서가 책을 정리할 때 같은 책의 다른 판본을 한 곳에 모으고, 훼손된 페이지는 제거하는 것과 같습니다.

다음 코드를 살펴봅시다.

import re

def normalize_text(text):
    # 1. 소문자 변환 (대소문자 통일)
    text = text.lower()

    # 2. 반복되는 문자 정규화 (ㅋㅋㅋㅋ -> ㅋㅋ)
    text = re.sub(r'(.)\1{2,}', r'\1\1', text)

    # 3. 특수문자 제거 (알파벳, 숫자, 공백, 한글만 유지)
    text = re.sub(r'[^a-zA-Z0-9\s가-힣]', '', text)

    # 4. 연속 공백 제거
    text = re.sub(r'\s+', ' ', text).strip()

    return text

# 테스트
sample = "이 제품 정말 좋아요!!!! GOOD!!! ㅋㅋㅋㅋㅋ"
cleaned = normalize_text(sample)
print(f"원본: {sample}")
print(f"정제 후: {cleaned}")
# 출력: "이 제품 정말 좋아요 good ㅋㅋ"

김개발 씨가 수집한 고객 리뷰 데이터는 엉망진창이었습니다. 어떤 사람은 "AMAZING!!!"이라고 썼고, 어떤 사람은 "amazing"이라고 썼습니다.

둘 다 같은 의미인데 컴퓨터는 다른 단어로 인식합니다. 이런 데이터로 학습하면 모델이 제대로 된 패턴을 찾기 어렵습니다.

박시니어 씨가 말했습니다. "데이터 과학에서 유명한 말이 있어.

Garbage In, Garbage Out. 쓰레기를 넣으면 쓰레기가 나온다는 뜻이야.

전처리가 중요한 이유지." 정규화는 같은 의미를 가진 다양한 표현을 하나로 통일하는 작업입니다. 가장 기본적인 것이 소문자 변환입니다.

"Apple", "APPLE", "apple"을 모두 "apple"로 통일합니다. 물론 고유명사를 구분해야 하는 경우에는 주의가 필요합니다.

**어간 추출(Stemming)**과 **표제어 추출(Lemmatization)**도 정규화의 일종입니다. "running", "runs", "ran"을 모두 "run"으로 통일합니다.

영어에서 특히 중요한 기법입니다. Stemming은 규칙 기반으로 빠르지만 정확도가 떨어지고, Lemmatization은 사전 기반으로 정확하지만 느립니다.

정제는 노이즈를 제거하는 작업입니다. HTML 태그, URL, 이메일 주소, 특수문자 등 분석에 불필요한 요소를 제거합니다.

소셜 미디어 데이터라면 "ㅋㅋㅋㅋㅋㅋ"처럼 과도하게 반복된 문자도 정제 대상입니다. 위의 코드를 분석해봅시다.

정규표현식(regex)을 활용해 다양한 정제 작업을 수행합니다. (.)\1{2,}는 같은 문자가 3번 이상 반복되는 패턴을 찾아 2번으로 줄입니다.

[^a-zA-Z0-9\s가-힣]는 알파벳, 숫자, 공백, 한글을 제외한 모든 문자를 제거합니다. 하지만 맹목적인 정제는 위험합니다.

감성 분석에서 "좋아요!!!"의 느낌표는 강한 긍정을 나타내는 신호일 수 있습니다. 이를 무조건 제거하면 중요한 정보가 사라집니다.

따라서 분석 목적에 맞게 정제 수준을 조절해야 합니다. 또 다른 주의점은 정보 손실입니다.

대소문자를 통일하면 "Apple(회사)"과 "apple(과일)"의 구분이 사라집니다. 숫자를 제거하면 "아이폰13"과 "아이폰14"를 구분할 수 없게 됩니다.

모든 전처리에는 트레이드오프가 있습니다. 김개발 씨는 정규화와 정제 함수를 작성했습니다.

테스트 결과, 데이터가 한결 깔끔해졌습니다. "이제 같은 단어가 여러 형태로 흩어져 있는 문제는 해결됐네요." 하지만 아직 갈 길이 남았습니다.

다음은 분석에 불필요한 단어를 제거하는 차례입니다.

실전 팁

💡 - 정규표현식(regex)은 텍스트 정제의 필수 도구입니다. 기본 문법을 익혀두세요

  • 정제 전후의 데이터를 반드시 눈으로 확인하여 과도한 정보 손실이 없는지 점검하세요

5. 불용어 제거

김개발 씨가 토큰화된 결과를 살펴보다가 의문이 생겼습니다. "은", "는", "이", "가", "the", "a", "is"...

이런 단어들이 엄청나게 많았습니다. 이것들도 다 분석에 포함시켜야 할까요?

**불용어(Stopwords)**는 "은", "는", "이", "가", "the", "a" 처럼 빈번하게 등장하지만 실질적인 의미를 담지 않는 단어들입니다. 마치 요리에서 재료를 손질할 때 껍질이나 뿌리를 제거하는 것처럼, 분석의 핵심에 집중하기 위해 이런 단어들을 제거합니다.

다음 코드를 살펴봅시다.

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

# NLTK 불용어 다운로드 (최초 1회)
# nltk.download('stopwords')
# nltk.download('punkt')

# 영어 불용어 제거 예제
text = "This is a very important document about machine learning"
tokens = word_tokenize(text.lower())

# 영어 불용어 목록 로드
stop_words = set(stopwords.words('english'))
print(f"불용어 예시: {list(stop_words)[:10]}")

# 불용어 제거
filtered_tokens = [word for word in tokens if word not in stop_words]

print(f"원본 토큰: {tokens}")
print(f"불용어 제거 후: {filtered_tokens}")
# 출력: ['important', 'document', 'machine', 'learning']

# 한국어 불용어는 별도 정의 필요
korean_stopwords = ['은', '는', '이', '가', '을', '를', '의', '에', '에서']

김개발 씨가 토큰 빈도를 분석했습니다. 가장 많이 등장한 단어 10개를 뽑아보니 충격적인 결과가 나왔습니다.

1위는 "이", 2위는 "가", 3위는 "는"... 정작 중요한 단어인 "제품", "품질", "배송" 같은 것들은 한참 아래에 있었습니다.

"이런 단어들이 분석에 무슨 도움이 될까요?" 김개발 씨의 질문에 박시니어 씨가 답했습니다. "그런 단어들을 불용어라고 해.

문장의 문법적 구조를 만들어주지만, 의미 분석에는 별 도움이 안 돼." 불용어를 요리에 비유해봅시다. 생선을 손질할 때 비늘, 내장, 지느러미를 제거합니다.

이것들이 생선의 일부이긴 하지만, 실제로 먹는 살코기에는 해당하지 않습니다. 불용어 제거도 마찬가지입니다.

텍스트의 핵심 의미를 담은 단어만 남기고 나머지를 걷어내는 것입니다. 불용어를 제거하면 몇 가지 이점이 있습니다.

첫째, 데이터 크기가 줄어듭니다. 불용어는 전체 텍스트의 상당 부분을 차지합니다.

이를 제거하면 저장 공간과 처리 시간을 절약할 수 있습니다. 둘째, 분석 품질이 향상됩니다.

노이즈가 줄어들어 핵심 단어의 패턴이 더 명확하게 드러납니다. 위의 코드에서 NLTK는 영어 불용어 목록을 기본 제공합니다.

약 179개의 영어 불용어가 포함되어 있습니다. 하지만 한국어는 기본 제공되지 않아 직접 정의해야 합니다.

다행히 인터넷에 한국어 불용어 목록이 공개되어 있으니 참고하면 됩니다. 하지만 불용어 제거에도 주의할 점이 있습니다.

문맥에 따라 불용어의 정의가 달라질 수 있습니다. 예를 들어 "to be or not to be"라는 문장에서 "to", "be", "or", "not"은 모두 불용어입니다.

하지만 이 단어들을 제거하면 문장의 의미 자체가 사라집니다. 또한 특정 도메인에서는 일반적인 불용어가 중요한 의미를 가질 수 있습니다.

의학 분야에서 "not"은 진단의 핵심일 수 있습니다. "암이 발견되지 않았다(not found)"와 "암이 발견되었다(found)"는 완전히 다른 의미입니다.

이런 경우 불용어 목록을 신중하게 조정해야 합니다. 김개발 씨는 한국어 불용어 목록을 직접 작성했습니다.

프로젝트에 맞게 "배송", "상품" 같은 단어도 불용어에 추가했습니다. 쇼핑몰 리뷰에서 이 단어들은 너무 흔해서 분석에 도움이 되지 않았기 때문입니다.

"불용어 목록은 프로젝트마다 커스터마이징이 필요하군요."

실전 팁

💡 - 불용어 목록은 프로젝트 특성에 맞게 직접 조정하세요

  • 불용어 제거 전후의 분석 결과를 비교하여 적절한 수준을 찾으세요

6. 형태소 분석 (한국어)

영어 전처리는 어느 정도 완성되었습니다. 하지만 김개발 씨의 진짜 과제는 한국어 리뷰 분석이었습니다.

"나는", "나를", "나의"... 한국어는 영어처럼 띄어쓰기만으로 단어를 구분할 수 없었습니다.

"한국어는 대체 어떻게 토큰화해야 하죠?"

**형태소 분석(Morphological Analysis)**은 한국어 텍스트를 문법적으로 의미 있는 최소 단위인 형태소로 분리하는 과정입니다. 한국어는 교착어로, 조사와 어미가 단어에 붙어서 사용됩니다.

마치 레고 블록이 서로 끼워져 있는 것처럼 형태소가 결합되어 있어, 이를 분리하려면 전용 도구가 필요합니다.

다음 코드를 살펴봅시다.

# KoNLPy 설치 필요: pip install konlpy
from konlpy.tag import Okt, Komoran

# 형태소 분석기 초기화
okt = Okt()

text = "아이폰 정말 좋아요! 배송도 빨랐습니다."

# 1. 형태소 분석 (품사 태깅 포함)
morphs_with_pos = okt.pos(text)
print(f"형태소 분석: {morphs_with_pos}")
# [('아이폰', 'Noun'), ('정말', 'Noun'), ('좋아요', 'Adjective'), ...]

# 2. 명사만 추출
nouns = okt.nouns(text)
print(f"명사 추출: {nouns}")
# ['아이폰', '정말', '배송']

# 3. 정규화 및 어간 추출 옵션
normalized = okt.pos(text, norm=True, stem=True)
print(f"정규화+어간 추출: {normalized}")
# [('아이폰', 'Noun'), ('정말', 'Noun'), ('좋다', 'Adjective'), ...]
# '좋아요' -> '좋다'로 변환됨

김개발 씨는 영어 토큰화를 한국어에 적용해보았습니다. 결과는 참담했습니다.

"나는"이 하나의 토큰으로, "나를"도 하나의 토큰으로 처리되었습니다. 둘 다 "나"라는 같은 대상을 가리키는데 다른 단어로 취급된 것입니다.

박시니어 씨가 설명했습니다. "한국어와 영어는 근본적으로 다른 언어 구조를 가지고 있어.

영어는 단어가 독립적으로 쓰이지만, 한국어는 교착어야. 어근에 조사나 어미가 달라붙어서 의미가 완성돼." 교착어를 이해하기 위해 비유를 들어봅시다.

영어 단어는 마치 독립된 집들과 같습니다. "I", "love", "you"가 각각 떨어져 있습니다.

반면 한국어는 아파트와 같습니다. "나"라는 기본 구조에 "는", "를", "의" 같은 호수가 붙어서 하나의 건물을 이룹니다.

이 호수들을 분리해내려면 건물의 구조를 아는 도구가 필요합니다. 그것이 바로 형태소 분석기입니다.

한국어 형태소 분석기로는 여러 가지가 있습니다. **Okt(Open Korean Text)**는 트위터에서 개발한 것으로, 신조어 처리에 강합니다.

Komoran은 Shineware에서 개발했고, 공백이 없는 텍스트 처리에 강점이 있습니다. Mecab은 일본어 형태소 분석기를 한국어에 맞게 수정한 것으로, 속도가 가장 빠릅니다.

위의 코드에서 Okt를 사용한 형태소 분석을 보여줍니다. pos() 메서드는 각 형태소와 품사 태그를 함께 반환합니다.

Noun은 명사, Adjective는 형용사를 의미합니다. nouns() 메서드를 사용하면 명사만 간편하게 추출할 수 있어, 키워드 분석에 유용합니다.

특히 주목할 부분은 stem=True 옵션입니다. 이 옵션을 사용하면 "좋아요"가 "좋다"로, "빨랐습니다"가 "빠르다"로 변환됩니다.

동사와 형용사를 원형으로 되돌리는 어간 추출이 자동으로 수행됩니다. 이렇게 하면 "좋아요", "좋습니다", "좋았어요"가 모두 "좋다"로 통일됩니다.

형태소 분석에도 한계가 있습니다. 가장 큰 문제는 미등록어입니다.

형태소 분석기는 사전에 기반하는데, 신조어나 고유명사는 사전에 없으면 제대로 분석되지 않습니다. "아이폰"이나 "카카오톡" 같은 단어는 사용자 사전에 추가해야 할 수도 있습니다.

또한 분석기마다 결과가 다를 수 있습니다. 같은 문장을 Okt, Komoran, Mecab에 넣으면 서로 다른 결과가 나올 수 있습니다.

어떤 분석기가 정답이라고 할 수 없고, 프로젝트 특성에 맞는 것을 선택해야 합니다. 속도가 중요하면 Mecab, 신조어 처리가 중요하면 Okt를 고려해보세요.

김개발 씨는 Okt를 선택하고 형태소 분석 파이프라인을 완성했습니다. 드디어 한국어 리뷰를 제대로 분석할 수 있게 되었습니다.

"이제 진짜 감성 분석을 시작할 수 있겠네요!" 전처리의 긴 여정이 끝나고, 본격적인 NLP 모델링이 기다리고 있었습니다.

실전 팁

💡 - 한국어 NLP에서는 형태소 분석이 필수입니다. Mecab이 속도, Okt가 신조어 처리에 유리합니다

  • 프로젝트에 자주 등장하는 고유명사는 사용자 사전에 미리 등록하세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#NLP#Tokenization#TextPreprocessing#KoreanNLP#NLP,Text Processing

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.