[머신러닝] 파이썬으로 스팀잇 형태소 분석하기 #2 - 단어구름 만들기

in #busy6 years ago (edited)

안녕하세요. @anpigon 입니다.

이전 글에 이어서 이번에는 스팀잇에 작성한 글에서 단어를 추출하여 단어구름을 만들어 보겠습니다.


이전글


워드클라우드 모듈 설치

워드클라우드(wordcloud) 모듈을 설치한다.

pip install wordcloud

워드클라우드 깃허브에서 사용방법 또는 예제 소스를 참고할 수 있다.



스팀잇에 작성한 글 가져오기

스팀잇에서 내가 작성한 글을 가져온다. 작성한 글을 모두 가져오려면 오래 걸리니 우선 1건만 가져와서 테스트해본다.

from steem import Steem 
from steem.blog import Blog

username = 'anpigon' # 사용자 아이디
b = Blog(username)
# posts = b.all()
posts = b.take(1) # 1건만 가져온다

texts = []
for post in posts:
  if post.body != "":
    texts.append(post.body.replace('\n', ''))
    
print(texts)
결과 화면




형태소 분석으로 단어 추출

형태소 분석에는 은전한닢(Mecab) 분석기를 사용한다. 분석기 중에서 은전한닢이 가장 속도가 빠르고 분석결과가 만족스러웠다.

from konlpy.tag import Mecab
tagger = Mecab()
tokens = []
for text in texts:
  tokens += tagger.nouns(text)

print(tokens)
결과 화면




단어구름 만들기

이제 스팀잇 글에서 뽑아낸 단어를 가지고 단어구름을 만들어 보자.

import matplotlib.pyplot as plt
from wordcloud import WordCloud

wordcloud = WordCloud().generate(' '.join(tokens))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
결과 화면

위와 같은 이미지가 나타난다. wordcloud가 한글 폰트를 지원하지 않아서 그렇다.

한글 폰트가 설치된 경로를 설정한다. 폰트가 설치된 경로는 OS마다 다르기 때문에 이 부분은 각자 확인하고 설정해야한다. 그리고 흰색 배경이 좋아서 배경색을 흰색으로 변경하였다.

# Window의 경우 폰트 경로
# font_path = 'C:/Windows/Fonts/malgun.ttf';

wordcloud = WordCloud(
    font_path='/Library/Fonts/AppleGothic.ttf',
    background_color='white'
).generate(' '.join(tokens))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
결과 화면




스팀잇에서 작성한 모든글을 가져와서 단어구름 만들기

글 한건에 대해서 분석이 완료 되었다. 이제 내가 작성한 모든 글을 가져와서 분석해보자.

from steem import Steem 
from steem.blog import Blog
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from konlpy.tag import Mecab

# 1. 스팀잇에서 작성한 글 모두 가져오기
username = 'anpigon'
b = Blog(username)
posts = b.all()

texts = []
for post in posts:
  if post.body != "":
    texts.append(post.body.replace('\n', ''))
    
# 2. 형태소 분석하여 명사 단어 추출하기    
tagger = Mecab()
tokens = []
for text in texts:
  tokens += tagger.nouns(text)

# 3. 단어구름 만들기
wordcloud = WordCloud(
  font_path='/Library/Fonts/AppleGothic.ttf',
  background_color='white',
  max_words=2000,
).generate(' '.join(tokens))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
결과 화면

내가 평소에 글을 작성할 때, 구현, 사용, 아래 단어를 많이 사용하는 것을 볼 수 있다. 해당 단어는 카운트에서 제외하고 다시 실행해보자.

from wordcloud import WordCloud, STOPWORDS

stopwords = set(STOPWORDS)
stopwords.add("사용")
stopwords.add("구현")
stopwords.add("아래")

wordcloud = WordCloud(
  font_path='/Library/Fonts/AppleGothic.ttf',
  stopwords=stopwords,
  background_color='white',
  max_words=2000,
).generate(' '.join(tokens))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
결과 화면

아까와는 다른 결과가 나왔다. 이제 사각형 형태의 단어구름 모양을 이쁜 구름모양 ☁으로 바꿔보자.

