본문으로 바로가기

단어~ 자연어 처리가 되었든 안되었든... 말(단어로 된)을 프로그램으로 다루다 보면 워드클라우드가 필요할 때가 있습니다. 오늘은 그 중 제가 볼 때, 가장 접근하기 편하면서 너무나 강력한 워드클라우드를 소개해 드릴까 합니다. 이름도 그냥 wordcloud입니다.~^^ 설치는 pip install wordcloud입니다.~^^

일단 처음에는 영어로 할거라~ 그냥 matplotlib를 import하고

constitution.txt

을 받아 두고 위 코드를 실행하면 됩니다.~ wordcloud 모듈 자체가 빈도를 계산하는 기능을 가지고 있어서 쉽게 결과를 얻을 수 있습니다.

그리고 그냥~ matplotlib에서 그려버리면 그만~~~^^ 그래도 뭔가 허전하시다면~~~ 사실 이걸로 끝인데^^ 좀 더 진행해 보죠^^ 아참.. 언제나 그렇듯.. 이 글은 WordCloud의 공식홈페이지[바로가기]에서 배포하는 예제를 그냥 한 번 실행해 본 것 뿐입니다.

max_font_size를 지정하면 좀 더 많은 단어를 볼 수 있습니다.

이번에는

alice.txt

를 다운 받으시고~

를 받으시면 됩니다.~ 그리고 위 코드를 실행해보시면 됩니다.~~~ 저건 변수 이름에서 눈치채셨겠습니다만... 저 모양으로 마스킹하겠다는 겁니다.^^ 여기서 살짝 PIL 모듈의 Image라는 명령으로 마스킹 데이터를 뽑을 수 있습니다.

뭐~ 마스킹 그림은 저렇구요~~~^^

엘리스 문서에서 단어를 뽑고~

짜잔~~~~ 괜찮죠^^

한가지 기술이 더 들어가면~ 칼라를 살짝 변경해서 저렇게 그레이톤으로~~~ 갈 수도 있습니다.^^

이번에는 starwars입니다.~~~

a_new_hope.txt

이 문서를 받아서 위 코드를 입력하고 마스킹 그림파일은

입니다.

짜잔~~~ 응? 좀 판독이 어렵죠...

어떤가요~ 괜찮죠^^

이번에는 엘리스 텍스트인데.. 마스킹을

으로 사용해보겠습니다.~~

괜찮죠~~ 그런데 WordCloud는 또 재미난 기능을 제공하는데요~

이런 마스킹의 색상에 대한 것을 반영해 줍니다.

요렇게 말이죠~~^^

이제.. 얼마전에 소개한 Lucy Park님의 KoNLPy 모듈[바로가기]을 사용해서 한글을 처리해보죠... 바로 대한민국 헌법입니다.

뭐.. 그냥 눈에 거슬리는 몇몇 단아만 수동으로 stop_words에 걸었습니다.ㅠㅠ

이제... 시작해야죠~~~ 법률, 대통령, 국가, 국회, 국민, 헌법이 많이 사용된 단어이네요~

한글 폰트에 대해 좀 설정해주고~~~[바로가기1바로가기2]

짜잔~~~~ 뭐 쉽네요^^ 근데.. 조금더 욕심을 내볼까요^^

구글링으로 저 그림을 구했습니다. 제가 저 그림을 구한 곳은 [바로가기]입니다. 미리 양해를 구하지 못해 송구합니다.ㅠㅠ.

다운은 위 그림으로 해주세요~

짠~.. 흠.. 좀 심하게 날씬해 보이지만.. 어떤가요.. 괜찮죠^^


