티스토리 뷰
오늘은 한국어 전처리 패키지(SOYNLP), 언어 모델, 그리고 카운트 기반 단어 표현 기법을 학습했습니다.
SOYNLP를 활용한 단어 토크나이징부터 TF-IDF를 활용한 단어 중요도 분석까지 다양한 기법을 실습하며,
텍스트 데이터를 효과적으로 다룰 수 있는 방법을 익힐 수 있었습니다.

1. SOYNLP를 활용한 한국어 전처리
SOYNLP는 학습 기반의 한국어 전처리 패키지로, 형태소 분석기가 아닌 단어 점수표를 학습하여 토큰화를 수행하는 특징이 있습니다.
먼저, SOYNLP를 활용하기 위해 훈련 데이터를 다운로드하고 코퍼스를 준비했습니다.
import urllib.request
from soynlp import DoublespaceLineCorpus
from soynlp.word import WordExtractor
# 훈련 데이터 다운로드
urllib.request.urlretrieve("https://raw.githubusercontent.com/lovit/soynlp/master/tutorials/2016-10-20.txt",
filename="2016-10-20.txt")
# 훈련 데이터를 다수의 문서로 분리
corpus = DoublespaceLineCorpus("2016-10-20.txt")
# 데이터 개수 확인
print(len(corpus))
1.1 SOYNLP의 응집 확률 (Cohesion Probability)
응집 확률은 문자열이 하나의 단어로 얼마나 자주 등장하는지를 나타내는 척도입니다.
즉, 특정 문자열이 분리되지 않고 연결된 형태로 나타날 확률을 계산하여 단어인지 아닌지를 판단할 수 있습니다.
from soynlp.word import WordExtractor
# 단어 점수표 생성
word_extractor = WordExtractor()
word_extractor.train(corpus)
word_score_table = word_extractor.extract()
# 응집 확률 확인
print(word_score_table["반포한강"].cohesion_forward)
print(word_score_table["반포한강공원"].cohesion_forward)
1.2 SOYNLP의 브랜칭 엔트로피 (Branching Entropy)
브랜칭 엔트로피는 주어진 문자열 뒤에 얼마나 다양한 문자가 올 수 있는지를 나타내는 척도입니다.
값이 높을수록 단어의 끝일 가능성이 높아 해당 지점에서 단어를 분리할 수 있습니다.
print(word_score_table["디스"].right_branching_entropy)
print(word_score_table["디스플"].right_branching_entropy)
print(word_score_table["디스플레이"].right_branching_entropy)
1.3 SOYNLP의 L 토크나이저
한국어에서 단어는 보통 L(왼쪽) + R(오른쪽) 토큰으로 나뉘는 경우가 많습니다.
SOYNLP의 **L 토크나이저(LTokenizer)**는 가장 높은 점수를 가진 L 토큰을 찾아 단어를 분리합니다.
from soynlp.tokenizer import LTokenizer
# L 토크나이저 생성
scores = {word: score.cohesion_forward for word, score in word_score_table.items()}
l_tokenizer = LTokenizer(scores=scores)
# 토큰화 수행
print(l_tokenizer.tokenize("국제사회와 우리의 노력들로 범죄를 척결하자", flatten=False))
1.4 최대 점수 토크나이저 (MaxScoreTokenizer)
띄어쓰기가 없는 문장에서도 점수가 높은 글자 조합을 찾아 분리하는 토크나이저입니다.
from soynlp.tokenizer import MaxScoreTokenizer
# 최대 점수 토크나이저 생성
maxscore_tokenizer = MaxScoreTokenizer(scores=scores)
# 띄어쓰기 없는 문장 토큰화
print(maxscore_tokenizer.tokenize("국제사회와우리의노력들로범죄를척결하자"))
1.5 반복 문자 정규화
SNS나 채팅 데이터에서는 ㅋㅋㅋ, ㅎㅎㅎ, ㅠㅠㅠ 같은 반복되는 표현이 많습니다.
SOYNLP의 정규화 기능을 활용하면 반복 문자를 하나의 단어로 처리할 수 있습니다.
from soynlp.normalizer import *
# 반복 문자 정규화
print(emoticon_normalize('앜ㅋㅋㅋㅋ이영화존잼쓰ㅠㅠㅠㅠㅠ', num_repeats=2))
print(repeat_normalize('와하하하하하하하하하핫', num_repeats=2))
2. 카운트 기반 단어 표현
2.1 Bag of Words (BoW) 모델
Bag of Words는 단어의 등장 횟수만 고려하는 단어 표현 방식입니다.
문장에서 단어들의 등장 빈도를 세어 벡터로 변환하는 방식입니다.
from konlpy.tag import Okt
okt = Okt()
def build_bag_of_words(document):
document = document.replace('.', '')
tokenized_document = okt.morphs(document)
word_to_index = {}
bow = []
for word in tokenized_document:
if word not in word_to_index.keys():
word_to_index[word] = len(word_to_index)
bow.insert(len(word_to_index) -1, 1)
else:
index = word_to_index.get(word)
bow[index] = bow[index] + 1
return word_to_index, bow
# 문장별 BoW 생성
doc1 = "정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다."
vocab, bow = build_bag_of_words(doc1)
print('vocabulary :', vocab)
print('bag of words vector :', bow)
2.2 사이킷런 CountVectorizer 활용
CountVectorizer는 BoW를 자동으로 생성하는 사이킷런의 기능입니다.
from sklearn.feature_extraction.text import CountVectorizer
corpus = ['you know I want your love. because I love you.']
vector = CountVectorizer()
# 벡터 변환
print('bag of words vector :', vector.fit_transform(corpus).toarray())
print('vocabulary :', vector.vocabulary_)
2.3 TF-IDF (Term Frequency-Inverse Document Frequency)
TF-IDF는 단어의 빈도와 중요도를 동시에 고려하는 가중치 방식입니다.
단순한 등장 빈도(BOW)보다 문서에서 중요한 단어를 더 잘 구별할 수 있습니다.
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
'you know I want your love',
'I like you',
'what should I do',
]
# TF-IDF 변환
tfidfv = TfidfVectorizer().fit(corpus)
# 벡터 출력
print(tfidfv.transform(corpus).toarray())
print(tfidfv.vocabulary_)
3. 결론 및 정리
3.1 오늘 배운 내용
오늘은 SOYNLP를 활용한 한국어 전처리 기법과 단어 토크나이징, 카운트 기반 단어 표현 방법을 학습했습니다.
응집 확률과 브랜칭 엔트로피를 이용한 단어 점수 계산, 다양한 토크나이저 기법, 그리고 반복 문자 정규화를 실습했습니다.
또한, BoW와 TF-IDF를 활용한 단어 표현 방식도 익히며, 텍스트 데이터를 벡터로 변환하는 방법을 배웠습니다.
3.2 추가 분석 가능성
추가적으로 **워드 임베딩(Word2Vec, FastText)**을 활용한 단어 의미 분석을 진행하면 더 풍부한 텍스트 표현이 가능합니다.
또한, **딥러닝 기반 자연어 처리 모델(BERT, GPT)**과 결합하여 보다 정교한 텍스트 분석 및 감성 분석을 수행할 수 있습니다.
앞으로 다양한 NLP 기법을 적용하여 한국어 데이터 분석을 더욱 심화해 보면 좋을 것 같습니다.
'LG U+ Why Not SW 부트캠프 5기' 카테고리의 다른 글
| [Python] 타이타닉 생존자 예측 모델 실습 (0) | 2025.03.27 |
|---|---|
| [Python] 문서 유사도 분석 (0) | 2025.03.12 |
| 파이썬을 이용한 미국 항공 운항 데이터 분석(실습) (1) | 2025.02.28 |
| 주식 시세 분석 및 데이터 처리 (0) | 2025.02.21 |
| 시계열 데이터 분석 및 전처리 (0) | 2025.02.21 |