참고로, 워드클라우드 깃허브 샘플소스에는 엘리스와 다스베이더 예제가 포함되어 있다.

나는 픽사베이(pixabay)에서 무료 구름 이미지를 가져와서 적용하였다.

from os import path
from PIL import Image
import numpy as np
import os

d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()

mask = np.array(Image.open(path.join(d, 'cloud.png')))

wordcloud = WordCloud(
    font_path='/Library/Fonts/AppleGothic.ttf',
    background_color="white", 
    max_words=2000, 
    stopwords=stopwords,
    mask=mask,
).generate(' '.join(tokens))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
결과 화면

이미지 파일로 저장하고 싶으면 to_file()함수를 사용하면 된다.

wordcloud.to_file(path.join(d, "wordcloud.png"))




단어 빈도수 계산

nltk와 plt모듈을 사용하면 단어 빈도수를 계산하여 그래프로 나타낼 수 있다.

import nltk

plt.figure(figsize=(12,6))
words = nltk.Text(tokens, name='단어 빈도수')
words.plot(50) # 50개만
plt.show()
결과 화면


여기까지 읽어주셔서 감사합니다.


Sort:  

이오스 계정이 없다면 마나마인에서 만든 계정생성툴을 사용해보는건 어떨까요?
https://steemit.com/kr/@virus707/2uepul

@virus707님의 단어구름입니다.

@virus707님의 단어구름입니다.

요즘 파이썬에 흥미가 많은데 잘 보고 있습니다^^

@danovan님의 단어구름입니다.

@danovan님은 아들 생각밖에 없으시군요.
멋진 아빠입니다.😊

아직 마감 안했다면 함 부탁드릴게요..

@sadmt님의 단어구름입니다.

마감 시간은 없어요. 단어구름 봇이 24시간 실행되고 있습니다.😃sadmt님은 우리, 사람, 시간, 아이, 시작 단어가 보입니다. 제 느끼으로는 감성적인 분 같습니다.

신기합니다. 재미있네요..

사람이 먼저군요
유니콘님

와! 스팀잇에서 형태소분석기와 워드클라우드를 보는 날이 왔군요!
존경합니다!

제가 스팀잇을 분석해보겠습니다.ㅎㅎ

@buglife 님의 단어구름입니다.

오! 오오오오~~ㅎㅎㅎ

이 정도로 감탄해주시다니 감사합니다. 😃

Congratulations @anpigon! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

Award for the number of posts published

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

SteemitBoard - Witness Update

Support SteemitBoard's project! Vote for its witness and get one more award!

thank you.

코딩 지식이 없는 까막눈은 눈만 끔뻑거리다 갑니다 😅

코딩 지식이 없다면 구현 과정은 쓱 지나치고 결과물만 보면 됩니다.ㅎㅎ

@ponzipanda님의 단어구름입니다.

젠장 ㅋㅋㅋㅋㅋ 적나라하군요

머리속을 들여다 보는 느낌이겠어요.ㅎㅎ

재밌는것을 만드셨군요.
어디 예제였던가 자바스크립트로 날아다니는 글자로 post 내용을 분석해서 빈도수 크기를 출력하는 오픈 소스 있었는데 그게 기억 나는군요.
steem.js 블록 체인 정보를 읽어와 실험 삼아서 날아나기에 해보긴 했는데 소스가 생각이 안나네요.
자바스크립트 오픈 소스 사이트였는데 사이트 명이 기억이 잘 안나는데 steem.js와 연동하면오픈 소스만 잘 활용해도 재밌는 것들을 많이 만들 듯 싶네요.

자바스크립트로 가능하다면 자바스크립트로 구현해보고 싶네요.
기억나면 나중에 알려주세요~😁

@codingman님의 단어구름입니다.

와!!! 진짜 내 머리속을 ㅋㅋㅋ
스팀잇에 똑똑한분들 진짜 많이 계십니다!!!
부럽습니다!
저는 큰 아들한테 코딩 조금 배우다가 포기...ㅋㅋㅋ

