Link
Recent Posts
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 예측모델링
- 2회기출
- 파이썬AHP
- 빅데이터분석기사
- 파이썬
- 행별속성합계
- 공빅데기관매칭
- 백준1920
- 워드클라우드
- konlpy
- 튜플
- 파이썬튜플
- 백준 2164
- 셋
- 리스트
- csv병합
- 빅분기실기
- 태블로
- 빅분기
- 파이썬입출력
- set시간복잡도
- 공공빅데이터청년인턴
- 딕셔너리
- 실기
- 작업형2
- 파이썬딕셔너리
- 파이썬셋
- 컨테이너
- dataq
- 공빅데
- Today
- Total
Data Science
SNS 텍스트 분석(konlpy) 및 워드클라우드 - 모양, 대용량 개선 본문
sns 텍스트 분석¶
필요한 모듈/라이브러리 불러오기
In [ ]:
import csv
import pandas as pd
import tweepy
import konlpy
import sys
import numpy as np
import os
from konlpy.tag import Okt
from PIL import Image
from collections import Counter
from wordcloud import STOPWORDS
from wordcloud import WordCloud
데이터 불러오기¶
In [ ]:
# 데이터 불러오기
df = pd.read_csv("sns_data_namyangju.csv",encoding='utf-8') #전체
df.head(5)
Out[ ]:
In [ ]:
print(df.columns.tolist())
In [ ]:
df_copy = df
다시 실행(중단점)¶
In [ ]:
df_all = df_copy
'제목' 속성만 불러오기
내용으로 불러오려 했지만 각종 광고글과 의미없는 단어들이 다량 추출되어 키워드가 많이 포함될 수 있는 제목 속성을 활용하기로 결정함
In [ ]:
df_all = df_all.loc[:,['원시데이터제목']]
df_all.head(5)
Out[ ]:
형태소 분석시 반복문을 시행함에 있어서
인덱스는 1부터 시작되는게 유리함
In [ ]:
# 인덱스 조정 (1부터 시작)
df_all.index = df_all.index + 1
df_all.head(5)
Out[ ]:
In [ ]:
len(df_all) # 전체 데이터 행수
Out[ ]:
형태소 분석 및 카운팅¶
이 작업은 작동시간이 오래 걸리는 부분
처음에 전체를 한꺼번에 돌리려고 시도했으나
데이터양이 많아 시간이 오래걸리고 메모리 오류가 발생
문제해결방법
- 10만개(10만행)까지는 무난하게 한 번에 분석이 가능한것으로 확인
- 전체 데이터를 N등분하여 형태소를 분석
- 반복이 한 번 돌때마다 n만개씩 분석
- n만개 분석결과를 csv 파일로 저장
- 첫번째 반복 후 다음 반복을 실행시, 기존 csv 파일에 append 를 함
- append 가 됐다면, 동일 명사가 반복되므로 groupby 함수를 이용하여 명사 기준으로 카운트를 합침
In [ ]:
# 원래 파일이 있다면 반드시 삭제후 실행
filename = 'SNS_NAMYANGJU_COUNT.csv' # 계속 append 될 카운트 csv 파일
if os.path.isfile(filename):
os.remove(filename)
print('File has been removed')
else:
print('Not exist')
In [ ]:
all_len = len(df_all) # 총 데이터 개수
part = 30000 # 몇개씩 끊을건지 입력 - 3만개
# 전체를 n만개씩 반복수행
for i in range(0,all_len,part):
print("Loop {} ........".format( i//part )) # 진행 확인
if i+part >= all_len:
df = df_all.iloc[i+1:all_len,:]
print("Complete!!") # 완료 확인
break
df = df_all.iloc[i+1:i+part,:]
df_list = df.values.tolist() # 데이터프레임을 해제하여 리스트로 변환
df_list = np.array(df_list).flatten() # 이중리스트를 단일리스트로 변환
df_str = "".join(df_list) # 리스트를 해제 시키고 문자열 형태로 변환
words = df_str
# okt 객체 생성
okt = Okt()
noun = okt.nouns(words)
for i,v in enumerate(noun):
if len(v)<2:
noun.pop(i)
count = Counter(noun)
# 명사 빈도 카운트
noun_list = count.most_common() # 전체 다 카운트함. 값넣으면 상위 n 개만 추출.
#for v in noun_list:
#print(v)
# csv 파일에 저장 및 추가(append)
with open("SNS_NAMYANGJU_COUNT.csv","a", newline='',encoding='cp949') as f:
csvw = csv.writer(f)
for v in noun_list:
csvw.writerow(v)
# 초기화 (하지 않으면 메모리가 과누적되어 오류발생)
okt = 0
noun = 0
noun_list = 0
In [ ]:
# append 되어 생성된 csv 파일
df_c = pd.read_csv("SNS_NAMYANGJU_COUNT.csv",encoding='cp949',header=None)
df_c.head(10)
Out[ ]:
In [ ]:
# 속성명 부여
df_c.columns = ['명사','카운트']
df_c
Out[ ]:
동일 명사가 반복되므로 groupby 함수를 이용하여 명사 기준으로 카운트를 합침
In [ ]:
df_c = df_c.groupby('명사').sum()
df_c = df_c.sort_values('카운트',ascending=False)
df_c
Out[ ]:
최종 명사별 카운팅된 파일저장
In [ ]:
# csv 파일에 저장
df_c.to_csv("SNS_NAMYANGJU_COUNT_result.csv",encoding='euc-kr',header=None,sep=',')
워드클라우드 생성¶
불용어 처리
In [ ]:
# 작성한 불용어 텍스트 파일을 부름
filename = "data/stopwords.txt"
with open(filename,encoding='utf-8') as f:
lines = f.read().splitlines()
#lines.sort()
#print(lines)
stopwords = set(lines) # set을 이용하여 혹시 모를 중복을 피함
len(stopwords)
Out[ ]:
In [ ]:
# 워드클라우드에 사용할 모양 불러오기
mask_image = Image.open('phploeBuh.png')
mask = np.array(mask_image)
In [ ]:
# 워드클라우드 생성
filename = "SNS_NAMYANGJU_COUNT_result.csv"
f = open(filename,'r',encoding='cp949')
words = f.read()
wc = WordCloud(font_path='data/MALGUNBD.ttf', \
background_color="white", \
width=500, \
height=500, \
max_words=100, \
max_font_size=140, \
stopwords=stopwords, \
mask = mask )
wordcloud_words = wc.generate(words)
wc.to_file('wordcloud_제목_남양주.png') # 이미지 파일로 저장
Out[ ]:
In [ ]:
Image.open('wordcloud_제목_남양주.png')
Out[ ]:
In [ ]:
추후 개선해야 할 점 / 한계점¶
- 반복문을 돌리는 과정에서 루프안의 코드들을 함수/모듈화해서 작성할 필요가 있음
- 불용어 처리시 각종 광고물에 대한 처리를 주관적 판단에 따라 제거했으나 광고를 필터링 할 수 있는 대책 고안
'데이터분석' 카테고리의 다른 글
[태블로] [DAY1] 카테고리별 메뉴 분석 (0) | 2023.06.06 |
---|---|
[태블로] [DAY0] 기초실습교육 (1) | 2023.06.06 |
CSV 파일 병합 하기 (0) | 2021.10.21 |
SNS 텍스트 분석(konlpy) 및 워드클라우드 - 랜덤표본 (0) | 2021.10.15 |
형태소 분석 참고 링크 (0) | 2021.09.14 |
Comments