★ 아직 많이 부족합니다. 댓글을 통한 가르침 환영입니다. ★

 

이번에는 뉴스를 가져와서 직접 분석해보도록 하겠습니다.

 

들어가기 앞서, 뉴스 기사를 가져오는데 유용한 라이브러리인 newspaper3k를 설치하도록 하겠습니다.

 

pip install newspaper3k  

 

를 통해 설치해주도록 합니다.

 

newspaper3k를 통해 간략하게 뉴스 제목과 기사를 가져올 수 있는지 확인해보도록 하겠습니다.

 

최근 화두인 비트코인에 대한 뉴스기사를 가져와보도록 하겠습니다.

 

가져올 뉴스 URL : http://v.media.daum.net/v/20171215130602344

 

URL을 정했으면 이제 코드를 작성해보도록 합시다.

 

코드는 매우 간단합니다.

 

1
from newspaper import Article
cs

 

와 같이 import 해줍니다.

 

 

1
2
3
4
5
6
7
url = 'http://v.media.daum.net/v/20171215130602344'
 
article = Article(url, langague='ko')
 
article.download()
 
article.parse()
cs

 

가져올 url을 변수에 담고, 다음과 같이 기사를 파싱해옵니다.

 

마지막으로

 

1
2
3
print (article.title)
 
print (article.text)
cs

 

출력해서 기사를 확인해봅시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
from newspaper import Article
 
url = 'http://v.media.daum.net/v/20171215130602344'
 
article = Article(url, langague='ko')
 
article.download()
 
article.parse()
 
print (article.title)
 
print (article.text)
cs

 

전체 코드 ↑ / 출력 결과 ↓

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
캐나다 중앙은행 총재 "비트코인 구매는 투자 아닌 도박"
 
 
캐나다 중앙은행인 캐나다은행의 스티븐 폴로즈 총재가 14일(현지시간) 이상 폭등세를 보이는 가상화폐 비트코인 거래에 대해 '도박'이라고 규정, 강력 경고했습니다.
 
폴로즈 총재는 토론토에서 열린 한 경제단체 주최 행사에 참석, 연설을 통해 비트코인 거래에 대해 "투자라기보다는 도박에 가깝다"고 지적했다고 캐나다 통신 등이 전했습니다.
 
폴로즈 총재는 "가상화폐를 사는 것은 위험을 구매하는 것을 의미한다"며 비트코인 구매자들에 "세부 조건을 잘 읽어야 할 것"이라고 권고했습니다.
 
특히 그는 비트코인이 신뢰할 만한 가치 저장 수단이 아니며 "화폐가 아니다"고 강조했습니다.
 
폴로즈 총재는 "통화로 간주되기 위해서는 신뢰할 만한 가치 저장 기능을 해야 한다"며 "가상화폐는 이런 요소를 전혀 갖고 있지 못한 만큼 화폐로 성립되지 않는다"고 말했습니다.
 
또 "현 상황은 심각한 혼란을 초래할 수 있는 요소가 있다"며 "이 시점부터 제도권 시스템이 주의 깊게 다루어 가기를 희망한다"고 밝혔스니다.
 
폴로즈 총재는 "비트코인 거래 차트가 에펠 탑의 왼쪽 편 모양과 같은데 이는 우리가 흔히 볼 수 없는 것"이라며 20여 년 전 유사했던 정보기술(IT) 붐 현상에 언급, "당시 다행스러웠던 것은 전방위적 파급효과는 없이 해당 분야의 주식 거래에 국한됐다는 점"이라고 지적했습니다.
 
그러나 그는 디지털 거래와 전자 화폐 수요가 늘어나는 추세를 거론하며 "중앙은행이 소매 거래에 활용될 디지털 화폐를 발행하는 문제에 대해 적절한 상황을 연구, 검토하고 있다"고 말했습니다.
 
cs

 

이렇게 간단하게 가져온 뉴스기사를 여러개 가져와 유사도 분석을 시도해보도록 하겠습니다. ( 마지막 기자님 성함과 이메일 주소는 뺐습니다. )

 

먼저, 분석을 위해 각 문장에 있는 명사들을 추출하는 작업을 진행해보도록 하겠습니다.

 

상단에

 

1
from konlpy.tag import Kkma, Twitter
cs

 

를 추가해줍니다. 이번에는 Kkma와 Twitter 모두 사용하여 유사한 내용의 뉴스와 전혀 다른 뉴스의 내용의 유사도를 어떻게 출력하는지 확인해보겠습니다.

 

기본 틀은 kkma class를 활용해서 짜고, 후에 Twitter class를 통한 분석에 대한 내용을 덧붙이도록 해보죠.

 

 

 

 

이와 같은 플로우로 구현을 해보겠습니다.

 

그러기에 앞서 다음과 같이 kkma.nouns를 사용하여 출력해보면,

 

1
print (kkma.nouns(article.text))
cs

 

 

