Python WordCloud 활용 주식 뉴스 제목 시각화

Python의 WordCloud 패키지를 활용하여 하루의 주식 관련 뉴스에 가장 많이 표현된 단어를 워드클라우드(단어구름)로 시각화하는 방법을 설명한다. 워드클라우드(단어구름)는 단어들을 시각화 한 것 이다. 구체적으로 지정된 지문에서 자주 출현한 단어는 크게, 자주 출현하지 않은 단어는 작게 표현하고 이들 단어들을 인식하기 좋게 배치한다.

본 글에서는 뉴스들의 제목에 포함된 단어들을 시각화 해보려 한다. 이베스트 투자증권에서 제공하는 뉴스는 증권 뉴스부터 일반적인 뉴스까지 다양하다. ‘실시간으로 자주 거론되는 뉴스 제목의 키워드를 가지고 주식을 매수, 매도하면 어떨까?’ 하는 생각이 들었다. 단어들의 출현 빈도 별 시각화에는 워드클라우드가 적합하다.

목차

  1. 준비
  2. WordCloud
  3. 구현
  4. 결론

준비

본 글에서 워드클라우드 입력에 사용 할 단어들은 이베스트 투자증권에서 제공하는 증권 관련 뉴스들의 제목이다. 뉴스의 제목을 얻어야 한다. 뉴스의 제목을 얻는 방법은 다음의 글을 참조하자.

XingAPI 이용 실시간 뉴스 제목 받기

본인의 경우 획득된 뉴스 제목들을 일별로 정리하여 데이터베이스 서버에 저장하고 있다. 본 글의 코드를 실행해보려는 사람은 받은 뉴스 제목을 CSV파일이나 데이터베이스에 저장해서 읽어오는 것을 추천한다.

뉴스 제목에서 명사를 뽑아내기 위해서는 한국어 자연어 프로세싱 패키지인 Konlpy를 이용하였다. 설치와 사용법은 다음의 페이지를 참고하자.

KoNLPy: Korean NLP in Python

WordCloud

Python WordCloud 패키지는 워드클라우드 이미지 생성을 간편하게 할 수 있게 해준다. 사용을 하려면 먼저 설치를 해야 한다. 아나콘다에서 설치는 다음과 같다.

$ conda install -c Conda-forge wordcloud

설치에 문제가 생기면 경로가 달라진 것일 수 있으니 다음의 사이트를 참고하자.

conda-forge/packages/wordcloud

사용 방법은 간단하다. wordcloud 클래스의 객체를 생성하기만 하면 된다. 자세한 설명은 아래의 사이트가 잘 정리되어있다.

Word cloud in Python

구현

하루 치의 증권 뉴스 제목을 읽어와 워드클라우드로 시각화하는 전체 코드는 다음과 같다.

from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import sys
import os
import platform
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
import dbmanipulations.DataGettingFunctionsFromDB as dgffdb

systemN = platform.system()
if systemN == 'Darwin':
    # MacOs에서는 NLP로 Hannanum 사용
    from konlpy.tag import Hannanum
    def GetNLPParser():
        nlp = Hannanum()
        return nlp
    
    # 한글 폰트 사용을 위해 MacOs의 폰트 리스트를 얻어옴
    fontList = [f.name for f in fm.fontManager.ttflist]
    
    # 한글 사용 가능 폰트 이름에 'Gothic'이 포함된 폰트들
    fontList2 = [(f.name, f.fname) for f in fm.fontManager.ttflist if 'Gothic' in f.name]    
    fName = fontList2[1][1]
    
    # matplotlib의 fontproperties에 한글 폰트 등록
    fontprop = fm.FontProperties(fname = fName, size = 10)
    
elif systemN == 'Windows':
    # Windows에서는 NLP로 Okt 사용
    from konlpy.tag import Okt
    def GetNLPParser():
        nlp = Okt()
        return nlp
    
    # 한글 폰트 사용을 위해 Windows에서는 malgun.ttf를 읽어옴
    fName = 'c:/windows/fonts/malgun.ttf'
    fontprop = fm.FontProperties(fname=fName, size=10)
    
if __name__ == '__main__':
    # 날짜를 지정해서 newsDf 데이터 얻어오기
    tDate = '20200623'
    newsDf = dgffdb.GettingNewsDataFromDB(tDate)
    
    # nlp 파서 생성 및 뉴스df를 순회하며 명사를 획득하고 이를 counter에 입력
    nlp = GetNLPParser()
    count = Counter()
    for index, row in newsDf.iterrows():
        title = row['title']
        tList = nlp.nouns(title)
        tCount = Counter(tList)
        count = count + tCount
    
    # count를 dictionary로 변경
    count2 = count.most_common()
    keywords = dict(count)
    
    # 뉴스에 기계적으로 자주 포함되는 단어 제거    
    keywords.pop('상승세')
    keywords.pop('확대')
    keywords.pop('상승')
    keywords.pop('상승폭')
    keywords.pop('52주')
    keywords.pop('소폭')
    keywords.pop('코스피')
    keywords.pop('주')
    keywords.pop('종목')
    keywords.pop('코')
    keywords.pop('상위')
    keywords.pop('이평')
    keywords.pop('속보')
    keywords.pop('발동')
    keywords.pop('등')
    keywords.pop('코스닥')
    keywords.pop('신고')
    keywords.pop('종합')
    keywords.pop('외국')
    keywords.pop('전')
    keywords.pop('규모')
    
    # wordCloud를 생성하고 keywords를 입력
    wordcloud = WordCloud(width = 800, height = 800, font_path = fName)
    wordcloud = wordcloud.generate_from_frequencies(keywords)
    
    # wordCloud의 결과를 그림으로 표시
    array = wordcloud.to_array()
    fig = plt.figure(figsize=(10, 10))
    plt.imshow(array, interpolation='bilinear')
    plt.axis('off')
    plt.show()
    

코드를 간략히 설명한다.

  1. 본인의 데이터베이스에서 지정한 날짜의 뉴스 제목 데이터를 GettingNewsDataFromDb() 함수로 읽어온다.
  2. 읽어온 뉴스 제목 데이터를 순회하며 Konlpy의 noun() 함수로 명사들을 뽑아낸다.
  3. 뽑아낸 Counter에 입력하여 출현 횟수를 계산한다.
  4. Counter를 Dict 형식으로 변경한다.
  5. 뽑아낸 Keywords 중 기계적으로 출현하는 단어들을 제거한다.
  6. WordCloud의 인스턴스를 생성하고 Keywords를 입력한다.
  7. 결과를 그림으로 표시한다.

결과 그림은 다음과 같다.

20200623일 뉴스 제목 시각화 결과

결론

Python WordCloud를 이용하여 증권 뉴스 제목들에 출현하는 단어를 시각화하였다. 실시간으로 제공되는 증권 뉴스 제목들에 자주 출현하는 단어들을 가지고 주식을 사고 파는 것은 어떨까 하는 아이디어에서 시작한 일이다. 증권 뉴스 제목들을 살펴보면 기계적으로 자주 출현하는 제목들이 있다. 이들을 최대한 제거하고 실시간으로 입력된 단어들을 처리해서 표현하면 주식 투자에 도움이 되지 않을까 생각한다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다