텍스트마이닝 실습을 해보았습니다.
# 실습 내용
# * 텍스트 데이터 로딩
# * 한글 추출
# * 명사 추출
# * 글자수 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를 딕셔너리형태로 변경해주어야한다는것을 정확하게 다시 해봐야겠다.
단계별 설명:
- set_index("word"):
- set_index("word")는 word_count DataFrame에서 "word" 컬럼을 인덱스로 설정하는 것입니다.
- 이렇게 하면 "word" 컬럼의 값들이 인덱스가 되고, 다른 열들(여기서는 "n")이 이 인덱스와 연결됩니다.
apple 10 banana 5 cherry 8 apple 10 banana 5 cherry 8 - .to_dict():
- to_dict() 메서드는 DataFrame을 사전(dictionary)으로 변환합니다.
- 이때 set_index("word")를 통해 설정된 인덱스 "word"는 사전의 키(key)가 되고, "n" 컬럼의 값이 사전의 값(value)이 됩니다.
- 이 결과는 {"apple": 10, "banana": 5, "cherry": 8} 같은 형식의 사전이 됩니다.
- ['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에 입력할 수 있는 형식으로 만드는 것입니다.
'데이터 분석 및 시각화' 카테고리의 다른 글
[데이터분석]텍스트마이닝 , 워드클라우드, 지도시각화 (0) | 2024.08.14 |
---|---|
[데이터분석] 인터렉티브, 마크다운 실습 (0) | 2024.08.13 |
[데이터분석] 텍스트마이닝 (0) | 2024.08.11 |
[데이터분석] 데이터 정제(전처리), 그래프 종류 확인 및 실습해보기 (0) | 2024.08.05 |
[데이터분석] 판다스 활용하기, json파일 가져와서 데이터 나눠보기 (0) | 2024.08.03 |