@rtytf님의 단어구름입니다.

와우.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

@rtytf님은 평소에 어떤 생각들을 하고 있을까요?ㅎㅎ

ㅋㅋㅋ. 항상 분할매수 입니다 ㅋㅋㅋ
감사합니다!!

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 신기하지 않나요? 머릿속에 뭐가들었는지 다보이는거 ㅋㅋㅋㅋㅋㅋㅋㅋ

저도 몰랐는데 분석해서 단어구름을 만들어 보니깐 재미있네요.
그래서 이런 서비스가 있으면 재미있을 것 같다는 생각을 했어요.
참고로 이 포스팅에는 댓글이 등록되면 단어구름을 생성해주는 봇을 돌리고 있어요.
하지만 생각보다 댓글이 많이 달리진 않아서 다행이에요.
단어구름 봇이 죽을까봐 걱정했는데..ㅎㅎ

ㅋㅋㅋㅋㅋㅋㅋ 와 삼춘꺼 정확도 100%

node.js로 형태소 분석하는걸 하려고 했는데 이런게 ... ㅎㅎㅎ

@nhj12311님의 단어구름입니다.

그나저나 정말 애매한 구름이네요 ㅋㅋㅋㅋ 생각, 스팀, 포스팅이라는 말을 많이 썼군요.

많은 사람들의 단어구름에서 스팀, 포스팅, 생각이라는 단어가 많이 보이네요. 스팀잇에 글을 작성할 때 많이 사용되나 봐요.😄

원래 Node.js로 하고 싶었는데
환경셋팅이 너무 어려워서 진행하다가 막혔습니다.
@nhj12311님! 혹시 Node.js로 하셨으면 방법 좀 알려주세요~😁

조만간 개발할게 있어서 노드 버전으로 포스팅한번 하겠습니다. ㅎㅎ

감사합니다. 기다려지네요 ㅎㅎ

steem.blog 라는게 있군요. 전 그냥 get_blog_entries던가로 썼는데. blog가 좀더 단순하게 쓸수 있는 거 같네요. 테스트해보진 않았지만 all()에서 느껴지는 포스가 limit제한이 없게 만들어져있을듯도 싶은데. 그나저나 스팀잇 API문서화가 너무 안좋아서ㅠㅠ 아니 옵션이 있으면 옵션의 종류가 설명이 되어있어야할텐데 설명이 없고ㅠㅠ 딴데 되어있나 전 주로 python쪽만 보다보니. 정말 문서화별로란 이야긴 많이 들었지만 이 정도일 줄은 매번 감탄하며 배우고 있습니다ㅎㅎ js쪽도 하시니 혹시 그쪽이 문서화가 더 잘되어있나요? 어차피 함수명같은게 거의 비슷하고 그러니 뭘봐도 큰 상관은 없더라고요.

@blockchainstudio님의 단어구름입니다.

js쪽도 문서화가 파이썬과 다를바 없습니다. 저는 파이썬이 익숙하지 않아서 js보다 어렵네요. 그리고 함수 옵션에 대한 설명이 없어서 깃허브에 공개된 sdk소스를 보고 연구했습니다. 그나마 소스코드에 주석은 달려있네요 ㅎㅎ
스팀잇은 문서 정리가 필요해보입니다.😁

감사합니다^^ 안그래도 댓글 달려서 신기했는데 봇을 켜두셨군요. 앞으로 재미난 거 많이 기대할게요ㅎㅎ 역시 front-end아닌 뭔가 큰걸 하려면 결국
파이썬을 쓰긴해야할거에요. 흑흑 주말인데 리스팀 리워드 계산기 만들고 있는중

다른사람 단어구름 보는게 재미있어보여서 봇을 돌려놨어요~ㅎㅎ

머신러닝쪽은 JS 보다는 파이썬에 자료가 많더라구요.
그래서 요즘 파이썬에 익숙해지려고 노력중입니다.

그리고 리스팀 리워드 계산기가 먼지 궁금하네요~
기다려집니다. ^0^/ 어서 올려주세요~

