[머신러닝] 스팀잇 글 분류하기 (첫번째 시도)

in #kr6 years ago (edited)

스팀잇을 처음 시작했을 때부터 게시글을 카테고리별로 분류하고 싶었습니다. 머신러닝을 이용해서 하고 싶었던 프로젝트 중의 하나였어요. 그런데 머신러닝이 어려워서 한동안 손을 놓고 있었네요.

요즘은 머신러닝보다 리액트의 매력에 빠져서 리액트 코딩 영상과 문서만 보고 있습니다. ㅎㅎ 제가 머신러닝을 경험하면서 배운 점은 코딩과 머신러닝은 다른 세계라는 것입니다. 저같은 코더에게 머쉰러닝은 너무 어렵습니다.

이 글은 사실 예전에 구현했다가 실패해서 draft에 담아두고 있던 글인데, 버리기 아까워서 다시 꺼냈습니다. 스팀잇 글을 분류하기 위해서 몇달 전에 포스팅했던 머신러닝 나이브 베이즈 분류기를 사용하였습니다. 다시 한 번 결과를 말씀드리면 스팀잇 글을 분류하는 데 실패했습니다.


* * *

머신러닝 학습 데이터를 만들기 위해서 네이버 블로그 사이트를 크롤링하였습니다. 네이버 블로그 사이트의 각 카테고리에서 100건씩 글을 가져왔습니다.

참고로 네이버 블로그는 31개의 카테고리로 분류하고 있습니다. 그리고 분류 코드는 이렇습니다.

directorySeqs = {
  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: 'IT',
  31: '사회',
  32: '건강',
  33: '경제',
  34: '교육',
  35: '외국어',
  36: '원예',
}


* * *

분류기 만들기

textblob.classifiers 에서 나이브베이즈 분류기(NaiveBayesClassifier)를 import 합니다. 그리고 konlpy.tag에서 은전한닢(Mecab) 형태소 분석기도 생성합니다.

from textblob.classifiers import NaiveBayesClassifier
from konlpy.tag import Mecab
pos_tagger = Mecab() # 형태소 분석기



학습 데이터 만들기

크롤링한 데이터를 사용하여 학습 데이터를 생성합니다. 한글만 남기고 다른 문자는 모두 제거합니다. 그리고 형태소를 분석합니다.

import os

train_data = []
for root, dirs, files in os.walk('data'):
    # 파일 모두 읽기
    for fname in files:
        full_fname = os.path.join(root, fname) # 읽을 파일 전체 경로
        directorySeq = root.split('/')[1] # 디렉토리=카테고리
        text = open(full_fname, 'r').read() # 파일 읽기
        text = stripNotHangul(text) # 한글을 제외한 문자는 제거
        pos_tag = ['/'.join(token) for token in pos_tagger.pos(text)] # 형태소 분석
        data = (pos_tag,  directorySeq)
        train_data.append(data) # 학습 데이터에 추가하기

참고로 네이버에서 크롤링한 데이터는 정제되어 있지 않습니다. 그래서 데이터가 매우 지저분한 상태입니다. 예를 들면 HTML 태그 구조가 네이버 에디터 버전마다 다릅니다. 그리고 문장의 시작과 끝이 구분되지 않는 경우도 있습니다.



학습하기

학습 데이터(train_data)를 이용하여 머신러닝을 학습합니다.

cl = NaiveBayesClassifier(train_data)

제 노트북에서는 학습하는데 10분 이상 걸렸습니다. 발열과 팬소음도 납니다. 학습하다가 가끔 파이썬 커널(kernel)이 죽는 경우도 있어요. ㅠㅠ



분류기준 살펴보기

cl.show_informative_features()

분류 기준을 보면 텍스트에 맛/NNG이 포함되어 있으면 29(맛집) 일 확률이 63.7% 입니다. 그리고 차량/NNG이 포함되어 있으면 25(자동차) 일 확률이 62.2% 입니다. 그리고 영화/NNG가 포함되어 있으면 6(영화) 일 확률이 62.1% 입니다. 분류기준은 나무랄 데가 없네요. ㅎㅎ



정확도 확인하기

네이버에서 크롤링한 데이터 중에서 일부를 가지고 정확도를 테스트 해보았습니다. 정확도가 26% 로 매우 낮습니다.

얘가 26점을 받아왔어요. 학습이 부진하네요. 다른 학습지 공부라도 시켜야 할 듯...



스팀잇 글 분류하기

스팀잇 kr 태그에서 게시글 100개를 가져왔습니다.

discussions = get_discussions('kr', 100)


그리고 분류기로 스팀잇 글을 분류해보았습니다. 하지만, 스팀잇에서 가져온 글이 모두 요리로 분류되었습니다. ㅠㅠ 100건의 글 카테고리가 모두 [요리] 입니다. ㅋㅋㅋㅋㅋ


* * *

