노무현 대통령 vs 이명박 대통령
- 노무현 대통령과 이명박 대통령 연설문을 텍스트 마이닝을 통해 분석해봤습니다.
- 자세한 설명은 아래 코드와 함께 같이 설명 하겠습니다.
- 언어 : Python
- 자료 : 대통령 연설문 사이트
- 해당 자료 Github 를 통해 자세한 전처리 및 크롤링 크드를 확인 하실 수 있습니다.
In [95]:
import president # Analytics Module for presidents
import pandas as pd
import re
import wordhandle # Handling TDM & WordCount
import numpy as np
import matplotlib.pyplot as plt # for basic plots
import seaborn as sns # for nicer plots
import json
import networkx
from konlpy.tag import Komoran
from sklearn.feature_extraction.text import CountVectorizer
from matplotlib import font_manager, rc
rc('font', family='HYsanB') # 한글 폰트 설정
In [3]:
%matplotlib inline
In [4]:
# 노무현
#no_pre = president.get_president_speech("노무현")
#no_pre = president.get_speech_view_list(no_pre,"노무현")
# 이명박
#lee_pre = president.get_president_speech("이명박")
#lee_pre = president.get_speech_view_list(lee_pre, "이명박")
In [5]:
no_pre = pd.read_csv('data/노무현_contents.csv')
lee_pre = pd.read_csv('data/이명박_contents.csv')
In [6]:
no_pre.head(2)
Out[6]:
In [7]:
lee_pre.head(2)
Out[7]:
In [8]:
## 상위 카테고리
cate_list = president.get_speech_category(no_pre)
cate_list
Out[8]:
In [9]:
## 하위 카테고리
sub_cate_list = president.get_speech_subcategory(no_pre)
sub_cate_list
Out[9]:
In [10]:
no_speech_cnt = pd.DataFrame({'no_cnt':no_pre.groupby(['category']).size()}).reset_index().sort_values(by='no_cnt',ascending=False)
lee_speech_cnt = pd.DataFrame({'lee_cnt':lee_pre.groupby(['category']).size()}).reset_index().sort_values(by='lee_cnt',ascending=False)
- 전체 연설에 대해서는 비슷한 비율로 연설을 하였다.
- 비율적으로 노무현 대통령은 외교, 통상과 산업,경제 부분에서 많은 비율을 차지 했다.
- 이명박 대통령은 상대적으로 노무현 대통령보다 문화/체육/관광의 비율이 높으며, 환경에 대한 연설횟수가 높다.
In [11]:
two_speech = pd.merge(no_speech_cnt,lee_speech_cnt)
two_speech = two_speech.append(two_speech.sum(), ignore_index=True)
two_speech.ix[10,0] = "총합"
two_speech['no_ratio'] = two_speech.apply(lambda x:round((x[1]/two_speech.ix[10,1]) * 100,2), axis=1)
two_speech['lee_ratio'] = two_speech.apply(lambda x:round((x[2]/two_speech.ix[10,2]) * 100,2), axis=1)
two_speech
Out[11]:
In [12]:
tdm = np.load("data/tdm_전체_노무현.npz")
tdm = tdm['arr_0'].item()
with open("data/tdm_전체_노무현.json", encoding='utf8') as f:
words = json.load(f)
In [13]:
tdm2 = np.load("data/tdm_전체_이명박.npz")
tdm2 = tdm2['arr_0'].item()
with open("data/tdm_전체_이명박.json", encoding='utf8') as f:
words2 = json.load(f)
In [44]:
wordcloud = wordhandle.makeWordCloud(tdm,words)
In [15]:
wordcloud2 = wordhandle.makeWordCloud(tdm2, words2)
In [16]:
df = president.two_wordcount_df(wordcloud,wordcloud2)
In [17]:
president.get_compare_words_view(df,"노무현","이명박","연설 전체")
In [113]:
words_list = [word for word, count in wordcloud[:50]]
In [114]:
def get_noun(text):
tagger = Komoran() # 형태소 분석기
nouns = tagger.nouns(text)
return [n for n in nouns if n in words_list] # 2글자 이상만
In [115]:
cv = CountVectorizer(tokenizer=get_noun, max_features=500)
In [116]:
tdm_network = cv.fit_transform(no_pre['contents'])
In [117]:
network_words = cv.get_feature_names()
In [118]:
G = networkx.Graph()
In [119]:
word_corr_no = np.corrcoef(tdm_network.todense(), rowvar=0)
In [120]:
word_corr_no
Out[120]:
In [121]:
edges_no = []
for i in range(len(network_words)):
for j in range(i+1,len(network_words)):
edges_no.append((network_words[i],network_words[j], word_corr_no[i,j]))
In [122]:
edges_no = sorted(edges_no,key=lambda x:x[2], reverse=True)
In [123]:
edge_no_list = [(word1, word2) for word1, word2, weight in edges_no]
weight_no_list = [weight for word1, word2, weight in edges_no]
In [124]:
edge_no_set = set()
for word1, word2, weight in edges_no:
G.add_edge(word1, word2, weight=weight)
edge_no_set.add((word1,word2))
In [125]:
position = networkx.spring_layout(G, k=0.09, iterations=100)
plt.figure(figsize=(12, 9))
networkx.draw_networkx_nodes(G, position, node_size=0)
networkx.draw_networkx_edges(G, position, edgelist=edge_no_list, width=weight_no_list, edge_color='lightgray')
networkx.draw_networkx_labels(G, position, font_size=15,font_family='HYsanB')
plt.axis('off')
Out[125]:
In [17]:
tdm = np.load("data/tdm_취임사_노무현.npz")
tdm = tdm['arr_0'].item()
with open('data/tdm_취임사_노무현_.json', encoding='utf8') as f:
words = json.load(f)
In [18]:
tdm2 = np.load("data/tdm_취임사_이명박.npz")
tdm2 = tdm2['arr_0'].item()
with open('data/tdm_취임사_이명박_.json', encoding='utf8') as f:
words2 = json.load(f)
In [19]:
wordcount = wordhandle.makeWordCloud(tdm,words)
In [20]:
wordcount2 = wordhandle.makeWordCloud(tdm2,words2)
In [21]:
df = president.two_wordcount_df(wordcount,wordcount2)
In [22]:
president.get_compare_words_view(df,"노무현","이명박","취임사")
In [23]:
tdm = np.load("data/tdm_교육_노무현.npz")
tdm = tdm['arr_0'].item()
with open('data/tdm_교육_노무현.json', encoding='utf8') as f:
words = json.load(f)
tdm2 = np.load("data/tdm_교육_이명박.npz")
tdm2 = tdm2['arr_0'].item()
with open('data/tdm_교육_이명박.json', encoding='utf8') as f:
words2 = json.load(f)
In [24]:
wordcount = wordhandle.makeWordCloud(tdm,words)
- 이명박 대통령 : 비교적으로 인재, 발전, 세계 등의 단어를 많이 사용.
In [25]:
wordcount2 = wordhandle.makeWordCloud(tdm2,words2)
In [26]:
df = president.two_wordcount_df(wordcount, wordcount2)
In [27]:
president.get_compare_words_view(df,"노무현","이명박","교육")
In [28]:
lda, topics = president.get_lda_topic(tdm,words,20) # tdm, words, Number of topics
topics[:5] # 3번, 9번, 18번 정도의 토픽이 대부분을 차지한다.
Out[28]:
In [29]:
lda.show_topic(3) # 아래와 같은 주제를 교육 관련 연설에서 높은 비율로 연설하였음.
Out[29]:
In [30]:
lda.show_topic(9) # 재외동포교육 국제학술대회, 경찰 졸업생 축하 연설관련.
Out[30]:
In [31]:
lda2, topics2 = president.get_lda_topic(tdm2,words2,20) # tdm, words, Number of topics
topics2[:5] # 6번 하나의 주제로 모든 연설에서 했다고 봐도 무방하다.
Out[31]:
In [32]:
lda.show_topic(6)
Out[32]:
In [33]:
tdm = np.load("data/tdm_외교_노무현.npz")
tdm = tdm['arr_0'].item()
with open('data/tdm_외교_노무현_.json', encoding='utf8') as f:
words = json.load(f)
tdm2 = np.load("data/tdm_외교_이명박.npz")
tdm2 = tdm2['arr_0'].item()
with open('data/tdm_외교_이명박_.json', encoding='utf8') as f:
words2 = json.load(f)
In [34]:
wordcount = wordhandle.makeWordCloud(tdm,words)
In [35]:
wordcount2 = wordhandle.makeWordCloud(tdm2,words2)
In [36]:
df = president.two_wordcount_df(wordcount,wordcount2)
- 노무현 대통령 : 외교 관련 연설문 처음에 존경하는 XXX 각하 라는 표현을 많이 하여 각하라는 말이 많이 나왔다. 상대적으로 평화 번영, 동북아 정세에 관련하여 많은 언급을 한 것으로 파악된다.
- 이명박 대통령 : 차이가 많이 나는 단어들이 많이 존재한다. 국제, 세계경제, 세계, 성장, 사회, 정상회의 극복 등 세계경제에서의 극복과제와 발전 등 지금까지와 일관성있는 경제 부분만 언급하고 있는 것으로 보인다.
In [37]:
president.get_compare_words_view(df,"노무현","이명박","외교")
In [47]:
lda, topics = president.get_lda_topic(tdm,words,5) # tdm, words, Number of topics
topics # 1,2,4,0이 대부분을 이룬다.
Out[47]:
In [48]:
lda.show_topic(1) # 양국과의 평화 발전 협력 등을 말하는...당연한 거아닌가..?
Out[48]:
In [52]:
lda2, topics2 = president.get_lda_topic(tdm2,words2,10) # tdm, words, Number of topics
topics2 # 1,3,5,0 정도가 대부분이다.
Out[52]:
In [53]:
lda2.show_topic(1) # 워낙 비슷하다. 외교적으로는 비슷한 주제를 언급하고 있다고 생각된다.
Out[53]:
In [54]:
#tdm, cv = president.get_president_sub_tdm(no_pre,"국회연설",500)
#tdm2, cv2 = president.get_president_sub_tdm(lee_pre,"국회연설",500)
In [57]:
tdm = np.load("data/tdm_국회연설_노무현.npz")
tdm = tdm['arr_0'].item()
with open('data/tdm_국회연설_노무현.json', encoding='utf8') as f:
words = json.load(f)
tdm2 = np.load("data/tdm_국회연설_이명박.npz")
tdm2 = tdm2['arr_0'].item()
with open('data/tdm_국회연설_이명박.json', encoding='utf8') as f:
words2 = json.load(f)
In [58]:
wordcount = wordhandle.makeWordCloud(tdm,words)
In [59]:
wordcount2 = wordhandle.makeWordCloud(tdm2,words2)
In [60]:
df = president.two_wordcount_df(wordcount,wordcount2)
In [61]:
president.get_compare_words_view(df,"노무현","이명박","국회연설")
'BIGDATA > TEXT MINING' 카테고리의 다른 글
[Crawling] Beautifulsoup & Requests (Crawling) (0) | 2017.09.11 |
---|---|
[TEXT MINING] ENCODING, 인코딩 (0) | 2017.09.11 |
[URL] URL 분해 및 URL Encoding (0) | 2017.09.10 |
[Crawling] Web Crawling(크롤링) (2) | 2017.09.10 |
[TEXT MINING] 텍스트마이닝의 기초 (TDM) (0) | 2017.09.10 |