elevne's Study Note

BERT 감성분석 (1) 본문

Machine Learning/NLP

BERT 감성분석 (1)

elevne 2022. 11. 6. 18:03

이번 시간에는 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("오늘 나는 저녁에 친구들과 맥주 한 잔 할 것이다.")

 

 

 

tokenizer.encode()

 

 

 

 

불러온 데이터셋은 이전과 동일하게 아래와 같다.

 

 

 

train_data = pd.read_csv()

 

 

 

 

이제 데이터셋도 준비되었으니 위에서 만든 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 값을 분리한다.

 

 

 

출처:

https://huggingface.co/docs/transformers/main_classes/tokenizer?highlight=encode_plus#transformers.PreTrainedTokenizer.encode_plus 

https://github.com/NLP-kr/tensorflow-ml-nlp-tf2/blob/master/7.PRETRAIN_METHOD/7.2.1.bert_finetune_NSMC.ipynb

'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