1.KoBERT ์๊ฐ
KoBERT๋ BERT ์ ํ๊ตญ์ด๋ฒ์ ์ ๋๋ค.
BERT(Bidirectional Encoder Representations from Transformers)๋ ๊ตฌ๊ธ์ด ๊ณต๊ฐํ ์ธ๊ณต์ง๋ฅ(AI) ์ธ์ด๋ชจ๋ธ์ธ๋ฐ์,
์ผ๋ถ ์ฑ๋ฅ ํ๊ฐ์์ ์ธ๊ฐ๋ณด๋ค ๋ ๋์ ์ ํ๋๋ฅผ ๋ณด์ด๋ฉฐ 2018๋ ๋ง์ ์์ฐ ์ธ์ด ์ฒ๋ฆฌ(NLP)์์ SOTA๋ฅผ ๋ฌ์ฑํ ๋ชจ๋ธ์ ๋๋ค.
BERT์ ํน์ง์ผ๋ก๋ ์ธ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ธ์ดํํ ์ฌ์ ํ์ต์ ์๋ก์ด ๋ฐฉ๋ฒ
Wikipedia ๋ BooksCorpus์ ๊ฐ์ ๋์ฉ๋์ ๋ผ๋ฒจ๋ง ๋์ด ์์ง ์์ ๋ฐ์ดํฐ(์ ๋ต์ด ์๋)๋ก ๋ชจ๋ธ์ pretraining ์ํจ ํ,
ํน์ task๋ฅผ ๊ฐ์ง๊ณ ์๋ labeled data๋ก transfer learning์ ํ๋ ๋ชจ๋ธ์ ๋๋ค.
- Bidirectional
์ด์ ์ ๋ชจ๋ธ๋ค์ unidirectionalํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ฅ์ ๋ฌธ๋งฅ์ ์ธ ๊ณ ๋ ค๋ฅผ ํ์ง์์, language representation์ด ๋ถ์กฑํ์ต๋๋ค
ํ์ง๋ง BERT๋ Bidirectional ํ๊ธฐ ๋๋ฌธ์ ํ์ชฝ ๋ฐฉํฅ์ด ์๋๋ผ ์์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์ตํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด,
language representation ์์ค์ ๋์์ต๋๋ค.
-๋ค์ํ ์ธ์ด๋ชจ๋ธ ์ ๊ณต
BERT๋ ์์ด ๋ฐ 103 ๊ฐ ์ธ์ด์ ๋ํ ์ฌ์ ํ๋ จ ๋ ์ธ์ด ๋ชจ๋ธ์ ์ ๊ณตํ์ฌ ํ์์ ๋ง๊ฒ fine-tuningํ ์ ์์ต๋๋ค.
2. ๋ฐ์ดํฐ์ ์๊ฐ
์ ํฌ๋ ์ธ์ด๋ ํ๊ตญ์ด, ๊ทธ๋ฆฌ๊ณ ์์น๋ ํ๊ตญ๊ธฐ๋ฐ์ผ๋ก ํธ์ํฐ๋ฐ์ดํฐ๋ฅผ ์์งํ์์ต๋๋ค.
์ฌ์ฉํ API๋ ํธ์ํฐ API ์ ๋๋ค.
์์งํ ๋ฐ์ดํฐ์ ์ ์๋ณ ๊ฐฏ์ ํํฉ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์์ง ๋ ๋ฐ์ดํฐ์ ์๋ณ ํํฉ ํ์ ๋๋ค.
12์ | 1์ | 2์ | 3์ | ํฉ๊ณ | |
๋ฐ์ดํฐ๊ฐฏ์ | 166,268 | 175,226 | 167,009 | 306,402 | 814,905 |
๋ค์์ ์์ง ๋ ํธ์ํฐ ๋ฐ์ดํฐ์ ๊ฐฏ์ ๊ทธ๋ํ ์ ๋๋ค.
3์ 28์ผ์ ํธ์์๊ฐ ๊ธ์ฆํ๋ค์.. !
์ด์ ๊ฐ ๋ญ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ข ๋ ์ดํด๋ณผ ํ์๊ฐ ์์ด๋ณด์ ๋๋ค.
3. Model Parameter
•Train data : Naver sentiment movie corpus (positive, negative) 150K
•Test data : Naver sentiment movie corpus (positive, negative) 50K
•Model : KoBERT-nsmc
Learning_rate : 5e-5
Train_epochs : 5
Optimizer : Adam (epsilon : 1e-8)
Train_batch_size : 32
Eval_batch_size : 64
•Model Accuracy : 0.89 (Naver sentiment movie corpus ๊ธฐ์ค)
•Data – Tweet
Term : 2019.12.01 ~ 2020.03.31.
Location : Korea
Language : Korean
4. KoBERT๋ฅผ ํตํ ํธ์ ๊ฐ์ ๋ถ๋ฅ ๊ฒฐ๊ณผ
import pandas as pd
from pandas import DataFrame as df
import csv
df= pd.read_csv('./201912_tweet_sent.csv',encoding='euc-kr')
df
kobert๋ก ๊ธ ๋ถ์ ์ผ๋ก ๋ผ๋ฒจ๋ง๋ ๋ฐ์ดํฐ์ ์์
๋ ์ง๋ณ๋ก ๊ฐ ๋ผ๋ฒจ์ ๊ฐฏ์๋ฅผ countํด ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
import datetime
#timestamp ์์ ๋ ์ง๋ฅผ ์ถ์ถํ๋ ํจ์
def to_yyyymmdd(timestamp):
a = datetime.datetime.strptime(timestamp,'%Y-%m-%d %H:%M:%S')
return str(a.year)+(str(0) if len(str(a.month))==1 else '')+str(a.month)+(str(0) if len(str(a.day))==1 else '')+str(a.day)
#๋ ์ง๋ณ๋ก ๊ธ๋ถ์ ์นด์ดํธ
pos=0
neg=0
cur = 1
sent_list =[]
for i in range(0,len(df)):
if to_day(df['timestamp'][i]) == cur:
if df['label'][i] == 0:
neg+=1
else:
pos+=1
else:
sent_list.append([to_yyyymmdd(df['timestamp'][i-1]),pos,neg])
pos = 0
neg = 0
cur+=1
if df['label'][i] == 0:
neg+=1
else:
pos+=1
sent_list.append([to_yyyymmdd(df['timestamp'][i]),pos,neg])
sent_count_result = pd.core.frame.DataFrame(sent_list) #๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ฐ์ดํฐํ์
๋ณ๊ฒฝ
sent_count_result.columns=['date','pos','neg'] #column ์ด๋ฆ ๋ณ๊ฒฝ
sent_count_result #๊ฒฐ๊ณผ ์ถ๋ ฅ
#csvํ์ผ๋ก ์ ์ฅ
sent_count_result.to_csv("./kobert_sent_count_result_feb.csv",header=True, index=False)
๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ํ๋ก ์ ๋ฆฌํฉ๋๋ค.
๋ค์์ ์๋ณ๋ก ๊ธ์ , ๋ถ์ ํธ์ ๊ฐฏ์๋ฅผ countํ ํ์ ๋๋ค
12์ | 1์ | 2์ | 3์ | ํฉ๊ณ | |
๊ธ์ | 78,457 | 79,872 | 74,485 | 137,731 | 370,545 |
๋ถ์ | 87,811 | 95,354 | 92,524 | 168,671 | 444,360 |
ํฉ๊ณ | 166,268 | 175,226 | 167,009 | 306,402 | 814,905 |
๋์ฒด์ ์ผ๋ก ๊ธ์ ๋ณด๋ค๋ ๋ถ์ ์ ํธ์ ์๊ฐ ๋ง๋ค๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์ข ๋ ์ง๊ด์ ์ผ๋ก ๋ณด๊ธฐ ์ํด ์๋ณ ํธ์ ๊ฐ์ ์ถ์ด ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด์์ต๋๋ค.
์ฝ๋ก๋๋ฐ์ด๋ฌ์ค์ ๋ํ ์ฌ๋๋ค์ ๋ฐ์์ ํธ์ํฐ๋ฐ์ดํฐ๋ก ํ์ธํด๋ณด๊ธฐ ์ํด
์์งํ ํธ์ํฐ๋ฐ์ดํฐ๋ก KoBERT๋ชจ๋ธ์ ํตํ ๊ฐ์ ๋ถ๋ฅ๋ฅผ ์งํํ์์ต๋๋ค.
๋ค์ ๊ณผ์ ์ LDA๋ก ํ ํฝ ๋ชจ๋ธ๋ง์ ํ ํ, '์ฝ๋ก๋' ํ ํฝ์ผ๋ก ๋ถ๋ฅ๋ ํธ์ํฐ๋ฐ์ดํฐ๋ง์ ๊ฐ์ง๊ณ
๊ฐ์ ์ถ์ด ๊ทธ๋ํ๋ฅผ ๋ค์ ํ ๋ฒ ๊ทธ๋ ค๋ณผ ์์ ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค:)
'Projects > COVID-19 analysis' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐ์ดํฐ์ ] Sentiment-analysis dataset (0) | 2020.04.23 |
---|---|
xml ๋ฐ์ดํฐ๋ฅผ csv ํ์ผ๋ก ์์ง 2 - ๊ณต๊ณต์ฌ๋๋ฌธ์๋ฐ์ดํฐ (2) | 2020.03.11 |
xml ๋ฐ์ดํฐ๋ฅผ csv ํ์ผ๋ก ์์ง - ๊ณต๊ณต์ฌ๋๋ฌธ์๋ฐ์ดํฐ (0) | 2020.03.11 |