본문 바로가기
프로그래밍

파이썬 크롤링(웹스크래핑) - 카톡 대화 워드클라우드로 만들기

by 조크리 2020. 10. 6.
반응형

 

 

 

 

스파르타 코딩 파이썬 혼자 놀기 패키지 3일차!

 

오늘은 '파이썬으로 카카오톡 대화 내용을 읽고 편집하여 워드 클라우드로 만드는 것!'을 배웠다.

 

강의 내용을 정리하기 전, 다시 한 번 알게된 어마어마한 사실이 있다면 카카오톡의 대화 내용은 .txt파일로 저장이 된다는 사실!!!! 

 

이걸 저장해서 뭘할까 싶지만 이렇게 워드 클라우드로 만들 수도 있고, 비속어가 몇 번 나오는지도 분석할 수 있고, 친구 관계도 분석해볼 수 있고, 자주쓰는말 월드컵 같은 게임도 만들어 볼 수 있고, 하루에 몇 번이나 카톡이 오고 가는지도 알 수 있고 등등

 

조금만 생각해보면 카톡 대화 내용으로도 꽤 할 수 있는 것이 많다. 

 

일단, 이번 글에서는 카톡 대화를 .txt파일로 다운받은 뒤, 파이썬 워드클라우드 라이브러리를 이용해 워드클라우드로 만들 것이다. 

 

그럼 단계별로 시작해보자. 

 

 

 

1. 텍스트 파일 읽고 쓰기 

 

1) 파이썬에서 텍스트 파일을 만들 수도 있는데 이걸 '쓴다'고 이해하면 된다. 

 

test_review.txt 파일을 만들고 그 안에

 

각 줄마다 번호를 적은 파일입니다. 

이것은 1번째 줄입니다. 

이것은 2번째 줄입니다.

 

이런식으로 메모장 텍스트 파일을 만든다고 해보자. 

아래 코드를 open()과 write()를 이용해서 test_review.txt파일을 만들어주고 글자를 입력했다. 

with open("test.txt", "w", encoding="utf-8") as f:
    f.write("각 줄마다 번호를 적은 파일입니다.\n")
    for i in [1,2,3,4,5]:
        f.write(f"이것은 {i}번째 줄입니다.\n")

 

파이참으로 결과를 확인하면 이렇게 .txt파일이 만들어진 것을 볼 수 있다. 

 

 

2) 이미 있는 .txt 파일을 읽을 수도 있다. 

이때는 읽기 모드인 'r'을 적어주면 되고 줄 별로 읽은 뒤 print(line)해준다. 

 

with open("test_review.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        print(line)

 

그럼 아까 만든 test_review.txt파일에 있는 글을 라인별로 읽어온 뒤 프린트 해주게 된다. 

 

아까 \n으로 엔터효과 + print()의 엔터까지 더해짐.

 

 

 

2. 카카오톡 텍스트파일 저장하고 읽기 

 

카카오톡의 원하는 카톡방에 들어가서 '더보기 > 대화 내용 > 대화 내보내기'를 클릭한다. 

 

 

파일명은 간단하게 kakao.txt로 바꾸어준 뒤 작업하는 폴더에 넣어주어야한다. 

 

kakao.txt파일을 파이썬으로 읽어보자. 

text = ""

with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        text+=line

print(text)

 

 

 

 

3. 데이터 클렌징

 

'데이터 클렌징'이란 데이터에서 불완전, 비정확, 관련 없는 부분을 찾아 삭제하거나 수정하는 것을 말한다.

 

카톡 대화 내용을 워드 클라우드로 만들 것이기 때문에 날짜, 시간, 프로필 이름, 카톡방 이름, 저장한 날짜 등은 없어도 된다.

 

1) 일단 맨 위 5줄은 필요없기에 6번째 줄부터 들어가도록 한다.

text = ""

with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        text+=line

print(text)

 

2) 시스템 메시지나  톡게시판에 공지사항으로 아주 길게 올라간 메시지 등을 지워주기 위한 처리를 해야한다. 

대화 내용을 보면 각 줄에서 ] [ 가 포함되어 있다. 이걸 이용해서 if문을 써준다. ] [ 요 표시가 있어야만 대화라고 인식하고 읽는 것이다.

text = ""

with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        if '] [' in line:
            text+=line

print(text)

 

3) 그리고 split을 이용해서 '] ' 를 기준으로 글을 나누고 인덱스2번을 불러오면 대화 내용만 불러오는 것이다. 

text = ""

with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        if '] [' in line:
            text+=line.split('] ')[2]

print(text)

 

4) 카톡 대화를 다운로드받으면 이모티콘은 '이모티콘'이라고 한 줄로 나온다. 사진은 '사진'이라고 나온다. 

이모티콘, 사진, ㅋ, ㅠ, ㅜ 등은 지워버리자. 

 

이모티콘과 사진은 \n으로 줄바꿈까지 포함되었기에 replace('사진\n', '')이렇게 적어줘야한다. 

아래 코드처럼 적으면 완성!

text = ""

with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        if '] [' in line:
            text+=line.split('] ')[2].replace('ㅋ','').replace('ㅠ','').replace('ㅜ','').replace('사진\n','').replace('이모티콘\n','').replace('삭제된 메시지입니다','')

print(text)

 

 

 

 

4. 워드 클라우드 패키지 깔고 폰트 적용하기

 

1) wordcloud 패키지를 설치한다. 

 

