본문 바로가기
학습/AI

텍스트마이닝 - 한글 텍스트 전처리

by 황성안 2025. 11. 16.
728x90
반응형

🎯 학습목표

  • Colab 환경에서 한글 텍스트 데이터를 불러오고 전처리한다.
  • 텍스트마이닝의 기본 개념과 흐름을 이해한다.
  • 토큰화, 정규표현식, 형태소 분석, 불용어 제거, 이모지 제거를 실습한다.
  • 실제 쇼핑리뷰 데이터를 대상으로 빈도분석을 수행한다.

🗂️ 1️⃣ Google Colab 환경 설정

# 현재 디렉토리 확인
!pwd

# 구글 드라이브 연결
from google.colab import drive
drive.mount('/content/drive')

# 작업 폴더로 이동
%cd /content/drive/MyDrive/오르미 1기/텍스트마이닝

# 경로 확인
!pwd

✅ 이렇게 하면 Colab이 구글 드라이브와 연결되어 데이터 파일(.txt, .csv 등)을 불러올 수 있습니다.


📚 2️⃣ 텍스트마이닝 개요

개념 설명
Text Mining 비정형 텍스트에서 의미를 추출하거나 정형 데이터로 변환하는 기술
자연어처리 (NLP) 인간의 언어를 컴퓨터가 이해하고 처리하도록 하는 기술
말뭉치 (Corpus) 분석에 사용되는 전체 텍스트 데이터
문서 (Document) 말뭉치를 구성하는 개별 텍스트 단위

🧾 3️⃣ 텍스트마이닝 프로세스

데이터 수집 → 전처리 → 토큰화/정제 → 불용어 제거 → 빈도분석 → 시각화/모델링

(그림으로 PPT에 들어갈 때는 파이프라인 형식으로 표현)


🧩 4️⃣ 빈도분석 (Frequency Analysis)

✅ 데이터 불러오기

import pandas as pd

naver_df = pd.read_csv('./data/naver_shopping.txt', sep='\t', header=None)
naver_df.columns = ['별점', '리뷰']
naver_df.head()

🔹 토큰화(Tokenization)

tokens = [t for doc in naver_df.loc[:1000, '리뷰'] for t in doc.split(" ")]

“리뷰 전체를 띄어쓰기 기준으로 단어(토큰)로 분리”


🔹 단어 빈도 세기

from collections import Counter
counter = Counter(tokens)
counter.most_common(10)

등장 빈도가 높은 상위 단어 10개 출력


🧪 실습: “배송” 관련 단어만 분석

# 1. '배송'이 들어간 리뷰만 추출
배송_reviews = naver_df[naver_df['리뷰'].str.contains('배송')]

# 2. 토큰화
배송_tokens = [t for doc in 배송_reviews['리뷰'] for t in doc.split(" ")]

# 3. 빈도 카운트
from collections import Counter
배송_counter = Counter(배송_tokens)
배송_counter.most_common(20)

결과: “빠르다”, “좋아요”, “포장”, “정확” 등의 단어가 상위권에 나타남.


✳️ 5️⃣ 정규표현식 (Regular Expression)

문자열에서 패턴 기반으로 텍스트를 탐색·정제할 때 사용합니다.


예시 — 전화번호 추출

import re
p = re.compile("010-?[0-9]{4}-?\\d{4}")
p.search("tel : 010-1234-5678")

re 모듈을 사용하면 패턴 검출, 치환, 제거가 가능함.


🔹 리뷰 데이터 정제

from tqdm import tqdm

p = re.compile("[ㅋㅎㅇ~!?.0-9a-zA-Z]+")  # 제거할 패턴 정의
clean_reviews = []

for doc in tqdm(배송_reviews['리뷰']):
    temp_tokens = []
    for t in doc.split(" "):
        if p.search(t):  # 불필요한 패턴 발견 시 건너뛰기
            continue
        temp_tokens.append(t)
    clean_reviews.append(" ".join(temp_tokens))

✅ 반복 글자, 숫자, 영어, 특수문자 제거 완료.


🧠 6️⃣ 형태소 분석 (Morphological Analysis)

형태소 분석은 문장을 의미를 가지는 최소 단위(형태소)로 분리하는 과정입니다. 한글은 조사가 많기 때문에 형태소 분석기 사용이 필수입니다.


🔹 Konlpy 설치

!pip install konlpy

✅ Mecab 설치 (Colab 전용)

