Network 사용법도 익힐겸, 크롤링도 다시 복습해 볼 겸 다음의 문제를 해결해 보려고 했다.
[ 해결 문제 ]
다음 검색에서 '코로나'를 검색하면 연관 검색어가 나온다. 그 연관검색어를 다시 검색창에 입력하면 또 연관 검색어가 나올 것이다. 이렇게 3단으로 만들어진 검색어 라인을 한 줄로 만들어 데이터를 수집하고, 이들에 대한 관계를 시각화로 표현하자.
Step 1. Daum 검색어 크롤링
# 연관어 분석을 위한 크롤링을 실시한다.
import bs4
import pandas as pd
import numpy as np
import re
import requests
from bs4 import BeautifulSoup
word = '코로나'
url_based = 'https://search.daum.net/search?w=tot&DA=YZR&t__nil_searchbox=btn&sug=&sugo=&sq=&o=&q='
url = url_based + word
r = requests.get(url)
print(r)
soup = bs4.BeautifulSoup(r.text, 'lxml')
first_keywords = soup.find_all("a",{"class":"keyword"})
df = pd.DataFrame(columns = ['first', 'second', 'third'])
keywords = []
for f in first_keywords:
first = f.text
url_second = url_based + first
r2 = requests.get(url_second)
soup_second = bs4.BeautifulSoup(r2.text, 'lxml')
second_keywords = soup_second.find_all("a",{"class":"keyword"})
for s in second_keywords:
second = s.text
url_third = url_based + second
r3 = requests.get(url_third)
soup_third = bs4.BeautifulSoup(r3.text, 'lxml')
third_keywords = soup_second.find_all("a", {"class": "keyword"})
for t in third_keywords:
third = t.text
keywords.append([first, second, third])
for i in range(len(keywords)):
df.loc[i] = keywords[i]
df.to_csv('keyword_corona.csv')
코드 자체는 크게 어렵지는 않다. soup find_all을 통해 a 태그에 class가 keyword인 애들을 데려오면, 모두 연관 검색어가 되고, 이들 중, keyword를 차례대로 검색하기 위해서는 iteration을 돌려주면 된다. 이를 쉽게 3단으로 구현하면 된다.
Step 2. Networkx를 통한 시각화
Networkx 프레임워크는, 여러 데이터가 있을 때, 이들의 관계를 그래프로 표현하는 것이다. 여기서 말하는 그래프는 막대그래프, 꺾은선 그래프 등의 chart가 아닌, 이산수학에서 말하는 graph를 의미한다.
pandas dataframe을 로딩 후, 1번검색어와 2번검색어, 2번검색어와 3번검색어의 edge를 추가하는 방식을 사용하였다. add_edges_from을 통해 여러 edges도 한번에 추가할 수 있다.
g = nx.Graph()
for i in range(len(data)):
cur_row = list(data.loc[i])
g.add_edges_from([(cur_row[0], cur_row[1]), (cur_row[1], cur_row[2])])
그, 후 실제 시각화를 진행하면 다음과 같다.
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
# 한글 폰트가 깨지지 않기 위한 세팅
font_path = "C:/Windows/Fonts/NGULIM.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
plt.figure(figsize = (48, 36))
pos = nx.kamada_kawai_layout(g)
nx.draw(g, pos, with_labels=True, font_family = font)
plt.show()
같은 코로나 관련 키워드여도 모두 묶여있는 것이 아니라, 여러 섹션별로 군집화 되어있는 구조임을 알 수 있다.
구체적 진행 코드는 github 코드를 추가한다.
(코드에는 apirori 알고리즘을 활용한 시각화 또한 추가해보았습니다.)
'Archive > 데이터 분석 관련' 카테고리의 다른 글
[Data] Support Vector Machine 이해하기 (0) | 2022.01.24 |
---|---|
[Data] 데이터 파이프라인 구축 : 개요잡기 (0) | 2022.01.23 |
[Data] 데이터 분석 용어 - 이용자 및 매출에 대한 지표 요약 (0) | 2021.12.10 |
[Data] 범주형 변수의 Clustering (0) | 2021.10.28 |
[Data] Outlier의 처리에 대하여 - 개요, 간단한 방법들 (0) | 2021.10.19 |