Notice
Recent Posts
Recent Comments
Link
터칭 데이터
스크래핑 결과 시각화 - 해시코드 + 워드클라우드 본문
In [1]:
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
4-5. 워드클라우드 만들기 - 해시코드 질문 키워드¶
- bs4와 wordcloud를 이용해서 질문 키워드를 보여주는 시각화를 진행해봅시다.
Target: 해시코드 질문 제목의 키워드¶
지난 실습에서 해시코드(https://hashcode.co.kr) 질문태그를 활용해 Bar Plot을 그렸다면,
이번 실습에서는 질문 제목을 스크래핑한 후, 형태소 분석을 진행해서 워드클라우드를 그려봅시다.
In [2]:
# 다음 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 [3]:
# Pagination이 되어있는 질문 리스트의 제목을 모두 가져와 리스트 questions에 저장해봅시다.
# https://hashcode.co.kr/?page={i}
# 과도한 요청을 방지하기 위해 0.5초마다 요청을 보내봅시다.
import requests
import time
from bs4 import BeautifulSoup
questions = list()
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 [4]:
len(questions)
questions[:10]
Out[4]:
250
Out[4]:
['틀린 부분 모르겠어요ㅠㅠ', 'flask를 vscode에서 gunicorn을 활성화해서 실행시키고 싶은데 gunicorn을 활성화했는데도 wsgi 서버를 활용하지 않느다고 오류메세지가 뜨네요', 'MSSQL 2008->2019 마이그레이션 후 게시판 정렬 문제', '묵시적 형변환', 'y값이 입력이 안됩니다.', '이 방식으로 배포하는 게 맞나요?', '스택 자료 삭제 알고리즘 문제 관련 궁금한 점', '프로그램에 대하여', 'iframe의 토큰 관련 질문입니다!', 'css border 속성 관련 질문 드립니다.']
In [5]:
# 텍스트 구름을 그리기 위해 필요한 라이브러리를 불러와봅시다.
# 시각화에 쓰이는 라이브러리
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 횟수를 기반으로 딕셔너리 생성
from collections import Counter
# 문장에서 명사를 추출하는 형태소 분석 라이브러리
from konlpy.tag import Hannanum
In [8]:
words=list()
hannanum = Hannanum()
nouns = hannanum.nouns(questions[0])
words += nouns
words
Out[8]:
['부분', '모르겠어요ㅠㅠ']
In [9]:
# Hannanum 객체를 생성한 후, .nouns()를 통해 명사를 추출합니다.
words = list()
hannanum = Hannanum()
for question in questions:
nouns = hannanum.nouns(question)
words += nouns
len(words)
Out[9]:
1064
In [11]:
# counter를 이용해 각 단어의 개수를 세줍니다.
counter = Counter(words)
counter
Out[11]:
Counter({'부분': 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, '것': 5, '스택': 2, '자료': 1, '삭제': 2, '알고리즘': 1, '관련': 11, '궁금': 3, '점': 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, '클래스': 2, '구별': 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, '중': 9, '초렙': 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, '발생': 9, 'ㅜ': 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, '백준': 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, '심사': 1, '메시지': 1, '절차': 1, '결제': 1, '연동시': 1, '보안이슈': 1, '문제질문드': 1})
In [16]:
# WordCloud를 이용해 텍스트 구름을 만들어봅시다.
wordcloud = WordCloud(
font_path="C:\Windows\Fonts\malgun.ttf",
background_color="white",
height=1000,
width=1000
)
img = wordcloud.generate_from_frequencies(counter)
plt.imshow(img)
Out[16]:
<matplotlib.image.AxesImage at 0x1faae97ef50>
'데이터 시각화(Data Visualization)' 카테고리의 다른 글
워드클라우드(Wordcloud) (0) | 2023.10.27 |
---|---|
스크래핑 결과 시각화 - Hashcode (0) | 2023.10.27 |
스크래핑 결과 시각화 - 기상청 데이터 (0) | 2023.10.27 |
시각화 라이브러리 Seaborn (0) | 2023.10.27 |