!git clone https://github.com/SOMJANG/Mecab-ko-for-Google-Colab.git
%cd Mecab-ko-for-Google-Colab
!bash install_mecab-ko_on_colab_light_220429.sh

🔹 형태소 분석기 비교

분석기 특징
Okt 신조어에 강함, 속도 보통
Kkma 품사 분석 매우 정교하지만 느림
Mecab 속도 빠르고 정확도 높음 (리눅스 전용)

🔹 Mecab 사용 예시

from konlpy.tag import Mecab
mecab = Mecab()

mecab.morphs("아버지가방에들어가신다.")  
# ['아버지', '가', '방', '에', '들어가', '신다', '.']

🔹 배송리뷰 형태소 분석

from tqdm import tqdm

clean_reviews_morphs = []
for doc in tqdm(clean_reviews):
    result = mecab.morphs(doc)
    clean_reviews_morphs.append(" ".join(result))

🔹 한 글자 제거 후 빈도분석

clean_reviews2 = []
for doc in tqdm(clean_reviews_morphs):
    temp_tokens = [t for t in doc.split(" ") if len(t) > 1]
    clean_reviews2.append(" ".join(temp_tokens))

🔹 명사·형용사만 추출

from collections import Counter

nouns_adjs_with_tags = []
for doc in tqdm(clean_reviews):
    for word, tag in mecab.pos(doc):
        if tag.startswith('N') or tag.startswith('VA'):
            nouns_adjs_with_tags.append((word, tag))

명사_형용사_counter = Counter(nouns_adjs_with_tags)
명사_형용사_counter.most_common(20)

✅ 배송 관련 명사·형용사 상위 단어 → “상품”, “배송”, “빠르”, “좋다”, “정확하다”, “포장” 등.


💬 7️⃣ Okt 형태소 분석기 실습

from konlpy.tag import Okt
okt = Okt()

clean_reviews_morphs_okt = []
for doc in tqdm(clean_reviews):
    result = okt.pos(doc, norm=True, stem=True)
    temp = [word for word, tag in result if tag in ['Adjective', 'Noun']]
    clean_reviews_morphs_okt.append(" ".join(temp))

norm=True → “굿굿ㅋㅋ” → “굿” ✅ stem=True → “좋았어요” → “좋다”


🧮 8️⃣ Kiwi 형태소 분석기

!pip install kiwipiepy
from kiwipiepy import Kiwi
kiwi = Kiwi()
kiwi.tokenize("아버지가방에들어가신다.")

✅ 빠르고 경량화된 형태소 분석기 ✅ Colab, Windows 모두에서 작동


🔹 불용어(Stopwords)

  • 의미 없는 단어(“그리고”, “이”, “그”) 제거
  • 빈도가 너무 높거나 낮은 단어 제거
from kiwipiepy.utils import Stopwords
stopwords = Stopwords()
stopwords.add(('결과', 'NNG'))

kiwi.tokenize("분석 결과에서 불용어만 제외", stopwords=stopwords)

🎨 9️⃣ 이모지 제거

이모지는 유니코드 기반 → emoji 패키지로 제거 가능

!pip install emoji
import emoji

# 제거
emoji.replace_emoji("이야 맛도😢🙂☎️🚒")

# 의미만 유지
emoji.demojize("☎️🚒➕☑️🎀🥴👍맛도리")
# "전화번호_emoji 소방차_emoji 맛도리"

📘 전체 요약

단계 핵심 내용
빈도분석 자주 등장하는 단어로 주제 파악
정규표현식 불필요한 문자, 반복 문자 제거
형태소 분석 어근/조사 분리하여 정확한 단어 분석
불용어 처리 의미 없는 단어 제거
이모지 처리 감성 분석 시 노이즈 제거
결과 “배송”, “빠르다”, “좋다” 등 주요 키워드 추출 성공

✨ 한 줄 요약

Colab에서 한글 리뷰 데이터를 불러와 정규표현식, 형태소 분석, 불용어·이모지 제거를 거쳐 텍스트를 깨끗하게 정제하고, 의미 있는 단어의 빈도분석을 수행하였다.


 

728x90
반응형

'학습 > AI' 카테고리의 다른 글

한국어 텍스트 감성분류  (0) 2025.11.17
데이터 전처리 핵심  (0) 2025.11.16
한글 텍스트 전처리와 감성분류  (0) 2025.11.15
RNN 핵심 정리  (0) 2025.11.14
임베딩(Embedding) 이란?  (0) 2025.11.13