자, 두번째 이야기에서는, '트럼프 대통령의 트윗을 분석하기' 시간입니다.
이번 프로젝트에서는 트럼프 대통령이 2017년 1월 20일 취임 이후 1년 동안 게시한 2,500여 개의 트윗을 분석해봅니다.
- 가장 많이 사용한 # 해시태그,
- 가장 많이 사용한 키워드
- 가장 많이 사용한 @ 멘션
- 월별 트윗 통계
이러한 특징들을 분석 후, 데이터의 유형에 알맞은 시각화 코드를 살펴보겠습니다.
- 막대 그래프
- 단어 구름(word cloud)
결과 일부 미리보기
크게 3가지 결과로 나타낼 것입니다.
1) 가장 많이 등장한 키워드, 해시태그, 멘션의 TOP.10
2) 트럼프 대통령의 월별 트위터 개수 그래프
3) 트럼프 대통령의 트위터 키워드로 워드클라우드 표현
위 두 파일은 시각화에 이용하게 될 png파일입니다.
엘리스에서 이미지 출력에 필요한 패키지를 불러올 py 파일입니다.
가장 중요한, 분석의 대상이 될 트럼프 대통령의 트윗 모음입니다.
위 파일들을 main.py와 같은 디렉토리 내에 위치시켜주세요.
위 내용들을 불러오기 위한 코드입니다.
import하기 위한 세부 내용은 주석을 참고하시면 됩니다. :-)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 트럼프 대통령의 트윗 모음을 불러옵니다.
from tweets import trump_tweets
# 그래프에 필요한 라이브러리를 불러옵니다.
import matplotlib.pyplot as plt
# 단어구름에 필요한 라이브러리를 불러옵니다.
import numpy as np
from PIL import Image
from wordcloud import WordCloud
# 특화된 컨테이너 모듈에서 수 세기를 돕는 메소드를 불러옵니다.
from collections import Counter
# 문자열 모듈에서 특수문자를 처리를 돕는 메소드를 불러옵니다.
from string import punctuation
# 엘리스에서 이미지 출력에 필요한 패키지를 불러옵니다.
from elice_utils import EliceUtils
elice_utils = EliceUtils()
|
이 프로젝트를 위해 작성하게 될 함수는 다음과 같이 총 6개입니다.
크롤링 및 그 과정을 위한 게시물이므로 그래프 및 단어구름(워드클라우드)의 설명은 대부분 생략하겠습니다.
def preprocess_text(text)
# 문자열에서 특수문자를 삭제하고 공백을 기준으로 나누어 생성된 리스트를 반환합니다.
def analyze_text(words):
# 문자열 원소의 첫 문자를 확인하고 해시태그, 멘션, 키워드로 분류합니다.
def filter_by_month(tweet_data, month):
# 트윗 데이터와 월을 입력 받아 해당 월에 게시된 트윗을 리스트에 추가합니다.
def show_stats():
# 가장 많이 사용한 해시태그, 멘션, 키워드를 출력합니다.
def show_tweets_by_month():
# 앞서 작성한 함수를 이용해 월별 트윗 개수를 보여주는 그래프를 출력합니다.
def create_word_cloud():
# wordcloud 패키지를 이용해 트럼프 대통령 실루엣 모양의 단어구름을 생성합니다.
|
1) def preprocess_text(text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def preprocess_text(text):
# 분석을 위해 text를 모두 소문자로 변환합니다.
text = text.lower()
# @와 #을 제외한 특수문자로 이루어진 문자열 symbols를 만듭니다.
symbols = punctuation.replace('@', '').replace('#', '')
# symbols 변수를 이용해 text에서 @와 #을 제외한 모든 특수문자를 제거합니다.
for sb in symbols :
text = text.replace(sb, '')
# text를 공백을 기준으로 구분합니다.
words = text.split()
print(words)
return words
|
위 함수는 문자열에서 특수문자를 삭제하고 공백을 기준으로 나누어 생성된 리스트를 반환합니다.
먼저, 대소문자가 서로 다르게 인식되어, 같은 단어임에도 불구하고 다른 단어로 분류되는 것을 방지하기 위해서
4번라인과 같이 text를 모두 소문자로 변환시켜줍니다.
다음으로, 우리는 # 해시태그와, @ 멘션의 빈도 역시 파악하는 것이 목적이기때문에,
@과 #을 제외한 다른 특수문자를 제거해야 합니다.
string 모듈의 punctuation에는 모든 구두점이 들어있습니다.
7번줄과 같이, 우리가 검출해야할 @과 #을 제외한 특수문자를 symbol 문자열에 넣어줍니다.
그리고 symbol을 이용해, @과 #을 제외한 모든 특수문자를 제거합니다.
이후, text는 특수문자가 제거된 알파벳으로만 구성된 단어들의 집합구조입니다.
이 구조를 split()을 사용하여 공백기준으로 모두 나눠줍니다.
2) def analyze_text(words)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def analyze_text(words):
# 키워드, 해시태그, 멘션을 저장할 리스트를 각각 생성합니다.
keywords, hashtags, mentions = [], [], []
# 리스트에 저장된 단어를 분류합니다.
for word in words:
# 해시태그일 경우 # 기호를 제외한 단어를 해시태그와 키워드 리스트에 추가합니다.
if word[0]=='#' :
# 멘션일 경우 @ 기호를 제외한 단어를 멘션과 키워드 리스트에 추가합니다.
if word[0]=='@' :
# 해시태그와 멘션이 아닐 경우 단어를 키워드 리스트에 추가합니다.
if (word[0]!='#' and word[0]!='@') :
return keywords, hashtags, mentions
|
위 함수는 문자열 원소의 첫 문자를 확인하고 해시태그, 멘션, 키워드로 분류하여 반환하는 함수입니다.
키워드(keywords), 해시태그(hashtags), 멘션(mentions)의 리스트를 생성해준 뒤,
각각의 리스트에 조건에 맞춰서 추가해줍니다.(append)
이 함수의 파라미터 word는 1번함수 preprocess_text 의 리턴값입니다.
(@과 #이 제거되고, 공백기준으로 나누어진 리스트 구조)
키워드(keywords)리스트는 해시태그와 멘션에 있더라도 핵심단어로 분류할 것이기 때문에 모두 추가해줍니다!
'데이터 크롤링' 카테고리의 다른 글
[Python] 데이터 크롤링(data crawling) #3 (0) | 2019.07.09 |
---|---|
[Python] 데이터 크롤링(data crawling) #1 (0) | 2019.07.08 |