Introduction
저는 재밌지 않으면 잘 안하려는 나쁜 습성이 있지만, 오늘 포스팅은 굉장히 흥미로우실거라 자신있게 말할 수 있습니다!
바로 Twitter(트위터)의 멘션을 크롤해서 데이터 분석을 해보는건데요. 제가 쓰려는 데이터는 일본어라서 이것 저것 해보지는 못했습니다.
제가 올린 몇개의 포스팅을 읽어보셨다면 아시겠지만, 저는 원스라서 트와이스와 트와이스의 노래를 예시로 많이 써왔습니다.
제가 사실 이걸 시작한 이유는 요즘 오랫동안 로그인 로그가 없었던 트위터 계정을 지운다는 소문이 있었습니다. 그래서 혹시 사나의 계정이 없어지면 다른 원스들도 슬플 것 같아서 멘션을 저장해놨다가 계정이 없어졌을 때 재업로드를 해주기 위해 시작한건데요.
사나의 트윗들을 보니 너무 귀여워서 데이터 분석을 짧게 해볼까 하는 생각이 들었습니다.
그래서 오늘은 데이터로 사나가 중학교 때 사용했던 트위터 멘션을 써보려고 합니다.
아마 원스라면 대부분 이 트윗 주소를 아실거에요ㅋㅋㅋ
저는 일본어를 못해서 무슨 뜻인진 잘 모르지만, 귀엽다는건 알아요 🐹👶🏻💜
Requirements & Environment
저는 맥북 프로를 쓰기 때문에 2013 레티나 레이트 입니다 왜 2013이냐 돈이없어서.. pip으로 설치할 수 있는 라이브러리들을 사용했습니다. 그리고 가상환경은 virtualenv를 썼습니다. 얼마전에 아나콘다 짜증나서 지워버렸거든요. 여러분 도커씁시다 그냥 (아나콘다 사랑해요
주피터 환경에서 테스트했습니다. 시각화를 바로바로 해보는덴 역시 주피터죠! 파이썬으로 코딩했습니다 요즘 super resolution에 관심이 많아져서 c++를 공부하고싶네요
- 코딩 및 시각화
- python 3.6
- jupyter notebook
- pandas
- matplotlib
- wordcloud
- Twitter 크롤
- tweepy
- 일본어 형태소 분석기
- konoha
- nagisa
일본어 형태소 분석기는 솔직히 잘 몰라서 쓰기 편한걸 사용했습니다.
Twitter 데이터 가져오기
제일 먼저 해야할 일은 데이터가 될 twitter 멘션들을 가져오는 일입니다. 그러려면 Twitter Developer에 가입을 하고, Apps을 등록하고 어쩌구 저쩌구 좀 해야될 일이 있는데요. 제 유튜브에 그 과정들을 올렸으니 한 번 보셔도 좋겠습니다. 그 과정 이외에도 이번 포스팅과 관련된 모든 과정이 담겨있습니다.
그 부분은 제 유튜브 및 구글신의 도움을 받아 잘 해결해보세요! 저는 그 다음 과정부터 이야기해보겠습니다.
import tweepy
consumer_key = "잇츠 마이 시크릿"
consumer_secret = "잇츠 마이 시크릿"
access_key = "잇츠 마이 시크릿"
access_secret = "잇츠 마이 시크릿"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)
tweets = []
username = '트위터 아이디를 입력하십쇼잉' # 가져오려는 트위터 아이디
count = 100
try:
for tweet in api.user_timeline(id=username, count=count):
tweets.append((tweet.created_at,tweet.id,tweet.text))
except BaseException as e:
print('failed on_status,',str(e))
위의 코드로 우리는 아래의 이미지처럼 트윗들을 가져올 수 있습니다. 잠시 살펴보면 날짜(datetime), 트윗 id, 멘션내용이 들어있습니다.
하지만 너무 보기 불편하게 생겼습니다. 데이터를 크롤하면서 데이터프레임에 저장해봅시다.
사나의 트윗은 총 349개 입니다. 테스트 하기 딱 좋은 갯수네요. 어떻게 트윗 개수조차 이렇게 배려가 넘치는지. 영원히 원스할거양
짜잔! 데이터 프레임에 사나의 멘션을 잘 정리해보았습니다. 깔끔하고 좋네요.
데이터 토크나이징 및 포스 태깅하기
제가 덕질하면서 이전엔 조금도 몰랐던 일본어를 주워들으며 알게된건데요, 일본어는 띄어쓰기가 없습니다.. 애기들 동화책에만 있더라구요
한국어 데이터를 대충대충 토크나이징 해볼 때는 띄어쓰기를 기준으로 먼저 해보는데, 일본어는 그게 불가능했습니다. 그래서 열심히 japanese tokenizing 등등을 검색해본 결과 konoha의 WordTokenizer가 편해보였습니다.
아래처럼 사용하면 됩니다.
from konoha import WordTokenizer
sentence = '自然言語処理を勉強しています' # 자연언어처리를 공부하고 있습니다.
tokenizer = WordTokenizer('MeCab')
print(tokenizer.tokenize(sentence))
[自然, 言語, 処, 理, を, 勉, 強, しています]
그래서 트윗들을 WordTokenizer를 이용해 토크나이징 해보았더니 아래와 같은 결과를 얻었습니다.
토크나이징은 아주 잘되지만 조금 문제가 있었습니다. @를 이용해서 태그를 한 부분이나, \(^O^)/★ 요렇게 생긴 이모티콘들이 다 망가진다는 것이었습니다. 사나의 트윗들을 대충 훑어보니 이모티콘을 엄청 많이 사용해서 이모티콘도 최대한 살리고 싶었습니다.
그래서 생각해낸게
- regex로 태그 및 이모티콘을 먼저 뜯어내고
- 트윗에서 뜯어낸 태그 및 이모티콘을 없애고
- 태그 및 이모티콘이 없어진 문장을 토크나이징 하고
- 토크나이징 된 리스트에 태그 및 이모티콘을 다시 넣어주자
입니다. 다행히 이 코드는 아주 잘 먹혔습니다. 뿌듯하네요. 그래서 아래와 같은 결과를 얻을 수 있었습니다.
이제 이렇게 잘 토크나이징 된 결과로 wordcloud를 만들어 보았습니다. 이 때 워드클라우드를 일본어를 지원하는 폰트를 지정해줘야한다는 것을 잊지마세요.
굉장히 귀엽습니다. 음표 많이 쓰는거 보세요. 이모티콘도 많이쓰네요.. 너무 귀여워.. 콘서트 가고싶어..
워드클라우드는 예쁘지만 어떤 단어를 많이 쓰는지 수치는 알 수 없습니다. 그래서 막대 그래프를 그려보았습니다.
어떤 단어들을 많이 쓰는지 잘 알 수 있습니다. 한글자짜리 일본어들도 보입니다. 그래서 이게 뭐지 싶어서 조금 찾아보니 조사인 것 같습니다. 사나의 멘션을 조금 더 자세히 알아보기 위해 조사를 제거해보겠습니다.
어떤 말이 조사인지 알려면 POS 태깅이 필요합니다. 그래서 이번에는 nagisa 라는 Pos tagger를 사용했습니다.
아래와 같이 사용하면 조사와 공백을 없앨 수 있습니다.
조사 및 공백을 제거한 데이터로 다시 워드클라우드를 그려보았습니다(오른쪽)
조사 및 공백 제거 전과 비교를 해보니 の 이런 애들이 없어졌습니다. 하지만 그대신 데스(です) 와 마스(ます)가 노랑색으로 크게 보입니다. 조사는 아니지만 단어가 아니므로 그다지 필요해보이지는 않았습니다.
막대 그래프도 그려보았습니다. 데스(です) 와 마스(ます) 꽤 큰 비중을 차지하고 있었습니다. 없애버려야겠어요.
아 그리고 아래에 보이는 ($gt;_<)는 특수기호가 깨져서 그렇습니다. (>_<) 와 같습니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 귀여워 눈물줄줄
검색해보니 데스(です) 와 마스(ます)는 조동사라고 합니다. 한국어도 버벅거리는데 일본어 조사 조동사 이런거 하려니.. 어렵네요.
뭔지 잘 모르겠지만 보조기호 라는 것도 없애줬습니다.
다시 워드 크라우드를 그려보았습니다(오른쪽)
데스(です) 와 마스(ます)가 없어지고 더 많은 한자 단어들이 커졌습니다. 이제 결과가 조금 마음에 듭니다!
막대 그래프도 빠뜨릴 수가 없습니다. 수치는 중요합니다. 이과같애..
많은 단어들이 보입니다! 이모티콘도요ㅋㅋㅋㅋ 그리고 6번째로 많이 나온 단어가 너무 귀엽게도 사나의 한자 이름입니다.
꽤 마음에 드는 결과에 다가갔으니(일본어 데이터 분석하시는 분들이 보면 가소롭겠지마ㅏㅏㅏㄴ....) 각 단어들의 뜻이 궁금해졌습니다. 그래서 30개 정도만 뜻을 구글링 해보았습니다. 틀릴수도 있어요. 그건 구글번역탓.. 남탓ㅋㅋㅋ
그 후 쉽게 보기 위해 dict에 정리했습니다. 데이터 프레임으로 바꿀거에요.
1, 2, 3은 뭘까요? 1은 원스, 2는 트와이스, 3은 원스+트와이스인걸까요 아니면 1 2 3 사나여서 그런걸까요 (의미없는 추리
보기 쉽게 dict를 데이터 프레임으로 바꿨습니다. 친절하게 가운데 정렬도 해보았습니다.
코딩의 세계에서는 대부분 0부터 시작합니다. 그래서 제 데이터 프레임의 인덱스도 0부터 시작합니다. 총 30개의 단어입니다.
이렇게 사나의 트윗을 짧게 분석해보면서 얻은 결과는 다음과 같습니다.
- 많이 웃는다 : (笑), w
- 이모티콘을 많이 쓴다 : ( ̄∀ ̄), (;_;), (*^^*), (^O^)
- 본인 이름을 많이 언급한다 : 紗夏
- 호기심이 많아 보인다 : なん, 何
지금이랑 똑같네요ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 역시 샤랑둥이 No Sana No Life 라는 것을 잊지마세요.
그럼 포스팅은 여기까지 쓰겠습니다~
아 홍보하나 하고 가겠습니다. 트와이스의 Youtube Originals의 시리즈 TWICE: Seize the Light 4월 29일 밤 11시에 나옵니다. 많은 관심 부탁드립니다!
'DL|ML' 카테고리의 다른 글
Checkerboard Artifacts 체커보드 아티팩트 (0) | 2020.05.28 |
---|---|
PReLU (Parametric ReLU) (0) | 2020.04.11 |
NLP에서 Downstream task 란 무엇일까? (0) | 2020.02.03 |
KoNLPy, mecab 설치하기 (ubuntu 16.04) (8) | 2019.12.11 |
mAP(mean Average Precision) (2) | 2019.09.22 |