별건 아니고 리스팀 이벤트 해주신분들 보팅하는데 이벤트에만 응모하시는 계정들이 더러 있어서 골라볼겸 겸사겸사 리스팀의 효과를 차등화해서 보팅하려고요. 아예 차등이 없으면 이벤트 계정이 문제가 있고 수동으로 하려니 오히려 더 골치라 다 만족시킬순 없겠지만 곰돌이가 그렇게 계산했다 하려고요ㅎㅎ 어차피 메인 포스팅에 보팅할거라 유심히 안보면 모를테고요ㅎㅎ

파이썬이 R과 더불어 최신라이브러리가 가장 빨리나오는 언어다보니 머신러닝하시려면 반드시 쓰셔야할거에요. 어차피 다른 언어 하셨으면 어렵지도 않고요ㅎㅎ

앗 그리고보니 이미지는 어떻게 올리시나요? 다른데 올리고 링크만 하나요? 아직 포스팅쪽은 자세히 보진 않았는데 스팀잇서버자체에 이미지를 업로드하는 건 못본것 같은데.

블록체인스튜디오님은 요즘 곰돌이 때문에 바쁘시네요.ㅎㅎ

텐서플로우가 파이썬으로 구현되어있으니 머신러닝하려면 반드시 파이썬을 사용해야겠어요.
그런데 예전 언어를 사용하던 습관 때문에 신텍스 오류를 자주 냅니다. 익숙해지면 괜찮아지겠지요 ㅎㅎ

그리고 이미지는 https://imgur.com 에 올리고 스팀잇에는 이미지 링크만 등록합니다.

감사합니다. 그 업로드 과정이 궁금했던건데 수동으로하시진 않을테니 찾아보니 imgur가 api도 제공하는군요! 그래서 사람들이 많이 쓰는거구나. 얘네는 대체 뭘로 돈버는건지 궁금해지네요ㅎㅎ

저도 파이썬이 뒤에 배운거니(아주 어린사람아니면 사실 다 그렇죠) 아직도 if 같은데 뒤에 ":" 자꾸 빼먹습니다. 반대로 한동안 쓰다 다른거 쓰면 if 뒤에 : 붙이고ㅎㅎ

우와! 이거 몇년전부터 미국에서 유행했는데~ 스팀에서도 이렇게 만들 수 있다니 너무 신기하네요 🤩

@aileecho님의 단어구름입니다.

@aileecho 역시 자나깨나 남편 생각ㅎㅎ

danovan님과 비교되는 단어구름이네요.ㅎㅎ

전 보고 엥????????? 내가 남편 얘길 어디에다 썼지???? 의아했습니다 ㅋㅋㅋ 깜놀

이걸 보여주면서 새로나온 아이폰을 사달라고 하세요ㅋㅋ

에이.. 이정도면 스팀 10만개급이죠 ㅋㅋㅋㅋㅋ

ㅋㅋㅋ 10만 스파업 하셔도 저 잊으시면 안됩니다ㅎㅎ

남편이 엄청 좋아하네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

남편분이 좋아해주시니 저도 기분이 좋아졌어요.😀

한때 한국에서도 유행했었죠. 태그구름이라고...
저는 스팀잇을 가지고 노는게 재미있습니다.😁

스팀잇 태그구름 신선하고 좋아요!

감사합니다. 신선한걸 더만들어 볼께요~

에일리 머리속에는

  1. 남편
  2. 사진
  3. 놀러가서 먹는거
    맞지? ㅋㅋㅋㅋ

1번 빼고 맞는거 같은데? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

와, 제가 하기엔 어려워 보이는데 결과물은 예쁘네요. ^^ ㅎㅎ

@kyeongah님의 단어구름입니다.

wow 감사합니다~^^^^

항상 감사하시는 분이네요.
결과물이 이쁘죠?ㅎㅎ
감사합니다.

오 저도 만들어주세여ㅋㅋ

@dalkong323님의 단어구름입니다.

