본문 바로가기
데이터 분석 및 시각화

[데이터분석] 텍스트마이닝 실습

by 바다의 공간 2024. 8. 12.

텍스트마이닝 실습을 해보았습니다.

 

# 실습 내용
# * 텍스트 데이터 로딩
# * 한글 추출
# * 명사 추출
# * 글자수 2개 이상인 단어 추출
# * 단어별 빈도 수 구하기
# * 빈도 수 상위 10개 막대그래프 생성
# * 워드클라우드 생성
# * 구름모양 워드클라우드 생성
import pandas as pd
import re
import konlpy

def p(str):
    print(str, '\n')

# 텍스트 파일 오픈
text = open('../assets/gimi.txt', encoding='utf-8').read()
# p(gimi)

#한글이 아닌 모든 데이터 제거
text = re.sub("[^가-힣]", " ",text)
# p(text)

#명사 추출
hannanum = konlpy.tag.Hannanum()
nouns= hannanum.nouns(text)
p(nouns)

#추출한 명사를 데이터 프레임만들기
gimi_word = pd.DataFrame({"word":nouns})
p(gimi_word)

# 명사 글자수 파생변수 만들기
gimi_word['count'] = gimi_word['word'].str.len()
p(gimi_word)

#글자수가 2개 이상인 것만 추출
gimi_word = gimi_word.query("count>=2")
p(gimi_word)

#글자수로 정렬
word_count = gimi_word.sort_values('count')
p(word_count)

#단어별 빈도수 구하고 정렬하기
word_count = word_count.groupby("word", as_index=False)
word_count = word_count.agg(n=("word", "count"))
word_count = word_count.sort_values("n", ascending=False)
p(word_count)

#단어별 빈도 막대그래프용 데이터 20개 추출
top20 = word_count.head(20)

#막대그래프 그리기
import seaborn as sns
import matplotlib.pyplot as plt

#그래프 설정하기
plt.rcParams.update({
    "font.family":"Malgun Gothic", #글자체
    "figure.dpi": "120", #해상도
    "figure.figsize":[6.5 , 6] #화면 크기
})
sns.barplot(data=top20, y="word", x="n")
plt.show()

#워드 클라우드 생성
from wordcloud import WordCloud

#한글포트 동기화
font = '../assets/DoHyeon-Regular.ttf'

dic_word = word_count.set_index("word").to_dict()['n']

#워드 클라우드 설정
wc = WordCloud(
    random_state= 1234, #모양을 랜덤하게 만들기 위한 난수
    font_path= font, # 폰트
    width= 400, # 넓이
    height= 400, #높이
    background_color= "white" #배경색
)

#워드 클라우드 생성
img_wordcloud = wc.generate_from_frequencies(dic_word)

#워드클라우드 그리기
plt.figure(figsize=(10,10)) #가로 세로 크기
plt.axis('off') #테두리 선 없애기
plt.imshow(img_wordcloud) #워드클라우드 이미지 보여주기
plt.show()

#구름모양 워드클라우드 만들기


#구름모양 이미지 로드
from PIL import Image
#이미지 파일을 메모리에 로딩
icon = Image.open("../assets/cloud.png")

#마스크(mask) 생성
import numpy as np

#icon이미지 크기만한 하얀색 마스크 이미지 로드
img = Image.new("RGB", icon.size, (255,255,255))
img.paste(icon, icon) #마스크 붙이기
img = np.array(img) #numpy배열로 만들기

wc = WordCloud(
    random_state = 1234,
    font_path= font,
    width= 400,
    height= 400,
    background_color= "white",
    mask = img, #마스크
    colormap= 'inferno' #컬러맵 타입
)
#워드 클라우드 생성
img_wordcloud = wc.generate_from_frequencies(dic_word)

#워드클라우드 그리기
plt.figure(figsize=(10,10)) #가로 세로 크기
plt.axis('off') #테두리 선 없애기
plt.imshow(img_wordcloud) #워드클라우드 이미지 보여주기
plt.show()

 


잘 안되었던점 :

1. 항상 강사님께서 지정해준 변수이름으로 하다가 내가 변수이름을 직접 네이밍하니 뭔가 좀 헷갈렸다.

그래도 한줄한줄 어디서 어떻게 연결되는지를 보다보니 변수위치는 확인할 수 있었다.

 

2. pandas에서 사용하는 sort 메소드가 또  다른다는것을 체감했다.

DataFrame 객체에 sort라는 메서드가 없기 때문에 발생합니다. pandas에서 데이터를 정렬할 때는 sort_values() 또는 sort_index() 메서드를 사용해야 합니다.

 

3. 워드클라우드 생성할때  word를 딕셔너리형태로 변경해주어야한다는것을 정확하게 다시 해봐야겠다.

 

단계별 설명:

  1. set_index("word"):
    • set_index("word")는 word_count DataFrame에서 "word" 컬럼을 인덱스로 설정하는 것입니다.
    • 이렇게 하면 "word" 컬럼의 값들이 인덱스가 되고, 다른 열들(여기서는 "n")이 이 인덱스와 연결됩니다.
    예를 들어, word_count DataFrame이 다음과 같다고 가정해 봅시다:wordn
    apple 10
    banana 5
    cherry 8
    set_index("word")를 사용하면 다음과 같은 DataFrame이 됩니다:n
    apple 10
    banana 5
    cherry 8
    여기서 "word" 컬럼이 인덱스로 설정되었습니다.
  2. .to_dict():
    • to_dict() 메서드는 DataFrame을 사전(dictionary)으로 변환합니다.
    • 이때 set_index("word")를 통해 설정된 인덱스 "word"는 사전의 키(key)가 되고, "n" 컬럼의 값이 사전의 값(value)이 됩니다.
    • 이 결과는 {"apple": 10, "banana": 5, "cherry": 8} 같은 형식의 사전이 됩니다.
  3. ['n']:
    • to_dict() 메서드는 기본적으로 각 열을 키로 하는 사전 형태로 변환합니다. ['n']을 사용하면 이 사전에서 "n" 열에 해당하는 부분만 추출할 수 있습니다.
    • 즉, {'word': {'apple': 10, 'banana': 5, 'cherry': 8}}에서 {'apple': 10, 'banana': 5, 'cherry': 8} 부분만 추출하게 됩니다.

워드클라우드 생성에 필요한 이유:

워드클라우드를 생성할 때, 입력 데이터는 다음과 같은 형태여야 합니다:

  • 키(key): 단어
  • 값(value): 단어의 빈도수 (혹은 가중치)

즉, 워드클라우드를 생성하려면 "단어"를 키로, "빈도수"를 값으로 가지는 사전(dictionary) 형태의 데이터가 필요합니다. 위의 코드에서는 word_count라는 DataFrame을 이러한 사전 형태로 변환하여 WordCloud에 입력할 수 있는 형식으로 만드는 것입니다.