Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

연탄코더

[파이썬 활용] 단어 구름(word cloud) 프로젝트: 2. 단어 구름 만들기 본문

프로그래밍

[파이썬 활용] 단어 구름(word cloud) 프로젝트: 2. 단어 구름 만들기

coalcoder 2019. 12. 3. 08:03

지난번 글에서의 크롤링 및 어절을 세는 과정을 하고 나면, 아래와 같은 어절-갯수 딕셔너리를 얻게 됩니다.

{
    '운전자를': 2, 
    '광시야각을': 1, 
    '특허창출': 1, 
    '도입키로': 1, 
    '걱정하지': 1, 
    '시상식에서는': 1, 
    '구독': 1, 
    '시스템으로': 4, 
    '비교해': 3, 
    '얼굴은': 6
    ...
}

이제 이 어절-갯수 딕셔너리를 이용해 실제로 단어 구름을 만들어보겠습니다. 프로그래밍 과정 중 맞닥트리게 되는 디버깅 과정과 점진적(incremental)·반복적(iterative) 개발 과정도 함께 맛보도록 하겠습니다.

순서

0. 구상하기 + 계획하기
1. 라이브러리 설치
2. 크롤링하기
3. 단어 쪼개기
4. 단어구름 만들기
5. 업그레이드 하기 I (명사 추출)
6. 업그레이드 하기 II (마스킹)


4. 단어구름 만들기

wordcloud 라이브러리를 활용합니다(공식 page 링크)

지난번 코드와 같은 위치에서 cloudy.py 파일을 생성합니다. 아래와 같이 지난번에 작업한 결과물을 불러오고, wordcloud 라이브러리를 활용하여 이미지를 생성합니다.

# cloudy.py

# 라이브러리 불러오기
from wordcloud import WordCloud
from crawling import load_counts_file, crawl_word_counts

# 어절-갯수 딕셔너리 가져오기. 위: 새로 크롤링, 아래: 파일 불러오기 
# word_counts = crawl_word_counts('IT')
word_counts = load_counts_file('word_counts_IT.txt')

# wordcloud 생성기 객체 만들고, 딕셔너리로부터 생성하고, 이미지로 저장 
wc = WordCloud()
wc_img = wc.generate_from_frequencies(word_counts)
wc_img.to_file('my_first_wordcloud.jpg')

 과연 어떻게 나올까요?

???

뭔가 이상합니다. 일단 까맣고, 글자는 안보이고 네모만 보이네요. > 이 기호랑 저기 5G는 보이는데..

실제 개발 과정에서 한번에 완성하는 경우는 드뭅니다. 반복적으로 시도하고, 결과를 보고, 문제를 파악하고, 고쳐 나가면서 점진적으로 발전시켜 나가는 방법이 컴퓨터 프로그래밍의 장점을 활용하는 더 적절한 방법이라고 할수 있습니다. 다른 작업(제조업을 생각해보세요)들에 비해 결과를 확인하는 것과 수정하는 과정이 빠르고 그 비용이 적기 때문이죠. 무튼 대부분의 문제는 다른 사람들도 겪은 문제이기 때문에 검색을 많이 활용하면서 발전시켜나가면 됩니다. 

문제점 

그럼 개선해봅시다. 우선 눈에 띄는 것은: 
1. 저 네모들은 뭐지
2. 배경 하얀색으로 하고 싶다.

1. 네모들이 나오는 이유는 구글이나 네이버에서 'wordcloud 네모' 이렇게 검색하면 결과가 나올텐데요. wordcloud가 기본으로 사용하는 폰트가 한글을 표현하지 못하기 때문입니다. 한글 폰트를 다운 받고, 생성시에 지정해주면 해결됩니다. 

2. 배경이 까만색. 이것도 'wordcloud 배경', 'wordcloud background color' 이런 식으로 검색하면 나올겁니다. WordCloud 생성기가 기본으로 배경을 까만색으로 잡아주기 때문이고, 색을 원하는 색으로 지정해주면 됩니다.

