본문 바로가기
Machine Learning

머신러닝 / 웹크롤링 / 형태소분석 / WordCloud 차트 출력하기

by with chu 2021. 3. 10.
728x90

웹 자료를 읽어서 형태소 분석하기

목표: 웹 검색 결과에서 두글자 이상의 명사의 빈도수를 가지고 WordCloud 차트를 출력한다

 

파일명 : 2_nlp5_wordcloudchart.py

# 검색 결과를 형태소 분석하여 단어 빈도수를 구하고 이를 기초로 워드클라우드 차트 출력
from bs4 import BeautifulSoup
import urllib.request
from urllib.parse import quote 

#keyword = input("검색어 : ")
keyword = "백신"
print(quote(keyword))

# 동아일보 검색 기능
target_url = "https://www.donga.com/news/search?query=" + quote(keyword)
print(target_url)

source_code = urllib.request.urlopen(target_url)
soup = BeautifulSoup(source_code, 'lxml', from_encoding='utf8')
#print(soup)

HTML 문서에서 필요한 부분만 뽑아낼 수 있는 파이썬 BeautifulSoup라이브러리를 사용한다.

검색어 키워드를 추가해주고 웹크롤링할 페이지를 명시한다. 

 

msg = ""

for title in soup.find_all("p", "tit"): # <p class="tit">
    title_link = title.select('a')
    #print(title_link)
    article_url = title_link[0]['href']
    #print(article_url)  # https://www.donga.com/news/Issue/031407
    
    try: #중간에 안나오는링크는 pass하기
        source_article = urllib.request.urlopen(article_url)  # 해당 사이트에 들어가 실제 기사 읽기
        soup = BeautifulSoup(source_article, 'lxml', from_encoding='utf-8')
        contents = soup.select('div.article_txt')
        #print(contents)
        for imsi in contents:
            item = str(imsi.find_all(text=True))
            #print(item)
            msg = msg + item
            
    except Exception as e:
        pass

print(msg)

가져온 html에서 p태그와 tit태그의 a태그 중에서도 href속성만 뽑아낸다.

try ~ except블럭으로 링크에러를 잡아준다.

해당 링크안에서 다시 BeautifulSoup으로 text들만 뽑아내 msg에 담아준다

 

from konlpy.tag import Okt
from collections import Counter

nlp = Okt()
nouns = nlp.nouns(msg) # 명사별로 분할한다
result = []
for temp in nouns:
    if len(temp) > 1: # 두 글자 이상 명사만 가져온다
        result.append(temp)
        
print(result)
print(len(result))

count = Counter(result)
print(count)
tag = count.most_common(50) # 상위50개

KoNLPy는 한글 자연어 처리를 할때 사용하는 파이썬 오픈소스 라이브러리다. 자바 jdk와 Jpype가 설치되어있어야 설치가 가능하다.

Okt객체를 만들어서 두 글자 이상인 명사만 뽑는다.

Counter는 result에서 원하는 정보가 몇번 나왔는지 셀수있는 함수다. counter를 이용해 빈도수가 높은 명사 50개만 보도록하자.

 

# pip install simplejson
# pip install pytagcloud

import pytagcloud
taglist = pytagcloud.make_tags(tag, maxsize =100) # 글꼴크기 100, 색은 자동으로잡힘
print(taglist)

#C:\Windows\Fonts 에있는 맑은고딕 복사해서
#C:\Users\Chu\anaconda3\Lib\site-packages\pytagcloud\fonts붙여넣고
# 그안에 fonts.json 수정 => 
#      "name": "korean",
#      "ttf": "malgun.ttf",

print('====================이미지 파일로 저장===================') 
pytagcloud.create_tag_image(taglist, "word.png", size=(1000,600), fontname="korean", rectangular=False)

Anaconda prompt에서 simplejson와 pytagcloud를 설치해준다.

한글 글꼴을 사용하기 위해 font.json 파일을 수정 해준다.

적당한 이미지 크기를 정하고 저장한다.

 

# 저장된 이미지 읽기
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# %matplotlib inline # Jupiter에서는 이렇게만 해주면된다

img = mpimg.imread("word.png")
plt.imshow(img)
plt.show()

# 브라우저로 출력
import webbrowser
webbrowser.open("word.png")

저장된 이미지를 불러와서 출력한다. 아래와 같이 출력된다.

728x90

댓글