elevne's Study Note
BERT 감성분석 (1) 본문
이번 시간에는 BERT를 코드로 실습해보았다. Transformer 계열에서 공신력 있는 Open Source 중 사용성이 편리한 Huggingface의 Transformer 라이브러리를 사용하였다. Transformer 라이브러리는 사전학습된 상태에서 시작해야 할 때 유용하며 새로운 모델 연구의 베이스라인 성능 측정을 할 때 많이 활용된다고 한다.
pip install transformers
pip install 명령어로 transformers 라이브러리를 설치해준다.
BERT를 활용하기 위해서는 기본적으로 두 개의 모듈을 불러와야 한다고 한다. 전처리를 위한 Tokenizer과 사전 학습 Model이다. 전치리를 위한 Tokenizer을 불러와서 사전학습 모델을 만들 때와 같은 규칙으로 Tokenizing을 할 수 있게끔 한다. 아래 명령어로 Tokenizer을 불러온다.
from transformers import *
tokenizer = BertTokenizer.from_pretrained("bert-base-multilingual-cased")
위 Tokenizer을 활용하여 BERT 기반 모델에 넣을 데이터 전처리를 진행할 함수를 아래와 같이 작성해줄 수 있다.
def bert_tokenizer(sent, MAX_LEN):
encoded_dict = tokenizer.encode_plus(
text = sent,
add_special_tokens = True,
max_length = MAX_LEN,
pad_to_max_length = True,
return_attention_mask = True
)
input_id = encoded_dict['input_ids']
attention_mask = encoded_dict['attention_mask']
token_type_id = encoded_dict['token_type_ids']
return input_id, attention_mask, token_type_id
위 함수에서 사용한 encode_plus 함수는 특정 문장을 BERT에 필요한 입력 형태로 변환하는 것뿐만 아니라 문장을 MAX_LEN 값에 맞게 패딩을 해줄 수 있고, Attention Mask를 생성할 수도 있으며 결과값은 Dictionary 형태로 반환한다.
위 함수를 사용하여 이전에 감성분석 실습을 진행할 때 사용하였던 네이버 영화리뷰 데이터셋에 대한 전처리를 진행해보았다. tokenizer.encode() 함수로 Tokenizing이 잘 작동하는 것을 확인할 수 있다.
tokenizer.encode("오늘 나는 저녁에 친구들과 맥주 한 잔 할 것이다.")
불러온 데이터셋은 이전과 동일하게 아래와 같다.
이제 데이터셋도 준비되었으니 위에서 만든 bert_tokenizer 함수를 사용, for 문으로 모든 데이터에 대한 전처리를 진행해준다.
input_ids = []
attention_masks = []
token_type_ids = []
train_data_labels = []
for train_sent, train_label in tqdm(zip(train_data["document"], train_data["label"]), total=len(train_data)):
try:
input_id, attention_mask, token_type_id = bert_tokenizer(train_sent, 30)
input_ids.append(input_id)
attention_masks.append(attention_mask)
token_type_ids.append(token_type_id)
train_data_labels.append(train_label)
except Exception as e:
print(e)
print(train_sent)
pass
train_movie_input_ids = np.array(input_ids, dtype=int)
train_movie_attention_masks = np.array(attention_masks, dtype=int)
train_movie_type_ids = np.array(token_type_ids, dtype=int)
train_movie_inputs = (train_movie_input_ids, train_movie_attention_masks, train_movie_type_ids)
train_data_labels = np.asarray(train_data_labels, dtype=np.int32)
train_data에 데이터를 zip으로 묶어준 후 for 문을 돌면서 bert_tokenizer 함수를 각 row 별로 적용시켜준다. 그리고 bert_tokenizer 함수로 얻은 input_id, attention_mask, 그리고 token_type_id 를 list에 넣어준 후 dtype=int를 적용시켜 numpy.ndarray 형태로 만들어준다.
여기서 각각 input_id, attention_mask, tokey_type_id 가 뜻하는 바는 아래와 같다.
input_id: 문장을 Tokenize하여 Index 값으로 변환한 것.
attention_mask: 패딩된 부분에 대해 학습에 영향을 받지 않기 위해 처리해주는 입력 값. (1은 영향을 받는 Token, 0은 받지 않는 Token임)
token_type_id: 두 개의 Sequence를 입력으로 활용할 때, 0과 1로 문장의 Token 값을 분리한다.
출처:
'Machine Learning > NLP' 카테고리의 다른 글
Text Summarization 시작해보기 (0) | 2022.11.11 |
---|---|
BERT 감성분석 (2) (0) | 2022.11.08 |
BERT 모델에 대해서~ (0) | 2022.11.01 |
NLP 공부 (5-3: Transformer) (0) | 2022.10.28 |
NLP 공부 (5-2: Transformer) (0) | 2022.10.25 |