어떻게 지정해주면 될까요? 이번에는 공식 API 문서를 참고해봅시다. 글자가 많지만 찬찬히 보면 어렵지 않게 보입니다. 공식 문서 보는건 익숙해지면 큰 도움이 됩니다. (답변을 해줄 수 있는 사람이 됩니다.)

공식 API 문서 내의 class 설명

저기 font_path랑... background_color가 보입니다. 그리고 width, height, max_words, 뭐 이런것도 눈에 띄네요. 각 인자(parameter)에 대한 설명이 궁금하면 문서 아래에 이어져 나오는 내용을 참고하도록 하고요. 바로 알만한 것을 적용해서 이제 개선해봅시다.  

개선하기

네이버의 나눔글꼴(링크) 등 사용할 수 있는 한글 폰트를 다운 받아서 실행 코드와 같은 폴더에 저장합니다. 그러고 나서 아래와 같이 코드를 수정해줍니다.

# cloudy.py

    ...
    
# 객체 만드는 부분을 이렇게 바꿔준다.
wc = WordCloud(
    fontpath='NanumGothic.ttf',
    background_color='white',
    width=800,
    height=800
)

# max_words의 기본값이 200이기 때문에 200개까지 나타남.
wc_img = wc.generate_from_frequencies(word_counts)
wc_img.to_file('fixed_wordcloud.jpg')

이제 실행하면, 

오. 음..?

드디어 하얀 배경에 한글도 보이긴 하는데, 또 다른 개선할 점들이 보입니다. 우선 여기까지를 아주 단순한 수준에서 만든 ver 0.1 완성이라고 합시다. 이제 또 계속 개선해나가면 됩니다 :)

 

5. 업그레이드 하기 I: 명사만 추출

먼저는 >랑 저 동그라미 두개? 저게 뭔가 싶은 이상한 기호가 눈에 띄네요. '배상훈'(실제로 뭔지 궁금해서 찾아봤더니 갑자기 뉴스에 많이 등장한 어느 프로파일러 님이시군요)이나 '진행자' 이런건 원래 의도였던 키워드를 통한 트렌드 확인에 알맞지만, '수' 나 '같은' 이런 것들은 도움이 안 되는 어절들입니다. 

잠시 생각해보면, 모든 어절이 필요한게 아니고 명사만 있으면 될것 같습니다. 특히 '가능성은', '가능성이'와 같은 어절에서는 조사를 떼어내고서 한단어로 카운트할 수 있으면 좋겠죠. 이걸 어떻게 해야하나.. 고민하면서 쓸만한걸 새로 만들어도 되는데, 검색을 해보니 다행히 먼저 고민을 통과한 다른 분들이 있는 문제입니다. '형태소 분석기'를 사용해서 명사만 추출하도록 하겠습니다. 

다양한 한글 형태소 분석기가 있는데요. 성능 비교는 이곳을 참고하시고요. KoNLPy라는 파이썬 라이브러리를 통해 형태소 분석기를 활용해보겠습니다. 이거 설치하는게 특히 윈도우 운영체제는 또 좀 어려울 수 있는데.. 그래도 해봅시다. 

 KoNLPy 설치하기 (Windows) 

더보기

1. Open JDK 설치
(건너뛰기: cmd 창에서 javac -version을 입력해서 javac 1.x.x_xxx 이런 출력 결과가 나온다면 이건 건너뛰어도 됩니다)
- 다운: http://jdk.java.net/13 에서 Windows/x64 옆에 있는 zip 클릭하여 다운
- 설치: C:\Program Files\java\ 폴더 아래에 압축 풀기(없으면 폴더 생성)
- 설정: [Win] + R 키 누른 후 sysdm.cpl 입력 후 실행, [고급] 탭에서 맨 아래 [환경변수]
  1) 새로 만들기 - 변수 이름: JAVA_HOME 입력 후 아래 [디렉터리 찾아보기]에서 아까 설치한 폴더(C:\Program Files\java\jdk-13.0.1) 찾아서 확인
  2) Path 찾아서 편집 누르고 [찾아보기]에서 아까 설치한 폴더 아래 bin 폴더(C:\Program Files\java\jdk-13.0.1\bin)까지 선택 후 확인

