쥬니어 분석가

[파이썬/NLP] 형태소 분석, 노래 가사 워드클라우드 feat.Mecab,Okt,kkma 본문

python

[파이썬/NLP] 형태소 분석, 노래 가사 워드클라우드 feat.Mecab,Okt,kkma

jyuuni 2024. 1. 25. 11:12
반응형

1. 형태소 분석기 비교

 

한국어 자연어 처리를 위해서는 KoNLPy라는 파이썬 패키지를 사용할 수 있습니다. 

형태소 분석기로는 Okt(Open Korea Text), 메캅(Mecab), 코모란(Komoran), 한나눔(Hannanum), 꼬꼬마(Kkma)가 있습니다.

저는 이 중 Okt, Kkma, Mecab 형태소 분석기를 사용하려고 합니다.

 

각각의 메소드는 아래와 같은 기능을 갖고 있습니다.

1) morphs : 형태소 추출
2) pos : 품사 태깅(Part-of-speech tagging)
3) nouns : 명사 추출

 

이제 파이썬에서 형태소 분석기를 사용하여 토큰화를 해보도록 합시다.

아이고 하기싫어

from konlpy.tag import Okt
from konlpy.tag import Kkma
from eunjeon import Mecab

 

저는 Mecab을 konlpy에 있는 것이 아니라 새롭게 설치하여 사용했습니다.

제 파이썬 버전이 낮아서 그런지 konlpy에서 mecab이 불러와지지 않더라구요.

 

세 형태소 분석기를 사용해서 동일한 문장에 대해 형태소 추출, 품사 태깅, 명사 추출 모두 진행해 보겠습니다.

 

1. kkma