2) 파이썬에서 그림을 그릴 때 한글 폰트를 지원하지 않는 경우가 많아서 직접 폰트 파일이 저장되어 있는 경로를 찾아 넣어주어야한다. 

컴퓨터에 있는 폰트 중 고딕 폰트를 출력하여 적용해보자.

ctrl + / 를 눌르서 코드들을 주석처리해주고 

고딕 폰트를 검색해서 마음에 드는 것을 고른 뒤 경로를 복사해서  font_path를 써준다.  

# text = ""
#
# with open("kakao.txt", "r", encoding="utf-8") as f:
#     lines = f.readlines()
#     for line in lines[5:]:
#         if '] [' in line:
#             text+=line.split('] ')[2].replace('ㅋ','').replace('ㅠ','').replace('ㅜ','').replace('사진\n','').replace('이모티콘\n','').replace('삭제된 메시지입니다','')

import matplotlib.font_manager as fm

# 이용 가능한 폰트 중 '고딕'만 선별
for font in fm.fontManager.ttflist:
    if 'Gothic' in font.name:
        print(font.name, font.fname)

font_path = 'C:/Windows/Fonts/malgun.ttf'

 

 

3) 이제 워드 클라우드 패키지를 이용해보자. 

아래 코드를 변형해서 사용하면 된다. 

from wordcloud import WordCloud

wc = WordCloud(font_path=font_path, background_color="white", width=600, height=400)
wc.generate(text)
wc.to_file("result.png")

 

 

4) 변형하여 원래 코드에 적용시켜보자. 

 

kakao.txt를 읽고 데이터 클렌징을 해서 result_Review.png파일로 워드 클라우드 그림 파일을 만드는 것이다!

from wordcloud import WordCloud

text = ""

with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        if '] [' in line:
            text+=line.split('] ')[2].replace('ㅋ','').replace('ㅠ','').replace('ㅜ','').replace('사진\n','').replace('이모티콘\n','').replace('삭제된 메시지입니다','')


font_path = 'C:/Windows/Fonts/malgun.ttf'

wc = WordCloud(font_path=font_path, background_color="white", width=600, height=400)
wc.generate(text)
wc.to_file("result_review.png")

 

 

5) '저는' '넹넹' 'ㅎ' '저도' 제가' 이런 글자는 지워봐야겠다. 

 

 

 

 

5. 원하는 모양의 워드클라우드 만들기

 

원하는 어떤 모양이든 흰색 배경의이미지가 있느면 만들 수 있다. 

일단 흰 배경에 하트 그림이 있는 파일을 다운로드 받고 이름을 love.png로 바꾸어 작업하는 폴더에 넣어주었다. 

love.png
0.02MB

 

1) 마스킹된 워드 클라우드를 만들기 위한 코드를 써준다. 

아래의 코드를 변형하여 사용하면 된다

from PIL import Image
import numpy as np

mask = np.array(Image.open('love.png'))
wc = WordCloud(font_path=font_path, background_color="white", mask=mask)
wc.generate(text)
wc.to_file("result_review_2.png")

 

 

2) 변형하여 원래 코드에 적용시켜보자. 

replace가 많아서 가로로 길어졌다. 

아래 코드처럼하면 끝! 

from wordcloud import WordCloud
from PIL import Image
import numpy as np

text = ""
with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        if '] [' in line:
            text+=line.split('] ')[2].replace('ㅋ','').replace('ㅠ','').replace('ㅜ','').replace('사진\n','').replace('이모티콘\n','').replace('삭제된 메시지입니다','').replace('저도','').replace('ㅎ','').replace('제가','').replace('넹','').replace('저는','')


font_path = 'C:/Windows/Fonts/malgun.ttf'

mask = np.array(Image.open('love.png'))
wc = WordCloud(font_path=font_path, background_color="white", mask = mask)
wc.generate(text)
wc.to_file("result_review_2.png")

 

 

 

6. 전체 코드 다시 살펴보기 

from wordcloud import WordCloud
from PIL import Image
import numpy as np

text = ""
with open("kakao.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    #6번째 줄부터 읽기
    for line in lines[5:]:
    #시스템 메시지 삭제
        if '] [' in line:
        #split으로 대화내용만 불러오고 replace로 필요없는 글자 없애기
            text+=line.split('] ')[2].replace('ㅋ','').replace('ㅠ','').replace('ㅜ','').replace('사진\n','').replace('이모티콘\n','').replace('삭제된 메시지입니다','').replace('저도','').replace('ㅎ','').replace('제가','').replace('넹','').replace('저는','')

#폰트 찾아서 설정
font_path = 'C:/Windows/Fonts/malgun.ttf'

#love.png라는 파일에 마스킹해줄것임
mask = np.array(Image.open('love.png'))

#result_review_2.png파일로 하트모양 워드클라우드 저장
wc = WordCloud(font_path=font_path, background_color="white", mask = mask)
wc.generate(text)
wc.to_file("result_review_2.png")

 

카카오톡 대화 내용을 읽어서 워드 클라우드로 만들기도 끝!!!!

 

이렇게 스파르타코딩 파이썬 혼자 놀기 수업이 끝났다!

 

이미지 크롤링, 기사 크롤링, txt파일 읽고 편집해서 워드클라우드로 만들기까지 알차게 배웠다!

 

배운 내용은 복습하고 발전시켜서 좋은 아이디어를 실현시켜봐야겠다!!

 

 

반응형