지난 주에 자모에 대해 Fasttext를 이용하여 Embedding 하는것을 고려했었다. 그러나 Labeling에 대한 문제 해결이 우선이었기 때문에 이 방법에 대한 고려는 뒤로 미루기로 했다.
데이터 라벨링
일단 데이터는 Tweet 데이터를 사용하기로 결정했었다. 찬찬히 tweet들을 살펴본 결과 하나의 아이디어가 생각났다. 저번에 tweet에 어떠한 이모티콘이 있으면 그 감정으로 Labeling하는 논문이 있었는데 한국 tweet은 이모티콘을 많이 쓰지 않아 적용하기 어려울 것이라 생각했었다. 그러나 이모티콘으로 검색이 된다면 해당 이모티콘을 사용한 tweet을 많이 뽑아낼 수 있다는 생각을 했다. 어떻게 보면 당연한 이야긴데 깊게 생각하지 못 했던 것 같다.
데이터 수집
Twitter API로도 데이터를 모을 수 있지만 제한이 있기 때문에 twitterscraper 라는 오픈소스를 활용하기로 했다.
from twitterscraper import query_tweets
list_of_tweets = query_tweets("😡 OR 😠", lang='ko', limit=300000)
print("length: {}".format(len(list_of_tweets)))
for tweet in list_of_tweets[:30]:
print(tweet.text)
결과를 대략 보면 아래와 같다.
xxxxxxxxxx
length: 127280
@skullhong 이 부러워! 난 당신을 포옹 할 수 있었으면 좋겠어! pic.twitter.com/VcbYk8FERw
윤창중이 한건하니 원세훈건이 살짝 감춰지고 납량식품회사도 한숨 고르는것 같다. 이명박은 어디갔을까..나로호는? 없어진게 넘 많어
완전 지들편한대로 언론플레이. 니들
입맛대로하고 소스대로하고
강압억압적당히하시길
한꺼번에 터짐 어찌감당하라그려
하나도제대로 못하면서
@KokyLovesBrown 뭐야???? 몰라요
아!!!! 왜이렇게더워!!??!?!?!?!
@espressokein ㅋㅋㅋ 그게 뭐에여 우리왕 무휼이 장옥정이나 지키라고 누가 시켰냐능
난 당신을 화나게 해요 ~~
일단 앞의 태그를 먼저 삭제한 다음 .csv 파일로 저장했다.
import pandas as pd
tweet_pd = pd.DataFrame()
for tweet in list_of_tweets:
idx = 0
splits = tweet.text.split(' ')
for split in splits:
if split.startswith('@'):
idx += len(split)
else:
break
tweet_pd = tweet_pd.append({'rt' : tweet.text[:idx], 'tweet': tweet.text[idx:]}, ignore_index=True)
print(len(tweet_pd))
tweet_pd.to_csv('angry_data_12.csv')
tweet_pd.head(20)
이렇게 하면 아래와 같이 어느정도 태그가 분리된다.
Tweet 전처리
먼저 3글자 이하의 짧은 tweets를 삭제할까 했지만
x[버럭, 주다해, 왕짜증, 새끼, 참나, 싫어, 음.., 아기, 짜증나, 미친, 뿔난다, 자랑, 흥, 짜증나,...]
위와 같이 세 글자 이하의 문장임에도 불구하고 화남의 감정이 드러나있어 삭제하지 않기로 했다.
그 다음 Null인 tweet을 삭제하기로 했다. Null인 tweet이 존재하는 이유는 이모티콘만 쓴 경우다. 따라서 의미없는 데이터이므로 삭제하는 편이 좋다.
tweet_pd = tweet_pd.drop(columns=['Unnamed: 0', 'rt'])
tweet_pd = tweet_pd.drop(tweet_pd[tweet_pd['tweet'].isnull()].index)
tweet_pd.head()
다음으로 "허~~~ RT @gaddongyi:~"와 같은 RT 메시지를 삭제해주고 정규표현식으로 숫자와 영어 그리고 링크를 삭제해주었다.
추후 계획
이제 token을 만드는 방법이 두 가지가 있는데 첫 번째는 자모 분리, 두 번째는 단어로 분리하는 것이다. 일단 첫 번째는 감이 안 와서 패스하고 두 번째 방식으로 모델을 만들어보기로 했다. 하지만 띄어쓰기가 잘 안 되어있고 오타가 많아 일반적인 Tokenizer를 사용할 순 없었다. 오타가 많은 경우 자모 분리로 하는 것이 유리하지만 그 경우는 모델 개선에서 생각하고 soynlp의 MaxScoreTokenizer를 사용해서 단어 분리를 진행하기로 했다. MaxScoreTokenizer는 단어 점수를 이용해서 띄어쓰기가 제대로 지켜지지 않은 데이터를 tokenize 할 수 있게 한다. 그러므로 띄어쓰기가 많이 되어있지 않은 tweet 데이터에도 사용할 수 있을 것이다.
'NLP' 카테고리의 다른 글
GPT-1,2,3, DialoGPT 차이에 대해 간단히 알아보자. (0) | 2021.08.12 |
---|---|
[VCR] From Recognition to Cognition: Visual Commonsense Reasoning 논문 이해 (0) | 2021.07.11 |
다중 감성(multi-class sentiment) 분류 모델 개발일지 - 1 (1) | 2019.03.09 |
[keras, NLP] Seq2Seq로 번역 모델 구현하기 (0) | 2019.02.02 |
[NLP] 자연어 처리를 위한 필수 개념 정리: Language model, Representation (0) | 2019.01.21 |
댓글