print('kkma 형태소 분석 :',kkma.morphs("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('kkma 품사 태깅 :',kkma.pos("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('kkma 명사 추출 :',kkma.nouns("공부하기 싫어요 티스토리 업로드는 더 싫어요"))

kkma 형태소 분석기를 사용해 텍스트 토큰화를 진행한 결과

 

2. Okt

print('OKT 형태소 분석 :',okt.morphs("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('OKT 품사 태깅 :',okt.pos("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('OKT 명사 추출 :',okt.nouns("공부하기 싫어요 티스토리 업로드는 더 싫어요"))

OKT 형태소 분석기를 사용해 텍스트 토큰화를 진행한 결과

 

3. mecab

print('mecab 형태소 분석 :',mecab.morphs("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('mecab 품사 태깅 :',mecab.pos("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('mecab 명사 추출 :',mecab.nouns("공부하기 싫어요 티스토리 업로드는 더 싫어요"))

mecab 형태소 분석기를 사용해 텍스트 토큰화를 진행한 결과

 

각 분석기마다 다르게 추출하는 것을 알 수 있습니다.

본인이 생각하기에 자기와 더 잘 맞는 분석기를 사용하면 될 것 같습니다.

 

이제는 동일한 문장에 대해 명사 추출만 진행해 보겠습니다.

 

문장은 제가 좋아하는 문상훈의 책 내용 중 하나인..

내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다.

print('OKT 명사 추출 :',okt.nouns("내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다."))
print('kkma 명사 추출 :',kkma.nouns("내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다."))
print('mecab 명사 추출 :',mecab.nouns("내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다."))

동일한 문장에 대해 세 형태소 분석기를 사용해 명사 추출한 결과

 

 

동일한 문장인데 명사를 추출해 보니 조금씩 다르게 나오는 것을 알 수 있습니다.

마치 객관식 답안 후보 같은 모습이네요.

 

저는 이중에 Mecab을 활용해서 형태소분석을 하려고 합니다.

별다른 이유는 없고 그냥 조금 더 정확한 것 같았고, 인식을 잘 못하는 경우가 있더라도 사용자 사전에 추가하면 되니..

 

 

2. 노래 가사 워드클라우드

 

이제 Mecab을 활용해서 간단하게 텍스트 토큰화 후 워드클라우드를 그려보겠습니다.

어떤 거로 그려볼까 고민하다가 한국어만 있는 노래로 그려보고 싶다는 생각이 들었습니다.

그래서 구글 혹은 네이버에 노래 가사 검색 후 복사해서 하나의 txt 파일에 저장하여 불러왔습니다.

노래는 아이유의 밤편지, 윤상의 넌 쉽게 말했지만, 윤종신의 좋니로 가져왔습니다.

 

# 텍스트 파일 불러오기
file_path = r"C:\Users\바탕 화면\노래가사.txt" # 실제 파일 경로로 변경
with open(file_path, 'r', encoding='utf-8') as file:
    text = file.read()

# 문장 토큰화
sentences = text.split('.')  # 예시로 간단하게 마침표(.)를 기준으로 문장을 나눔

# 형태소 분석 및 토큰화
tokenized_sentences = []
for sentence in sentences:
    tokens = mecab.morphs(sentence)
    tokenized_sentences.append(tokens)

# 결과 확인
print(tokenized_sentences)

 

단어가 너무 많군요. 전체로 해서 의미 있는 결과가 나올까요?

 

  • 문장 전체 워드클라우드
# 토큰화된 문장을 하나의 리스트로 펼치기
all_tokens = [token for sentence in tokenized_sentences for token in sentence]

# 리스트를 공백으로 연결하여 문자열로 변환
text_data = ' '.join(all_tokens)

#마스크 적용
im = Image.open(r"C:\Users\JJ\Downloads\동그라미.png") # 이미지 파일 읽어오기

mask = Image.new("RGB", im.size, (255,255,255))
mask.paste(im,im)
mask = np.array(mask)
    
font_path =r"C:\Users\JJ\AppData\Local\Microsoft\Windows\Fonts\PretendardVariable.ttf"
# WordCloud 생성
wordcloud = WordCloud(font_path=font_path, background_color='white', mask = mask,width=800, height=400).generate(text_data)

# 워드클라우드 시각화
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

노래 가사 워드클라우드 생성을 통해 출력된 원형 모양의 텍스트 뭉치

 

우리, 사랑, 처럼, 에게, 그리워라는 단어가 많이 나오는 것 같습니다.

으니는 뭐지 생각해 봤는데 좋니에서 나오는 단어였어요.

 

  • 명사만 추출 후 워드클라우드
nouns_sentences=[]

for sentence in sentences:
    nouns = mecab.nouns(sentence)
    nouns_sentences.append(nouns)

# 결과 확인
print(nouns_sentences)

 

# 토큰화된 문장을 하나의 리스트로 펼치기
all_nouns = [nouns for sentence in nouns_sentences for nouns in sentence]

# 리스트를 공백으로 연결하여 문자열로 변환
text_data = ' '.join(all_nouns)

#마스크 적용
im = Image.open(r"C:\Users\JJ\Downloads\동그라미.png") # 이미지 파일 읽어오기

mask = Image.new("RGB", im.size, (255,255,255))
mask.paste(im,im)
mask = np.array(mask)
    
font_path =r"C:\Users\JJ\AppData\Local\Microsoft\Windows\Fonts\PretendardVariable.ttf"
# WordCloud 생성
wordcloud = WordCloud(font_path=font_path, background_color='white', mask = mask,width=800, height=400).generate(text_data)

# 워드클라우드 시각화
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

명사 텍스트만 추출 후 새롭게 작성된 원형 모양의 워드클라우드

 

역시 감성 발라드라 사랑이라는 단어가 가장 많이 나오는 것 같네요.

감성을 충전하게 되는 실습이었습니다.

 

 

Mecab에서 사용자 사전을 추가하고 싶다면 아래 글을 참고해주세요!

 

[NLP/Error] Mecab 사용자 사전 추가 , 디렉토리 경로 오류 해결

C:\mecab의 폴더는 아래와 같은 3개의 폴더로 이뤄져 있습니다. 물론 사람마다 폴더의 경로는 다르니 자신의 mecab 폴더 경로를 확인해 주시면 됩니다. mecab-ko-dic : mecab의 단어 사전 tools : 단어 사전

jiyoon1ing.tistory.com

 

반응형