[머신러닝] 파이썬으로 스팀잇 형태소 분석하기 #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님은 우리, 사람, 시간, 아이, 시작 단어가 보입니다. 제 느끼으로는 감성적인 분 같습니다.

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

사람이 먼저군요
유니콘님

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

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

감사합니다!

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

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

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

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

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

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

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

오! 오오오오~~ㅎㅎㅎ

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

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

@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번 빼고 맞는거 같은데? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

Coin Marketplace

STEEM 0.30
TRX 0.11
JST 0.033
BTC 64320.07
ETH 3154.23
USDT 1.00
SBD 4.34