1
2
3
4
5
6
7
['캐나다''중앙''중앙은행''은행''캐나다은행''스티븐''폴''폴로즈''로즈''총재''14''14일''일''현지',
 '현지시간''시간''이상''폭등''폭등세''세''가상''가상화폐''화폐''비트''비트코''코''거래''도''도박''박'
'규정''경고''토론토''한''경제''경제단체''단체''주최''행사''참석''연설''투자''투자라기보''라''기보''고''지적''통신',
 '등''위험''구매''의미''구매자''세부''조건''권고''비트코인''인''신뢰''가치''저장''수단''통화''간주''기능''요소''만큼',
 '성립''현''상황''혼란''초래''수''시점''제도권''시스템''주의''가기''희망''밝혔스니''차트''에펠''탑''왼쪽''편''모양''이'
'우리''20''20여''여''년''전''유사''정보''정보기술''기술''붐''현상''언급''당시''다행''전방위''파급''파급효과''효과''해당''분야',
 '주식''국한''점''그''디지털''전자''수요''추세''거론''소매''활용''발행''문제''연구''검토']
cs

 

이와 같이 list에 담겨 나오게됩니다.

 

이렇게 추출한 명사를 하나의 document 형태로 만들기 위해 각 명사들을 띄어쓰기로 구분하여 이어 붙여주도록 하겠습니다.

 

1
2
3
4
5
6
7
mydoclist_kkma = []
 
nouns = ' '.join(kkma.nouns(article.text))
 
mydoclist_kkma.append(nouns)
 
print (nouns)
cs

 

1
캐나다 중앙 중앙은행 은행 캐나다은행 스티븐 …(중략)… 추세 거론 소매 활용 발행 문제 연구 검토 
cs

 

이렇게 mydoclist_kkma에는 Kkma class로 추출한 명사로 이루어진 하나의 document가 자리잡게 됩니다.

 

자 그럼 큰 틀을 잡았으니,

 

첫 번째 뉴스 : http://v.media.daum.net/v/20171215130602344  (비트코인 관련 )

 

두 번째 뉴스 : http://v.media.daum.net/v/20171215130312300  ( 비트코인 관련 )

 

세 번째 뉴스 : http://v.media.daum.net/v/20171215111203921 ( 비트코인 관련 )

 

네 번째 뉴스 : http://v.media.daum.net/v/20171216002700566 ( 날씨 관련 )

 

다섯 번째 뉴스 : http://v.media.daum.net/v/20171215214505350(날씨 관련 )

 

이렇게 5개의 뉴스를 분석해보도록 하겠습니다.

 

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
32
33
34
35
36
37
38
39
40
from newspaper import Article
from konlpy.tag import Kkma, Twitter
from sklearn.feature_extraction.text import TfidfVectorizer
 
url_list = ['http://v.media.daum.net/v/20171215130602344',
            'http://v.media.daum.net/v/20171215130312300',
            'http://v.media.daum.net/v/20171215111203921',
            'http://v.media.daum.net/v/20171216002700566',
            'http://v.media.daum.net/v/20171215214505350']
 
twitter = Twitter()
kkma = Kkma()
 
mydoclist_kkma = []
mydoclist_twitter = []
 
for url in url_list:
    article = Article(url, langague='ko')
    article.download()
    article.parse()
 
    kkma_nouns = ' '.join(kkma.nouns(article.text))
    twitter_nouns = ' '.join(twitter.nouns(article.text))
    mydoclist_kkma.append(kkma_nouns)
    mydoclist_twitter.append(twitter_nouns)
 
tfidf_vectorizer = TfidfVectorizer(min_df=1)
tfidf_matrix_kkma = tfidf_vectorizer.fit_transform(mydoclist_kkma)
tfidf_matrix_twitter = tfidf_vectorizer.fit_transform(mydoclist_twitter)
 
document_distances_kkma = (tfidf_matrix_kkma * tfidf_matrix_kkma.T)
document_distances_twitter = (tfidf_matrix_twitter * tfidf_matrix_twitter.T)
 
print ('Kkma class를 활용한 유사도 분석을 위해 ' + str(document_distances_kkma.get_shape()[0]) + 'x' + str(document_distances_kkma.get_shape()[1]) + ' matrix를 만들었습니다.')
print(document_distances_kkma.toarray())
 
 
 
print ('Twitter class를 활용한 유사도 분석을 위해 ' + str(document_distances_twitter.get_shape()[0]) + 'x' + str(document_distances_twitter.get_shape()[1]) + ' matrix를 만들었습니다.')
print(document_distances_twitter.toarray())
cs

 

전체 코드입니다.

 

결과는 다음과 같습니다.

 

 

< Kkma 이용 결과 >

 

< Twitter class 이용 결과 >

 

이렇게 뉴스 분석까지 끝마쳤습니다.

 

개인적으로 봤을 땐 Twitter class가 비슷한 주제라면 더욱 직관적이긴 한 것 같습니다.

 

마지막으로, 형태소 분석에 이용되는 class에 따라 더 나아가 형태소 분석이 어떻게 되는지에 따라 결과가 달라질수도 있지만 꽤나 유의미한 결과를 보여주었다고 생각합니다.

'텍스트 분석' 카테고리의 다른 글

텍스트 유사도 분석 - 2  (0) 2017.12.14
텍스트 유사도 분석 - 1  (0) 2017.12.13

+ Recent posts