ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python - 한글 형태소로 워드클라우드 시각화
    Programming & Machine Learning/Python X 머신러닝 2017. 8. 22. 00:09

    워드클라우드는 자연어 분석과정에서 흔히 사용하는 기초적이며 간단한 시각화 방법이다.


    패키지를 사용한다면 구현이 매우 간단함과 동시에, 

    tf-idf나 word2vec처럼 사람이 직관적으로 관찰하기 힘든 알고리즘을 주로 사용하는 자연어 분석 영역에서 

    매우 유용한 시각화 툴이기 때문이다.


    python에서도 여러 워드클라우드 모듈을 제공하지만, KoNLP에서는 pytagcloud를 이용한 시각화 튜토리얼을 제안한다.

    http://konlpy.org/ko/v0.4.3/examples/wordcloud/


    위 링크에 나와있는 튜토리얼을 기반으로, input text data를 형태소 기반으로 처리하며,

    동시에 불용어까지 제거하여 tokenize 해주는 코드를 추가하여 사용해보았다.


    import random import webbrowser import pytagcloud # requires Korean font support import sys from collections import Counter def removeNumberNpunct(doc): text = ''.join(c for c in doc if c.isalnum() or c in '+, ') text = ''.join([i for i in text if not i.isdigit()]) return text def tokenize(doc): return [t[0] for t in pos_tagger.pos(removeNumberNpunct(doc), norm=True, stem=True) if t[0] not in stopwords] r = lambda: random.randint(0,255) color = lambda: (r(), r(), r()) def get_tags(text, ntags=50, multiplier=1): count = Counter(text) return [{ 'color': color(), 'tag': n, 'size': int(c*multiplier*0.03) }\ for n, c in count.most_common(ntags)] def draw_cloud(tags, filename, fontname='Noto Sans CJK', size=(800, 600)): pytagcloud.create_tag_image(tags, filename, fontname=fontname, size=size) webbrowser.open(filename)

    df_docs = [(tokenize(row['text']), row['label']) for index, row in df.iterrows()] token = [t for d in df_docs for t in d[0]] tags = get_tags(token) draw_cloud(tags, 'wordcloud.png')


    참고 : input data set은 df로, Dataframe의 형태이다. (불용어 사전은 stopwords)


    input text 데이터에서 숫자, 특수문자를 제거한 뒤 불용어 사전(한국어  형태로소 구성)으로 필터링한 단어들을 워드클라우드로 표현하는 코드이다.


    특이점은 pytagcloud 패키지를 사용할 때, 간혹 한글이 깨지는 경우가 있는데

    fontname='Noto Sans CJK'

    이 부분에서 패키지 내에 폰트가 설치되어 있지 않은 경우가 있다는 것이다. 특히 OSX에서는 거의 대부분 오류가 날 것이다.


    이를 해결하기 위해서는 라이브러리가 설치된 경로, site-packages/pytagcloud/fonts 로 폰트 파일을 넣어준 뒤, js파일을 수정해주어야 한다.


    필자의 경우, 아래와 같은 경로가 라이브러리가 설치된 경로이다. (아나콘다 가상환경)

    /anaconda/envs/bigpie/lib/python3.6/site-packages/pytagcloud/fonts


    예제의 코드에서는 Noto Sans CJK라는 폰트를 사용했지만, 확실한 테스트를 위해서 나눔고딕 폰트를 넣어보자.

    네이버에서 나눔고딕 폰트를 ttf 파일로 다운받은 후, 폴더 내에 복사하여 넣어준다.



    다음으로 fonts.json 파일을 수정해주자. 필자는 vi 편집기로 간단하게 편집했다. (윈도우는 sublime text등의 에디터로 하는 것을 권장)



    {

                    "name": "Korean",

                    "ttf": "NanumGothic.ttf",

                    "web": "http://fonts.googleapis.com/earlyaccess/nanumgothic.css"

    },


    이 부분을 추가해주면 된다. 


    web은 웹폰트 링크인데, 웹폰트 링크가 없는 폰트는 아마 잘 실행되지 않는 것 같다.




    그리고 다시 위의 예제코드를 수정하여 실행하면 에러가 발생하지 않고, 다음처럼 시각화된 wordcloud.png 파일이 작업 디렉토리에 생성된다.


    [ fontname='Noto Sans CJK' 를 fontname='Korean'으로 바꿔준다. ]


    댓글

분노의 분석실 Y.LAB