전기차 , 수소차 관련 글과 댓글을 웹크롤링하여 저장한 텍스트 파일을 데이터 전처리 후에 빈도수가 높은 단어
500개를 기준으로 워드클라우드로 시각화 하는 작업을 진행하였다.
데이터 전처리
① 라이브러리 정의
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
plt.rc("font",family = "Malgun Gothic")
plt.rcParams["axes.unicode_minus"] = False
import plotly.express as px
② 데이터 읽어들이기
보배드림 , 클리앙 , 두 사이트에서 저장한 데이터가 있다.
보배드림 전기차 검색시 나오는 글과 댓글 등의 데이터를 읽어들인다.
df_bobe = pd.read_csv("./웹크롤링/보배드림_전기.txt",delimiter="\t" , names=["board","view","board_like" , "date" ,"link" ,"comment" ,"comment_like"])
df_bobe
우선 보배드림의 경우에는 웹크롤링 과정에서 link 에 글 내용이 붙어서 저장되어서 이를 분리하여주는 과정을 진행하였다.
# link에서 글 내용과 링크 나누기
for i in range(len(df_bobe)):
df_bobe["link"][i] = df_bobe["link"][i][56:]
df_bobe.columns = ["board","view","board_like" , "date" ,"board_write" ,"comment" ,"comment_like"]
link 는 사용하지 않으므로 link의 길이 이후의 데이터만 저장하고 컬럼명을 board_write로 바꿔주었다.

클리앙의 경우에는 글내용만 있으므로 아래와 같이 데이터를 읽어들였다.
df_cli = pd.read_csv("./웹크롤링/클리앙_전기.txt",delimiter="\t" , names=["board","view","board_like" , "date" ,"board_write" ,"comment" ,"comment_like"])
df_cli
③ 두 사이트 합치기
# 두 사이트 합치기
df_elec = pd.concat([df_bobe,df_cli],axis=0,ignore_index=False)
len(df_elec)
④ 중복 행 제거하기
중복행 2개가 나왔다.
제거해준다.
df_elec= df_elec.drop_duplicates()
len(df_elec)
⑤ 한글이 아닌 내용은 공백으로 바꾼다
이때 정규식은 r"^ㄱ-ㅣ가-힣+]" 으로 분류하고 공백" " 으로 변환한다.
# 한글 아닌 내용 공백으로 변환
import re
df_elec.loc[:,"comment"] = [re.sub(r"^ㄱ-ㅣ가-힣+]"," ",data) for data in df_elec["comment"]]
df_elec.loc[:,"board_write"] = [re.sub(r"^ㄱ-ㅣ가-힣+]"," ",data) for data in df_elec["board_write"]]
df_elec
⑥ 단어 단위로 분리하기
konlpy 라이브러리를 사용하여 단어단위로 변환하여준다.
이 작업이 가장 시간이 오래걸린다.
import jpype
from konlpy.tag import Okt
okt = Okt()
df_elec_nouns1 = []
df_elec_nouns2 = []
for cnt in df_elec["comment"] :
df_elec_nouns1.extend(okt.nouns(cnt))
for cnt in df_elec["board_write"] :
df_elec_nouns2.extend(okt.nouns(cnt))
⑦ 단어 중 한글자인 단어 제거
한글자인 단어는 의미가 없다고 판단하여 제거하여준다.
# 1글자 제외
df_elec_nouns1 = [n for n in df_elec_nouns1 if len(n) > 1]
df_elec_nouns2 = [n for n in df_elec_nouns2 if len(n) > 1]
⑧ 글 내용과 댓글의 단어를 한 데이터프레임에 합치기
df_elec_nouns1.extend(df_elec_nouns2)
df_elec_nouns = df_elec_nouns1
⑨ 각 단어의 빈도수 계산하기
from collections import Counter
df_elec_count = Counter(df_elec_nouns)
print(df_elec_count)
⑩ 불필요한 단어 제거 및 상위 500개 저장(딕셔너리형태)
단어 제거시에는 __delitem__ 사용
한번에 하나의 단어만 가능
df_elec_count.__delitem__("전기차")
df_elec_count.__delitem__("전기")
df_elec_count.__delitem__("자동차")
df_elec_count.__delitem__("차량")
df_elec_count.__delitem__("생각")
df_elec_count.__delitem__("때문")
df_elec_count.__delitem__("경우")
df_elec_count.__delitem__("정도")
df_elec_count.__delitem__("그냥")
df_elec_count.__delitem__("사람")
df_elec_count.__delitem__("지금")
elec_top_500 = df_elec_count.most_common(500)
elec_top_500
위에까지는 튜플형식이므로 시각화하기 위해 딕셔너리 형식으로 바꿔준다.
elec_top_500 = {k:v for k,v in df_elec_count.most_common(500)}
elec_top_500
워드클라우드 시각화
워드 클라우드의 경우에는 seaborn이나 plotly에서는 생성이 되지않고 pyplot에서만 가능하다.
텍스트 색은 컬러맵을 사용하여 바꿔주었다.
plt.show()
from wordcloud import WordCloud
plt.figure(figsize=(10, 10))
plt.title("전기차 워드클라우드", fontsize=17)
font_path = "C:/Users/user/Desktop/ttf/Orbit-Regular.ttf"
wc = WordCloud(
font_path=font_path,
background_color="white",
width=800,
height=600,
colormap='Spectral').generate(' '.join(elec_top_500)
)
plt.imshow(wc)
plt.axis("off")
plt.savefig("./img/전기차워드클라우드")
plt.show()
위와 동일한 방식으로 수소차에 대해서도 워드 클라우드 시각화를 하였다.
'Project' 카테고리의 다른 글
[데이터 분석] 국내 여행지역 관심도 분석(3) (2) | 2023.12.17 |
---|---|
[데이터분석 미니프로젝트] plotly 그래프 생성하기 (2) | 2023.12.11 |
[데이터분석 미니프로젝트] 재생에너지 발전량( Plotly , Streamlit 사용법) (2) | 2023.12.10 |
[데이터분석 미니프로젝트] - 에너지원별 발전량 분석 / 시각화 (2) | 2023.12.09 |
[데이터분석 미니프로젝트] - 수질데이터 시각화 / 에너지원별 발전량 데이터 전처리 (0) | 2023.12.08 |