[wordcloud] kakao_talk

2021. 5. 15. 21:09Python/코딩

Ver. Jupyter Notebook (Anaconda3)

▶ wordcloud_kakao talk

수집: 사용자별 채팅 수(countplot), 채팅 내용 (wordcloud)

코딩: github

 

JeongJaeyoung0/text_analysis

텍스트 감성분석. Contribute to JeongJaeyoung0/text_analysis development by creating an account on GitHub.

github.com

2021.05.15

# wordcloud_kakao talk

pwd

### step 0. 준비
import scipy as sp
import pandas as pd
import numpy as np
import re
import collections

# konlpy 한글 텍스트 분석 패키지
from konlpy.tag import Kkma       ; kkma = Kkma()
from konlpy.tag import Hannanum   ; hannanum = Hannanum()
from konlpy.tag import Okt        ; t = Okt()
from konlpy.tag import *
import pickle # 모델 파일 저장

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

# 그래프
%matplotlib inline
import os
import matplotlib.pyplot as plt
import seaborn as sns
import graphviz
from sklearn.tree import export_graphviz

# 그래프 문자 깨지는 것 대처
import matplotlib
from matplotlib import font_manager, rc
import platform
if platform.system() == 'Windows':
# 윈도우인 경우
    font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)
else:
# Mac 인 경우
    rc('font', family='AppleGothic')

# 워닝 없애주는 것
import warnings  
warnings.filterwarnings('ignore')

### step 1. 전처리
file = open("kakao_talk.txt", "r+", encoding='UTF8')

# 줄 수
strings = file.readlines()
del strings[0:7]
print(len(strings))
#strings

name_list = []
text_list = []

# 전처리
for i in range(0, len(strings)):
    # 시간 삭제
    num_del = re.sub(r'\d','',strings[i]).replace('.','').replace('\n','')
    num_del = num_del.split(':')
    
    # 시작 글이 날짜가 아닌 데이터들 처리
    if strings[i][0:2] == '20':
        if ':' in strings[i]:
            name_list.append(num_del[1].replace(',','').replace(' ',''))
            text_list.append(num_del[2])
    else:
        name_list.append('')
        text_list.append(num_del[0])
        
# 길이가 다르면 문제 있음
print(len(name_list))
print(len(text_list))

# 판다스화
df = pd.DataFrame({'name': name_list, 'text': text_list})
df

# 이름 빈칸을 윗칸의 이름으로 채우기
for i in range(0, len(df)):
    if df.name[i] == '':
        df.name[i] = df.name[i-1]
df

# 이름별 채팅 수 카운트
df.name.value_counts()

### step 2. matplot
# column 그래프 그리기(필수)
plt.figure(figsize=(8, 6))                 # 그래프 크기(x, y) x=가로 y=세로
plot = sns.countplot('name', data=df)      # 그래프 함수 : sns.countplot() 사용

# column 그래프 부가 설명(옵션)
plot.set_title('Chat count of name', fontsize=30)    # 제목
plot.set_xlabel('Name', fontdict={'size':20})        # x축 이름
plot.set_ylabel('Chat count', fontdict={'size':20})  # y축 이름
plt.savefig('Chat_count_of_name.png')                # 이미지로 저장
plt.show()

### step 3. wordcloud
text_sum = ''

# 한 문장으로 합치기
for i in df['text']:
    text_sum = text_sum + i
text_sum

# 자음, 모음, 알파벳, 특수기호, 특수기호 제거
text_sub = re.sub(r'[ㄱ-ㅎㅏ-ㅣa-z]', '', text_sum)
text_sub

tokens_ko = t.morphs(text_sub)
tokens_ko

import nltk
from konlpy.tag import Okt; t = Okt()

ko = nltk.Text(tokens_ko)   
print(len(ko.tokens))          # 토큰 전체 갯수
print(len(set(ko.tokens)))     # 토큰 unique 갯수

# 불용어 : 인터넷 검색 시 검색 용어로 사용하지 않는 단어. 관사, 전치사, 조사, 접속사 등 검색 색인 단어로 의미가 없는 단어
stop_words = ['.','가',"!",'\r\n\r\n','\r\n','\n','\n ','요','답변','...','을','수','에','질문','제','를','이','도',
                      '좋','1','는','로','으로','2','것','은','다',',','니다','대','들',
                      '2017','들','데','..','의','때','겠','고','게','네요','한','일','할',
                      '10','?','하는','06','주','려고','인데','거','좀','는데','~','ㅎㅎ',
                      '하나','이상','20','뭐','까','있는','잘','습니다','다면','했','주려',
                      '지','있','못','후','중','줄','6','과','어떤','기본','!!',
                      '단어','라고','중요한','합','가요','....','보이','네','무지',
                      'ㅋㅋ', 'ㅋㅋㅋ', 'ㅋ', '만', '아', '안,' '나', '사진', '난', '이모티콘',
                      '내', '그', '근데', '더', '안', '나', '임', '저', '면', '듯', '년', '하면', '에서',
                      '너', '서', '랑', '에서', '니깐', '적', '하고', '??', '~~', '~~~']

tokens_ko = [each_word for each_word in tokens_ko
             if each_word not in stop_words]

ko = nltk.Text(tokens_ko)
ko.vocab().most_common(50)

data = ko.vocab().most_common(300)
data

from wordcloud import WordCloud, STOPWORDS
from PIL import Image

# 워드클라우드를 그려보자
wordcloud = WordCloud(font_path='c:/Windows/Fonts/malgun.ttf',
                      relative_scaling = 0.2,
                      #stopwords=STOPWORDS,
                      background_color='white',
                      ).generate_from_frequencies(dict(data))
plt.figure(figsize=(16,8))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

# 다음과 같이 파일로 저장
wordcloud.to_file('wordcloud.png')

'Python > 코딩' 카테고리의 다른 글

[python] crawler_google image  (0) 2021.05.18
[crawler] youtube(selenium)  (1) 2021.05.17
[python] crawler_naver 부동산  (0) 2021.05.14
[python] crawler (AirKorea)  (0) 2021.05.10
[python] crawler (소방청 국가화재정보센터)  (0) 2021.05.09