달콩님은 미국과 중국 역사(과거)에 관심이 많네요~😁저는 미래에 관심이 많아요.
하지만 역사는 반복 된다고 하는데, 역사를 많이 알면 미래의 방향을 예측할 수 있지 않을까요?

캬 표현력이 멋지시네요😏 재밌는글 많이 올려주세요!ㅋㅋㅋ 흥미롭게 보고있습니당

와우...재밌네요.
저도 좀...ㅋㅋㅋ
(전 스몬,스팀몬스터, 스팀잇, 스팀, 스팀잇으로 돈벌기
예상해봅니다.ㅋㅋㅋㅋ)

@lucky2님의 단어구름입니다.

ㅎㅎㅎㅎㅎㅎ스몬은 아직 없네요.ㅋㅋㅋㅋㅋ

자나 깨나 스팀 생각! 당연하죠 스팀의 모범직원이신데. 사람과 댓글! 사람을 중요시 여기신다. 댓글로 소통을 중요시 한다! 좋습니다요!!!!

티스토리 블로그에서 연초에 이런 걸 만들어서 보여주는데(작년 글들을 기반으로 해서) 참 신기하단 생각을 했어요. 그게 개인의 힘으로도 구현이 되는 거였군요. 놀랍습니다. 능력자!

@slowdive14님의 단어구름입니다.

티스토리에도 작년 글을 기반으로 단어구름을 만들어주는 서비스가 있었군요. 티스토리 했었는데 몰랐네요. 스팀잇에서 단어구름을 만들어보니 저도 넘 신기합니다. 그리고 최근에 머신러닝관련 자료가 많아서 구현하기가 쉬워졌습니다.

slowdive14님은 심리치료에 관심이 많네요.😁

스티미언들의 관심이 크네요. 단어구름 서비스 꽤 정확한 거 같습니다. 제 최대 관심사를 맞췄네요. 자리 피셔야 할 듯요 ㅎㅎ

ㅋㅋㅋ 감사합니다. 자리 펴야겠어요~~😁

Posted using Partiko Android

댓글을 달면 분석해 주시는건가요? ㅎㅎㅎ

@eversloth님의 단어구름입니다.

감사합니다!

단어구름은 봇이 생성해서 달아주고 있습니다.^^
eversloth님은 항상 스팀 포스팅 생각을 하시네요~😁

아주 재밌습니다. 저도 하나 부탁드려도 될까요?

@hersnz님의 단어구름입니다.

정말 감사드려요.

Posted using Partiko Android

제 글을 읽고 댓글 달아주셔서 감사합니다.
오늘도 좋은 하루가 되길 바랍니다.😀

아주 유용했습니다
감사합니다

Posted using Partiko Android

저도 부탁드립니다. 고양이, 와인 정도로 예상해요. ㅋ

@realsunny님의 단어구름입니다.

감사합니다!!!!! :)

예상하신 고양이가 나왔네요.😁 축하드립니다. 그리고 와인도 조그맣게 보이네요.

저도! 신청해봅니다^^

@pediatrics님의 단어구름입니다.

@pediatrics님의 단어구름입니다.

단어구름이 2개가 달렸어요. 봇이 두번 실행됬나봐요.
첫번째 단어구름이 더 이쁘게 만들어졋네요.😁

정말 재밌어 보이는데 엄두가 안나네 했었는데 친절하세도 해주시다니 감동입니다 ^^

@wisecat님의 단어구름입니다.

저도 단어구름 만들어주는게 재미있어서 자동봇을 실행하고 있습니다. 사람, 생각, 이야기, 친구 라는 단어가 많이 보이네요. wisecar님은 친구(또는 사람)들 이야기나 생각을 잘들어주나봐요.😁

제가 지금까지 쓴 글들의 단어 구름을 보니까 뭐라고 썼는지는 기억 나지 않는데.... 제가 좋아하는 단어들인 것 같긴하네요. ^^

아니 이런게 가능하다니... 대단하십니다~
파이썬을 깔아야 가능한건가요?! 혹시 가능하다면 제것도 좀... 너무 궁금하네요ㅋㅋ

@moonm00n님의 단어구름입니다.

