이 프로젝트를 시작하게 된 이유는.. 현재 근로를 하고 있는 곳에서 블로그를 운영 중인데, 이 블로그가 좀 어마무시하게 글을 생산한다.
그래서 근로하는 곳의 선생님이 우리 블로그에 가장 많이 쓴 단어가 뭘까? 라고 하시면서, 이런 거 만들 수 있냐? 라고 하셔서 시작되었다.
나는 개발자라면 내가 생각하는 것을 스스로 만들 줄 알아야 한다고 생각한다. 또 나는 그런 사람이 되고 싶어서 한 번 도전해 보게 되었다.
제작기 🔥
우선 처음에 요구사항을 들었을 때는 Python 사용해서 네이버 API 가져다 크롤링해서 데이터 구하면 되겠다라고 생각했다.
하지만 네이버 Developer의 API나 네이버 광고의 API들 중 특정 블로그의 데이터를 조작할 수 있는 API는 없는 것 같아 Github를 둘러보았고 이미 내가 원하는 기능을 만들어 두신 분이 있어서 이것을 이용하기로 했다.
우선 여기서부터 시작이어서 사용하는 것은 수월했다.
혹시 따라하시려는 분이 계실까 봐 조금 상세히 남겨 두도록 하겠다.
우선 VScode에서 해당 repo를 불러와준다.
$ git clone https://github.com/cosmoquester/WordCloud-from-NaverBlog.git
그러면, 다음과 같이 파일이 설치 될 것이고
해당 프로젝트에 쓰인 Python 모듈들을 불러오기 위해서 다음 명령어를 입력해 준다.
(만약 설치가 안된다면 pip나 pip3가 설치되어 있는지 확인하자)
$ pip3 install git+https://github.com/psj8252/WordCloud-from-NaverBlog.git
그 뒤에는 examples 파일에 있는 sample.py에 가보자.
from nbclouder import Clouder
naver_id = ""
clouder = Clouder(naver_id)
clouder.fire(['전체글'], "my_blog_cloud.png", "/Library/Fonts/Arial Unicode.ttf")
이 코드에서 naver_id 변수에는 특정 블로그의 아이디를 기입해 주면 된다.
또한, clouder.fire 함수는 다음과 같은 파라미터들을 받을 수 있다. 아래 설명을 참고해 원하는 대로 커스텀해보자.
category_names - 네이버 카테고리 명
image_path - 저장될 이미지 경로
font_path - 사용할 폰트 경로
pos_tagging_fn - 문장 내 단어들의 품사를 식별하여 태그
datetime_filter_fn - 찾고자 하는 포스팅 기간
white_tags - 찾을 품사 종류
background_color: str = "white" - 배경색(이 부분은 워드 클라우드가 안생김)
width: int = 800 - 이미지 가로 크기
height: int = 600 - 이미지 세로 크기
sample1.py을 이용해서 Word Cloud를 생성하려면 다음과 같이 입력하면 된다.
$ python3 sample1.py
그런데, 아마 이대로 generating을 하면 개발자 분께서 품사 태깅을 해줄 기본 모듈을 Okt로 해두고 기본적으로 명사, 동사, 어간을 파악하도록 해 두어서 뭔가 내가 원하는 대로 생성되지 않았다.
위 그림을 보면 "하다", "있다", "되다" 와 같이, 별로 중요하지 않은 단어들이 있어서 이런 단어들을 제외시키기 위해서 애를 썼다.
우선 품사를 제대로 핸들링하기 위해서 pos tagging의 모듈을 Mecab으로 바꿨다.
(komoran, kkma, Okt 다른 모듈들도 써 보았지만.. 실제로 Mecab이 가장 성능이 좋았다)
하지만 Mecab은 따로 설치를 해야 해서 아래 링크를 참고하자.
그다음엔 Mecab의 품사표를 보고 원하는 품사를 골라내기 위해서 white_tags 변수에 기입해 준다.
# NLP Mecab
mecab = Mecab()
mecab_white_tags = ("NNG", "NNP", "NP") + ("XR",)
mecab_freq = clouder.get_word_frequency(contents, mecab.pos, white_tags=mecab_white_tags, preserve_tag=True)
mecab_freq = {morph + "다" if pos in ("VV", "VA") else (morph): count for (morph, pos), count in mecab_freq.items()}
나는 "하다", "있다", "되다" 와 같은 단어들을 없애기 위해서 VV와 VA를 word_frequency 과정에서 검색되지 않도록 삭제해 주었다.
또, stop_word 리스트를 만들어서 clouder.py 내부에서 글에서 text를 추출하는 과정에서 해당 단어가 나오면 카운팅 되지 않게끔 해주었다.
stop_words=[',', '.', '을', '를', '이다','있다','로','은','이','라','그','태그','이웃','되다',"해","요","따","경","겉","해"]
for text in contents:
if text in stop_words:
continue
추가적으로, 그냥 네모 모양으로 나오는 Word Cloud가 마음에 들지 않아서 mask를 씌워주기로 했다.
이 부분은 word cloud 모듈에 관련된 부분인데, word cloud 에는 적용할 수 있는 많은 기능들이 있기 때문에 다음 사이트들을 참고해 보면 좋을 것 같다.
코드를 보니 흰색 부분은 배경 처리가 되어서 단어가 들어가지 않는다.
이 점을 이용하여, 내가 원하는 부분 외의 부분을 검은 부분으로 칠한 뒤 코드를 실행시키면 다음과 같은 결과를 얻을 수도 있다.
후기
결과물이 꽤나 만족스러워 기분이 좋다! 😎
사실 A부터 Z까지 내가 다 만들까도 싶었지만.. 빠르게 끝내고 다른 것을 공부해보고 싶어 그렇게 까진 하지 않기로 했다.
오픈소스를 이용해 보는 것도 사실 개발 시간을 단축시킬 수 있는 좋은 개발 경험이 아닐까..? 라고 합리화를 한다..😅
나중에는 단어 리스트들을 txt로 가공해 웹에서 word cloud가 움직이는 프로젝트를 해보면 재밌겠다! 라는 생각을 해 보았다.
다들 재밌으니 한 번 해보도록 하자 😉
참고하면 좋은 글
'활동 > 개인 프로젝트' 카테고리의 다른 글
빠른 개발을 위한 React Form 구성 템플릿 (0) | 2024.12.07 |
---|---|
Monte Carlo Walker (ref. Nature Of Code) (0) | 2022.02.25 |
Gaussian line (ref. Nature Of Code) (0) | 2022.02.20 |
맥주 음미 노트 (개발X / 디자인X / Figma) (0) | 2021.11.29 |
Random Walker (0) | 2021.11.03 |