원인은 모르겠습니다. 왜 이렇게 분류했는지를 확인하는 방법도 모르겠습니다. 제 노트북도 모른다네요. 좀 더 연구를 해봐야지 원인을 알 수 있을 것 같습니다. 다음번에는 텐서플로우를 사용해서 시도해보려고 합니다.

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


Sponsored ( Powered by dclick )

dclick-imagead

Sort:  

Hi @anpigon!

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

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

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

짱짱맨 호출에 응답하여 보팅하였습니다.

이번 주 북이오 스팀달러 에어드랍에는 논픽션으로 유명한 바다출판사의 "보고서의 법칙"이 독점으로 올라왔습니다.

이번 주 스팀달러 에어드랍 소개

테이스팀, 먹스팀 글이 너무 많아서 아예 전부 맛으로 처리한 거 아닐까요. 이쪽으로는 문외한이지만 태그로 분류하면 정확도가 더 높아지지 않을까요?

지금 결과로만 봤을때 태그로 분류하는 것이 더 정확하겠어요 ㅎㅎ

재밌는 글 잘봤습니다.
저도 공부해보고 싶어졌습니다. 머신러닝 기초만 좀 배워서요 ㅜㅜ
공부하자공부하자 하는데 잘 안되네요.

질문이 있습니다.

  1. 분류기를 학습할때, 학습 데이터가 (형태소, 카테고리)로 한 것이지요?
    그러면 각 카테고리마다 중복되는 형태소들이 많아서.. 분류가 안되는게 아닐까 싶어요.
    제 짧은 생각으로는, 특히 요리 쪽 카테고리에는 글이 많고, 다른 카테고리의 글들까지 포함하는 형태소들도 많아서
    다 요리로 간게 아닌가 싶네요.

  2. 그러면 실제 테스트를 어떻게 하신건가요?

  • 1개 테스트 글의 형태소를 모두 넣어 분류된 결과 리스트에서 제일 많은 수의 카테고리 선정.
  • 형태소를 넣어본다?

3.적다보니 생각났는데 저라면 카테고리의 중복되는 형태소들을 먼저 빼고
(고민해봐야하겠어요. - 사람들이 자주 사용하는 것들은 그냥 뺸다? 다른 통계자료의 도움? )
그러면 그 카테고리를 잘 나타내는 형태소들만 남을 것같아요.

남은 형태소들로 다시 한번 분류기를 학습한 다음에
테스트 글을 넣어보면 꽤 잘될거같아요.

shin님의 말씀대로 태그도 명확한게 있긴하지만, jjangjjangman, busy 등은 중복되고
네이버의 태그는 쓸만할 것 같아요. 카테고리와 관련된 태그일 것 같아요.

감사합니다.

저는 머신러닝은 관심있는 샘플소스나 튜토리얼을 따라한 것이 전부입니다. 기초도 몰라요.
그래서 머신러닝쪽은 @jacobyu님의 도움이 필요합니다. ㅎㅎ

순서대로 질문에 답변 드릴께요.

  1. 학습 데이터는 ([형태소 분석한 텍스트], 카테고리) 구조로 만들었습니다.

    분류가 안된 이유는 잘모르겠지만, 카테고리마다 중복되는 형태소가 많아서 분류가 안 되었을 가능성이 크다는 생각이 드네요.ㅎㅎ

  2. 테스트 방법는 스팀잇 글을 가져와서 형태소 분석하였습니다. 그리고 학습된 NaiveBayesClassifier 분석기의 기준으로 분류했습니다.

    학습 데이터에서 중복되는 형태소를 뺀다든지 하는 데이터 정제가 필요할 것으로 생각됩니다.

제 생각이지만,NaiveBayesClassifier로는 많은 분류를 분석하기 힘들다고 판단됩니다. 대부분의 샘플 소스를 보면 긍정/부정, 스팸 필터링 정도로만 사용하고 있어서요.
스팀잇 글 카테고리 분류는 좀 더 연구해보고 다시 도전할 생각입니다.

저도 같이 공부하면서 해보고 싶어요. 저도 고민해볼게요.

네 ㅎㅎ 답변감사합니다.

재밌는 공부거리 인거같아요.
딥러닝/ 머신러닝을 실제 적용해볼 수 있는

나중에 저도 시도해봐야겠네요.

코딩맨님도 해보세요. 제 능력으로는 어렵네요.ㅋ


@anpigon님 곰돌이가 6.9배로 보팅해드리고 가요~! 영차~

고마워요 곰돌이~!

스팀잇 자체에 뭔가 걸려 있는 건가요??
신기하네...ㅋ

원인을 분석해봐야 정확하게 알수 있겠지만, 한글 분류기 오픈 소스를 좀더 찾아봐야겠어요.ㅋ

대단하네요 ^^ 이런 작업을 ㅎ
힘내세요 ~~

Posted using Partiko iOS

응원 감사합니다. 좀더 연구해서 다시해보려구요.ㅋ

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

You received more than 250 as payout for your posts. Your next target is to reach a total payout of 500

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

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