* cmd 창 실행: [Win] + R 키 누른 후 cmd 입력. 환경변수 변경 이후 cmd창은 재실행해주세요.

2. JPype 설치
- 확인: cmd 창에서 python --version 입력하여 python 3.6, 3.7, 3.8 확인 3.x
- 다운: https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype에서 JPype1‑0.7.0‑cp3x‑cp3xm‑win_amd64.whl 버전에 맞게 다운
- 설치: cmd 창에서 다운로드한 폴더에 가서(cd 폴더 경로) pip install JPype1‑0.7.0‑cp3x‑cp3xm‑win_amd64.whl 입력. (안되면 pip install wheel 먼저 입력하여 설치 후 다시 입력)  

3. KoNLPy 설치
- 설치: cmd 창에서 pip install konlpy 입력
- 확인: cmd 창에서 python -m python -c 'import konlpy; print(konlpy.__version__)' 입력 후 결과 확인 

이렇게 설치를 완료했습니다. 설치된 KoNLPy 라이브러리를 통해 기본적으로 Kkma, Twitter, Komoran, Hannanum과 추가 설치(윈도우 제외)를 통해서 MecabKor 형태소 분석기를 사용할 수 있는데요. 우리는 Komoran 형태소 분석기를 사용할 겁니다.

형태소를 분석해서 명사만 추출하는 작업을 두 코드 파일 중 어디에 추가할지 생각해봅시다. 어절 갯수를 세는 작업을 하는 crawling.py의 count_words를 수정해주면 될 것 같습니다.

아래와 같이 수정해줍니다. 한음절 짜리 명사들도 많이 찍히기 때문에 같이 제외하도록 합니다. 

from konlpy.tag import Komoran

    ...

def count_words(articles):
    word_counts = {}
    
    komoran = Komoran()
    for article_text in articles:
        nouns = komoran.nouns(article_text)
        for noun in nouns:
            if len(noun) == 1:     # 한글자 명사 제외
            	continue
            if noun not in word_counts:
                word_counts[noun] = 0
            word_counts[noun] += 1
    
    return word_counts
    
    ...

그리고 다시 cloudy.py. 아까 수정한 내용을 반영하면,

# cloudy.py

# 라이브러리 불러오기
from wordcloud import WordCloud
from crawling import load_counts_file, crawl_word_counts

# 어절-갯수 딕셔너리 가져오기. 위: 새로 크롤링, 아래: 파일 불러오기 
# word_counts = crawl_word_counts('IT')
word_counts = load_counts_file('word_counts_1202.txt')

# wordcloud 생성기 객체 만들고(수정됨), 딕셔너리로부터 생성하고, 이미지로 저장 
wc = WordCloud(
    fontpath='NanumGothic.ttf',
    background_color='white',
    width=800,
    height=800
)
wc_img = wc.generate_from_frequencies(word_counts)
wc_img.to_file('finally_wordcloud.jpg')

실행하면 드디어!

한글자 제외 안할 때 결과
굿. 감격.

 이렇게 됩니다. '기자' 이것도 반복해서 등장하는 걸로 잡혔는데 없애도 되겠죠? 이건 직접 제외하는 튜닝을 해보도록 합시다.

 

6. 업그레이드 하기 II: 마스킹

 사각형 말고 다른 모양으로 만드는 건데요. 같이 해보고 나서 업데이트 해보던가 하겠습니다. 검색해서 스스로 해봐도 좋습니다. zzZ

Comments