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
'Machine Learning' 카테고리의 다른 글
상관 분석 / Correlation Analysis / 피어슨 / 스피어만 / 켄달 상관계수 (0) | 2021.03.30 |
---|---|
머신러닝 / Iris 데이터 분류 / 5가지 모델 작성법 (Logistic Regression/SVM/Random Forest/Naïve Bayes/Tree) (0) | 2021.03.18 |
머신러닝 / 선형회귀분석 / 모델 작성후 추정치 얻기 (0) | 2021.03.11 |
머신러닝 / Python / Pandas 판다스 / MariaDB 연결 (0) | 2021.03.11 |
머신러닝 / Python / ANOVA(analysis of variance) / 분산분석 (0) | 2021.03.11 |
댓글