4-5. 워드클라우드 만들기 - 해시코드 질문 키워드¶
- bs4와 wordcloud를 이용해서 질문 키워드를 보여주는 시각화를 진행해봅시다.
Target: 해시코드 질문 제목의 키워드¶
지난 실습에서 해시코드(https://hashcode.co.kr) 질문태그를 활용해 Bar Plot을 그렸다면,
이번 실습에서는 질문 제목을 스크래핑한 후, 형태소 분석을 진행해서 워드클라우드를 그려봅시다.
In [1]:
# 다음 User-Agent를 추가해봅시다.
user_agent = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
In [4]:
# Pagination이 되어있는 질문 리스트의 제목을 모두 가져와 리스트 questions에 저장해봅시다.
# https://hashcode.co.kr/?page={i}
# 과도한 요청을 방지하기 위해 0.5초마다 요청을 보내봅시다.
questions=[]
import requests
from bs4 import BeautifulSoup
import time
for i in range(1,6):
res=requests.get(f"https://hashcode.co.kr/?page={i}",user_agent)
soup=BeautifulSoup(res.text,"html.parser")
parsed_datas=soup.find_all("li","question-list-item")
for data in parsed_datas:
questions.append(data.h4.text.strip())
time.sleep(0.5)
In [5]:
questions[:10]
Out[5]:
['파이썬에서 동적 클래스와 정적 클래스의 차이점을 제대로 이해한지 궁금합니다.',
'BI tool 과 Dashboard 솔루션의 차이',
'틀린 부분 모르겠어요ㅠㅠ',
'flask를 vscode에서 gunicorn을 활성화해서 실행시키고 싶은데 gunicorn을 활성화했는데도 wsgi 서버를 활용하지 않느다고 오류메세지가 뜨네요',
'MSSQL 2008->2019 마이그레이션 후 게시판 정렬 문제',
'묵시적 형변환',
'y값이 입력이 안됩니다.',
'이 방식으로 배포하는 게 맞나요?',
'스택 자료 삭제 알고리즘 문제 관련 궁금한 점',
'프로그램에 대하여']
In [6]:
# 텍스트 구름을 그리기 위해 필요한 라이브러리를 불러와봅시다.
# 시각화에 쓰이는 라이브러리
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 횟수를 기반으로 딕셔너리 생성
from collections import Counter
# 문장에서 명사를 추출하는 형태소 분석 라이브러리
from konlpy.tag import Hannanum
In [9]:
# Hannanum 객체를 생성한 후, .nouns()를 통해 명사를 추출합니다.
words=[]
hannanum=Hannanum()
for question in questions:
#1번 반복할때 나온 명사들
nouns=hannanum.nouns(question)
#누적해서 나오는 명사들
words+=nouns
print(len(words))
1064
In [10]:
# counter를 이용해 각 단어의 개수를 세줍니다.
counter=Counter(words)
counter
Out[10]:
Counter({'파이썬에서': 1,
'클래스': 4,
'정적': 1,
'차이점': 1,
'이해': 3,
'궁금': 4,
'과': 1,
'솔루션': 1,
'차이': 1,
'부분': 6,
'모르겠어요ㅠㅠ': 1,
'활성화해': 1,
'실행': 4,
'데': 4,
'활성': 1,
'서버': 1,
'활용': 3,
'않느': 1,
'오류메세지': 1,
'2008': 1,
'2019': 1,
'마이그레이션': 1,
'후': 5,
'게시판': 3,
'정렬': 1,
'문제': 25,
'묵시적': 1,
'형변환': 1,
'값': 4,
'입력': 4,
'방식': 5,
'배포': 1,
'것': 4,
'스택': 2,
'자료': 1,
'삭제': 2,
'알고리즘': 1,
'관련': 11,
'점': 1,
'프로그램': 7,
'대하여': 1,
'토큰': 1,
'질문': 51,
'속성': 1,
'노마드코더': 1,
'공부': 5,
'세팅': 1,
'프로그래머스': 6,
'입문': 1,
'파이썬': 42,
'기본': 1,
'정답': 1,
'12': 1,
'결과값': 1,
'15': 1,
'메모리': 2,
'해제': 1,
'관련해서': 1,
'모듈': 4,
'오류': 18,
'코딩': 7,
'연습문제': 1,
'짝수': 3,
'합': 5,
'목표': 1,
'달성': 1,
'최고': 1,
'프로그래밍': 2,
'언어': 13,
'선택': 1,
'자바': 10,
'자바스크립트,': 1,
'로그': 2,
'화': 1,
'구현': 7,
'C++': 2,
'구구단': 1,
'질문드': 11,
'이용': 5,
'라이브영상': 1,
'출력': 9,
'엑셀': 4,
'단순': 1,
'선행': 1,
'프로세스': 2,
'객체': 2,
'후행': 1,
'방법': 12,
'아무것': 1,
'신입사원': 1,
'ㅠㅠ': 3,
'설치파일': 1,
'수': 16,
'cv2': 1,
'설치': 3,
'해결': 5,
'좌클': 1,
'우클': 1,
'클릭': 1,
'법': 3,
'환경': 2,
'파': 6,
'경': 2,
'식': 6,
'C#': 2,
'인터페이스': 2,
'상속': 1,
'구별': 1,
'[스프링부트]': 1,
'컨트롤러': 1,
'매핑': 1,
'핸들러': 1,
'포트번호': 1,
'로': 2,
'인바운드&아웃바운드': 1,
'차': 1,
'설정': 2,
'보안상': 1,
'안전': 1,
'이미지': 4,
'크롤링하': 1,
'다운로드': 1,
'때': 9,
'유니티': 1,
'리듬': 1,
'제작': 2,
'메트로놈': 1,
'문': 6,
'기초': 4,
'질문가능': 1,
'웹': 1,
'스크래핑': 1,
'독학': 1,
'중': 8,
'초렙': 1,
"'_lib'": 1,
'현업': 1,
'개발': 2,
'궁금증': 1,
'저장': 11,
'코드에디터': 1,
'불편함': 1,
'개': 2,
'웹사이트': 3,
'업로드': 1,
'포인터': 1,
'배열': 4,
'마크': 1,
'형식': 1,
'벨로그': 1,
'복사': 1,
'과제중인데요': 1,
'텍스트': 2,
'파일': 6,
'평균': 2,
'단어': 2,
'길': 1,
'코딩테스트': 9,
'응시': 2,
'규정': 1,
'진로': 1,
'고민': 2,
'런타': 2,
'에러': 7,
'해결방안': 1,
'[파이썬]': 2,
'페이지별': 1,
'분리': 2,
'관리': 1,
'발생': 8,
'ㅜ': 2,
'코드': 15,
"linear_model'에서": 1,
'이름': 1,
'행님덜~~네이버': 1,
'플레이스리뷰': 1,
'크롤링': 2,
'S3)': 1,
'파라미터': 1,
'로컬': 1,
'전달': 2,
'배포서버': 1,
'캐치': 1,
'예외': 1,
'딕셔너리': 3,
'쿼': 1,
'구축': 1,
'예제': 2,
'나': 1,
'교육': 1,
'사이트': 2,
'모바일': 1,
'(뉴비': 1,
'진짜': 3,
'아나콘다': 1,
'주피터': 1,
'노트북': 1,
'이동': 1,
'판다스': 4,
'년월일': 1,
'숫자들': 1,
'소': 1,
'숫자': 1,
'깃': 1,
'플로우': 1,
'관련질문': 1,
'결과': 3,
'드': 2,
'배치파': 1,
'날짜': 2,
'지정': 1,
'풀이중': 1,
'백준': 2,
'문제(bfs)': 1,
'함수': 3,
'표': 1,
'조건부': 1,
'서식': 1,
'색조': 1,
'다중공선성': 1,
'분': 2,
'j2ee.': 1,
'j2ee': 1,
'에러메시지': 1,
'못잡겠네요': 1,
'5': 1,
'의미': 2,
'오버플로우': 1,
'지': 2,
'초보': 2,
'경로': 1,
'처음이': 1,
'좀': 1,
'공원': 1,
'산책': 1,
'원': 1,
'시작': 1,
'어려움': 1,
'전역변수': 1,
'안가서요': 1,
'답변': 1,
'입출력': 1,
'0': 2,
'10': 1,
'어떤의미': 1,
'고수님': 2,
'3가지': 1,
'쿠키': 1,
'접근': 2,
'한': 4,
'확장': 1,
'칼만필터': 1,
'드립니다ㅠㅠ': 1,
'군데': 2,
'공부법': 1,
'에러(ModuleNotFoundError': 1,
'학습': 1,
'구글코랩Google': 1,
'객체생성': 1,
'제출': 1,
'저': 2,
'문자열': 2,
'쓰레기': 1,
'자바스크립트': 5,
'일주일': 1,
'못풀면': 1,
'연습': 2,
'컨트롤': 1,
'제트': 1,
'ojdbc6': 1,
'추가': 1,
'c++질문': 1,
'답안': 1,
'인텔리제이에서': 1,
'm1': 1,
'centOS7': 1,
'올리브영': 1,
'동작': 1,
'구간별': 1,
'내': 2,
'문의사항': 1,
'scanf_s': 2,
'하이퍼파라미터': 1,
'정수': 1,
'홀수': 2,
'입력모드': 1,
'일반모드': 1,
'전환': 1,
'프로젝트': 1,
'구조체': 1,
'사용': 6,
'다항식': 2,
'덧셈': 3,
'사진파일': 1,
'코으': 1,
'매개변수화': 2,
'메서드': 1,
'작성': 2,
'별그리': 1,
'마름모': 1,
'컴퓨터': 1,
'시간': 3,
'기준': 1,
'자동': 2,
'문구': 2,
'타이핑': 1,
'작동': 2,
'4종류': 1,
'강아지': 1,
'분류': 2,
'다람쥐': 2,
'청설모': 1,
'마지막': 1,
'가변': 2,
'자': 2,
'평균값': 1,
'알려주시ㅣ': 1,
'한번': 1,
'ㅠㅠㅠ': 1,
'를': 1,
'get_average_score': 1,
'구현하기': 1,
'데이터프레': 1,
'헤더파일': 1,
'int&': 1,
'오브젝트': 1,
'쪽': 1,
'왼쪽': 1,
'판별': 1,
'휴대폰': 1,
'동영상': 2,
'재생': 2,
'전원': 1,
'일시': 1,
'중지': 1,
'반복분': 1,
'깔끔': 1,
'페이징': 1,
'코드좀': 2,
'으': 1,
'막대그래프': 1,
'선그래프': 1,
'그리기': 1,
'연결': 2,
'리스트': 1,
'공백삭제': 1,
'관련질문드': 1,
'여러개': 1,
'3*3': 1,
'틱텍토': 1,
'게임': 1,
'구성': 1,
'시': 2,
'엔진': 1,
'철학': 1,
'메소드': 1,
'조언': 1,
'객체선언': 1,
'주석': 2,
'유니코드오류': 1,
'모르겠어': 1,
'#define': 1,
'상수': 1,
'선언떄': 1,
'우분투': 1,
'가상머신': 1,
'멀티스레딩': 1,
'읽기': 1,
'머쓱': 1,
'스탬프': 1,
'답보기요': 1,
'무관한지': 1,
'25206': 1,
'뭐': 2,
'확인': 1,
'고수분': 1,
'제너레이터화': 1,
'리액트': 1,
'쿼리': 2,
'js통해서': 1,
'아두이노': 1,
'통신관련': 1,
'정규표현식': 1,
'패턴': 1,
'추출': 1,
"'MODULE_NOT_FOUND'": 1,
'데이터베이스': 1,
'다른방법없을까요': 1,
'첫번': 1,
'폰켓몬': 1,
'멀티프로세싱': 1,
'실행시': 1,
'수십개': 1,
'소수점': 2,
'이용해서': 1,
'앱': 1,
'(생초보)': 1,
'매개변수': 1,
'개수': 1,
'로지스틱': 1,
'회귀': 1,
'2단계': 1,
'구명보트': 1,
'구분': 1,
'다음': 1,
'변형': 1,
'변환': 2,
'과정': 1,
'1': 3,
'이': 1,
'해석': 1,
'생성': 3,
'재정의': 1,
'뭔지좀': 1,
'출력하기': 1,
'spy++,': 1,
'특정': 3,
'[python질문]': 1,
'처음보는데': 1,
'웹크롤링': 2,
'타입에러': 1,
'있을까요ㅠㅠ': 1,
'level0': 1,
'어디': 1,
'한달': 1,
'1byte': 1,
'스킬': 1,
'체크': 1,
'테스트': 1,
'2': 4,
'무한루프': 1,
'문의드': 1,
'제목': 1,
'세션': 1,
'스토리지': 1,
'발': 1,
'저장법': 1,
'단점': 1,
'뭘까요': 1,
'BeautifulSoup4': 1,
'분수': 1,
'맥': 1,
'터미널': 2,
'파이썬3': 1,
'2차원배열': 1,
'입력하기': 1,
'마우스': 1,
'이벤트': 1,
'처리': 1,
'31': 1,
'4': 2,
'||': 1,
'둘다': 1,
'같은의미아닌가요': 1,
'질문이요': 2,
'질문이욧': 1,
'의': 1,
'재귀함수': 1,
'c++': 1,
'동적할당': 1,
'생성자': 1,
'스프링': 1,
'배치': 2,
'구현부분': 1,
'하기': 1,
'[python3]': 1,
'문제해결': 1,
'동적배열': 1,
'선언': 2,
'이유': 2,
'디자이너': 1,
'사용해서': 1,
'프린터': 2,
'출력시': 2,
'메': 1,
'윈도우': 1,
'창': 1,
'전체': 1,
'Q&A': 1,
'작성글': 1,
'보기': 1,
'서블릿': 1,
'기초적': 1,
'질문할께요ㅠ': 1,
'[코틀린]': 1,
'사진': 2,
'거기': 1,
'안나와요': 1,
'관련하': 1,
'두': 1,
'데이터': 4,
'매칭하려': 1,
'영상': 1,
'프레임별': 1,
'라즈베리파이': 1,
'캡쳐': 1,
'넘버링': 1,
'동기적': 1,
'문제점': 2,
'통신': 1,
'자료구조': 1,
'함수들': 1,
'활용법': 1,
'儆儆儆儆儆': 1,
'아코디언': 1,
'갤러리': 1,
'좌표': 1,
'테이블': 1,
'read_excel()': 1,
'마방진': 1,
'장고(django)': 1,
'프레임웍': 1,
'타이머': 1,
'버튼': 1,
'엑셀파': 1,
'부탁드': 1,
'카테고리': 2,
'직전': 1,
'직후': 1,
'구매': 1,
'예측': 1,
'[판다스]': 1,
'원천': 1,
'프레임': 1,
'안': 1,
'문자': 2,
'프레': 1,
'파이선': 2,
'체크박스': 1,
'&': 1,
'버블정렬구현': 1,
'최단경로': 1,
'이진탐색트': 1,
'중복': 1,
'컬럼': 1,
'과제요청': 1,
'왕초보': 1,
'인덱싱': 1,
'이거': 1,
'컴파': 1,
'딜레': 1,
'儆儆이러한': 1,
'뭔가요': 1,
'리눅스': 1,
'아이텀2': 1,
'등록': 1,
'6': 2,
'랜덤': 1,
'6사이': 1,
'3': 1,
'이럴땐': 1,
'설치오류': 1})
In [12]:
# WordCloud를 이용해 텍스트 구름을 만들어봅시다.
from wordcloud import WordCloud
#한국어가 지원되는 폰트를 font_path='' 안에 넣으면 나옴
wordcloud=WordCloud(
font_path='/Users/weare/글꼴/HakgyoansimWoojuR.ttf',
background_color='white',
width=1000,
height=1000
)
img=wordcloud.generate_from_frequencies(counter)
plt.imshow(img)
Out[12]:
<matplotlib.image.AxesImage at 0x24b98d6e8c0>
'데이터 기초' 카테고리의 다른 글
AB테스트 (0) | 2024.01.04 |
---|---|
ETL 기초 실습 (0) | 2023.12.31 |
테스트 코드 구조 소개 (1) | 2023.12.25 |
셀레니엄 이용한 자동화 웹 스크래핑 (0) | 2023.10.26 |