오늘 냉면 물회 생각 스팀 무엇
ㅎㅎㅎㅎㅎ
재미있습니다.

맛집을 찾아 헤매는 테이스터 시군요. 단어구름은 제 봇이 생성해드립니다.😁

아.. 아직 안끝났나요.. ㅋㅋㅋㅋ

@kilu83님의 단어구름입니다.

마감시간은 없어요.ㅋㅋ 단어구름 봇이 24시간 실행되고 있습니다. kilu83님은 가상화폐, 블록체인에 관심이 많으시군요.ㅎㅎ

그런가봐요.. ㅎㅎ 감사합니다!!

앗, 럭키님 포스팅보고 찾아왔습니다. 부탁해도 될까요 ^^

@jayplayco님의 단어구름입니다.

감사합니다 ^^

이렇게 많은 분들이 관심을 가지고 댓글을 달아주셔서 너무 감격스럽습니다. 이런 경우가 첨이라서요.ㅎㅎ
감사합니다.

Hi @anpigon!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 1.093 which ranks you at #48293 across all Steem accounts.
Your rank has dropped 66 places in the last three days (old rank 48227).

In our last Algorithmic Curation Round, consisting of 499 contributions, your post is ranked at #158.

Evaluation of your UA score:
  • Only a few people are following you, try to convince more people with good work.
  • The readers like your work!
  • Good user engagement!

Feel free to join our @steem-ua Discord server

Thank you.

안피곤님 요 포스팅 완전 핫했네요 ㅎㅎㅎㅎ
저는 이제야 봤습니다 ㅜㅜ

@jisoooh0202님의 단어구름입니다.

오우
포스팅해야지 ㅋㅋㅋㅋㅋㅋㅋㅋ

단어구름 포스팅이 완전 핫했습니다.
지수오님은 역시 늘 포스팅 생각이네요.
포스팅과 스팀 글자가 제일 크게 보입니다.ㅋㅋ😁

딱 맞는것 같습니다. ㅎㅎㅎㅎㅎ
포스팅 해야하는데
스팀 해야하는데 이생각 하는데
제가 글로도 표현을 했었군요 ㅋㅋㅋㅋㅋ

구름단어 엑스레이를 보니 지수오님은 스팀잇 중독 초기 증상입니다.
그래도 스팀잇에 계속 포스팅 해주세요. ㅎㅎ😀

초기아니고 중증인듯 싶습니다...........
ㅎㅎㅎㅎㅎㅎㅎ

와우 진짜 신기하네요. 자신이 무심코 자주 쓰는 단어가 뭔지, 관심도 등을 한 눈에 알 수 있을 것 같습니다. 형태소 나오는 순간 멍해졌는데 진심 능력자십니다~!!

@heavyong님의 단어구름입니다.

감사합니다~!! 역시 아이 이야기가 많네요^^ 자주자주 방문할 것 같은 예감입니다~!^^

많은 분들이 관심을 가져주셔서 너무 감사합니다.
형태소 분석 원리는 저도 잘 모르지만, 구현하는건 어렵지 않아요.ㅎㅎ
단어구름 이미지가 이쁘게 생성되었네요.

진짜 신기하네요
포스팅 보고 따라해보려 했는데...
점점..^-^;;;;;
넘 어려워요

@ddllddll님의 단어구름입니다.

우와♡♡
넘 예뻐요
감사합니다

디디엘님은 항상 아이 생각 뿐이네요.ㅎㅎ
생소한 "마음둥이"라는 글자가 보입니다.

안피곤님의 단어구름 덕분에 즐거운 기분이 들어요~
마음둥이...맘에 들어요
어떤 의미인지 모르지만...
제가 둥이를 생각하는 마음 정도로 이해하고 싶어요^^

형아 구름에 스팀잇이 없다
찌찌도 없다
ㅜㅜ

"마음둥이"단어에는 표현할 수 없을 정도로 많은 의미가 담겨있을 것 같아요.ㅎㅎ
그리고 단어구름 덕분에 즐거우셨다니, 디디엘님 댓글을 보니 저도 즐겁습니다.