댓글을 달아 주세요

  1. BlogIcon 꿈의벨벳 2017.05.31 17:26 신고

    정말 신기하네요ㅎㅎ 첨 봅니다

  2. BlogIcon 핑구야 날자 2017.06.01 07:19 신고

    쓸만한데요 예뻐서 프린트하면 좋겠네요

  3. BlogIcon pennpenn 2017.06.02 07:21 신고

    아이고!
    컴맹인 저는 머리 아픕니다.
    ㅎ ㅎ

    맑은 공기에 기분이 상쾌합니다.
    주말을 멋지게 보내세요.

  4. JTL 2017.06.02 11:19

    전 이상하게 kolaw.open 에서 에러가 나버리네요 :3
    암튼 재밌게 잘 봤습니다 :)

    • BlogIcon PinkWink 2017.06.02 11:45 신고

      혹시 konlpy가 설치되었는지 확인해주세요..
      pip install konlpy
      그런데.. konlpy 설치문서에도 있지만, 이걸 깔기 위해서는 JDK와 Java_home 파라미터 설정이랑, JPype1이 설치되어 있어야 합니다.ㅠㅠ

  5. BlogIcon GeniusJW 2017.06.03 15:21 신고

    텍스트 클라우드로 다양한 모양을 만들 수 있다니,,,
    멋지네요~~ㅋㅋ

  6. BlogIcon 종현_ 2017.06.05 01:47 신고

    감사합니다. 따라해보니 재미있네요.
    바탕화면으로 쓰고 싶은데 해상도가 너무 낮은거 같은데
    혹시 어떤부분을 조절해야 해상도를 높일 수 있는지 아시나요??

    • BlogIcon PinkWink 2017.06.05 08:06 신고

      앗~ 글쎄요.. (잘모르고 그냥 이야기하는 건데..) 혹시 figsize를 키우고, 그림으로 저장하면 되지 않을까요...ㅠㅠ.

  7. 2017.06.10 22:27

    안녕하세요! 정말 좋은 정보 감사드립니다.
    다름이 아니라 제 텍스트로만 바꾸고 올려주신 코드를 그대로 따라해 봤는데,
    Traceback (most recent call last):
    File "<stdin>", line 4, in <module>
    File "C:\Users\hello\AppData\Local\Programs\Python\Python36-32\lib\site-packages\wordcloud\wordcloud.py", line 357, in generate_from_frequencies
    max_frequency = float(frequencies[0][1])
    ValueError: could not convert string to float: 'freq'

    이런 에러가 나네요...! 혹시 도와주실 수 있을까요?

    정말 감사합니다!

  8. 2017.06.10 23:31

    앗 죄송합니다 아까 질문남긴 사람인데요...!
    아까 문제는 해결 된 것 같은데..

    이제는
    Traceback (most recent call last):
    File "<stdin>", line 5, in <module>
    File "C:\Users\hello\AppData\Local\Programs\Python\Python36-32\lib\site-packages\wordcloud\wordcloud.py", line 407, in generate_from_frequencies
    max_font_size=self.height)
    File "C:\Users\hello\AppData\Local\Programs\Python\Python36-32\lib\site-packages\wordcloud\wordcloud.py", line 432, in generate_from_frequencies
    font = ImageFont.truetype(self.font_path, font_size)
    File "C:\Users\hello\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\ImageFont.py", line 238, in truetype
    return FreeTypeFont(font, size, index, encoding)
    File "C:\Users\hello\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\ImageFont.py", line 127, in __init__
    self.font = core.getfont(font, size, index, encoding)
    OSError: cannot open resource

    이 오류가 뜨네요... ㅠㅠㅠ 말씀하신 한글 폰트의 문제인가요..?

    충실하게 따라한 것 같은데 안되어서 너무 속상하네요 ㅠㅠㅠ


    감사합니다 잘해결했습니다!!! 감사합니다

  9. 갱갱 2017.08.14 15:29

    오 재밌네요 잘배우고 갑니다!

  10. 뚜루 2018.04.14 00:11

    안녕하세요! 데이터주무르기로 따라하고 있는데
    8장에 나와있는거 다 설치되어있다고 하는데
    import WordCloud 라고 치면
    ModuleNotFoundError: No module named 'WordCloud' 오류가 나오고

    from wordcloud import WordCloud, STOPWORDS

    import numpy as np
    from PIL import Image 입력하면
    ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.
    라고 오류가 나와요ㅠㅠ
    설치할만한건 다 설치했는데
    명령프롬프트에도 WordCloud가 있는데 찾을 수가 없대요ㅠㅠ
    부탁드립니다ㅠㅠㅠㅠㅠ

    • BlogIcon PinkWink 2018.04.15 20:59 신고

      몇몇 분들께서 wordcloud의 설치 문제로 문의를 주시는데.. 너무 도움을 드리고 있지 못해 죄송스럽답니다.ㅠㅠ.
      일단,
      pip install pillow==5.0
      으로 해서 시도해보고, jupyter를 다시 실행해서 해보시는 걸 말씀드립니다.
      pil 모듈에서 에러가 나더라구요ㅠㅠ.

  11. 2018.05.14 22:28

    비밀댓글입니다

    • BlogIcon PinkWink 2018.05.15 01:21 신고

      넵.. 다 표현되지 못했네요..
      def grey_color_func(word, font_size, position, orientation,
      random_state=None, **kwargs):
      return 'hsl(0, 0%%, %d%%)' % random.randint(60,100)
      위 코드가 풀 코드 입니다.
      좋은 성과 있으시길 빕니다.~^^

  12. 2018.09.27 12:09

    비밀댓글입니다

  13. ㅇㅇ 2019.01.06 20:44

    유익한 글 잘 읽었습니다. 감사합니다.

    근데 폰트 바꿔 사용하려니 OSError: cannot open resource 오류가 뜨네요

    이상한게 자동설치형 exe 파일로 설치한 폰트를 사용하면 오류없이 잘 출력이 되는데(나눔류 폰트, 서울서체), ttf파일 수동으로 설치한 폰트들만 저렇게 오류가 떠요;

    윈도우10
    파이썬 3.7.2
    워드클라우드 1.5.0
    입니다

  14. 부산갈매기 2019.08.15 22:37

    안녕하세요 ^^ 항상 도움 받고 있습니다.

    alice 부분에서 코드 실행할 때 wc.generator(text) 다음과 같은 오류가 나는데 어떻해 해야되죠??

    도움 부탁드립니다 ^^

    <ipython-input-132-851321ced980> in <module>
    1 wc = WordCloud(background_color='white', max_words=2000, mask=alice_mask,
    2 stopwords = stopwords)
    ----> 3 wc = wc.generate(text)

    C:\ProgramData\Anaconda3\lib\site-packages\wordcloud\wordcloud.py in generate(self, text)
    603 self
    604 """
    --> 605 return self.generate_from_text(text)
    606
    607 def _check_generated(self):

    C:\ProgramData\Anaconda3\lib\site-packages\wordcloud\wordcloud.py in generate_from_text(self, text)
    584 self
    585 """
    --> 586 words = self.process_text(text)
    587 self.generate_from_frequencies(words)
    588 return self

    C:\ProgramData\Anaconda3\lib\site-packages\wordcloud\wordcloud.py in process_text(self, text)
    551 regexp = self.regexp if self.regexp is not None else r"\w[\w']+"
    552
    --> 553 words = re.findall(regexp, text, flags)
    554 # remove stopwords
    555 words = [word for word in words if word.lower() not in stopwords]

    C:\ProgramData\Anaconda3\lib\re.py in findall(pattern, string, flags)
    221
    222 Empty matches are included in the result."""
    --> 223 return _compile(pattern, flags).findall(string)
    224
    225 def finditer(pattern, string, flags=0):

    TypeError: expected string or bytes-like object

  15. lim 2019.11.06 00:16

    안녕하세요, 혹시 텍스트나 이미지 파일 저장경로가 중요한가요?

  16. BlogIcon 2019.12.13 19:18

    가독성이 좀 많이떨어져요

  17. 감사 2020.03.04 09:39

    잘 봤습니다. 감사합니다. 한가지 질문으로는.
    In[42] 의 tokens_ko = [each_word for ~~~~~~~ ]
    뒷부분에 짤린부분을 보고싶은데ㅠㅠ stop_ 다음 뭔지 알 수 있을까요?
    그냥 stop_words] 로 끝나는 것이라면 filter가 안되는 것 같아서요..

  18. PY 2020.06.01 22:53

    안녕하세요! <파이썬으로 데이타 주무르기> 8장에서 나온 워드클라우드와 모듈 설치 끝내고 앨리스 관련 코드 따라해보고 있는데요, 결과가 조금 이상해서요.
    분명 said를 책에서처럼 stopwords에 추가했는데, 앨리스 분석 결과를 보면 'alice said'가 있습니다. 그래서 wordcloud.generate 실행결과를 보니 'Queen' 과 'the Queen'이 모두 카운트 됐더라고요. 분명 기본 stopwords 리스트 확인했을때 'the'가 포함되어 있었는데요...
    아무리 생각해봐도 결과가 잘못된 것 같은데, 어디서 잘못된 건지 전혀 모르겠네요....
    도움 부탁드려요

    • BlogIcon PinkWink 2020.06.05 23:11 신고

      옵션에 stopwords=stopwords 같은 부분의 오타 여부를 확인해주세요~

    • PY 2020.06.08 22:20

      오타 여부 확인해봐도 틀린게 없는 것 같은데, 혹시 제가 못찾았나 해서

      https://github.com/PinkWink/DataScience/blob/master/source_code/08.%20Natural%20Language%20Processing.ipynb
      에 있는 소스코드로 다시 해보았는데 제껀 결과가 똑같이

      'Alice': 1.0,
      'said Alice': 0.5888324873096447,
      'little': 0.4619289340101523,
      'the Queen': 0.36548223350253806,
      'one': 0.3197969543147208,
      'the King': 0.3147208121827411,
      'thing': 0.29949238578680204,
      'now': 0.28426395939086296,
      'Mock Turtle': 0.28426395939086296,
      'the Mock': 0.26903553299492383,

      이런 식으로 나오는데요...

    • BlogIcon PinkWink 2020.06.22 07:52 신고

      아.. 확인해보겠습니다. ~

  19. 123 2020.10.19 12:22

    안녕하세요. 제가 흑백의 png이미지 파일로 실습을 하고 있는데 이미지 파일의 검은색 부분에다가만 단어를 넣고 싶은데 흰색부분과 검은색 부분의 경계만 라인이 들어가고 흰색, 검은색 부분 모두 단어가 들어가네요... 어떻게 해결할 수 있을까요? ㅠㅠ

  20. 박서진 2020.12.10 13:30

    관리자의 승인을 기다리고 있는 댓글입니다