본문 바로가기

Programming/(Python)(Ubuntu)

Sentence piece 를 이용한 문장 분류기 만들기

다음 내용과 같이 분류하려는 Text 및 Label 을 가지고 계신다면 따라해보십시오.

 

개요

  • DailyDialog 데이터 세트가 있습니다.
  • 데이터는 대화 텍스트입니다.
  • DailyDialog_act : 각 DailyDialog 의 각 행에 매치되는 대화 상자 동작 번호가 존재합니다.
    { 1 : 알림, 2 : 질문, 3: 지시, 4 : 공통 }
  • DailyDialog_emotion : 각 DailyDialog 의 각 행에 매치되는 대화 상자 감정 번호가 존재합니다.
    { 0 : 감정 없음, 1 : 분노, 2 : 혐오, 3 : 두려움, 4 : 행복, 5 : 슬픔, 6 : 놀라움 }
  • DailyDialog_text 를 Train과 Test로 나누고 전처리 합니다
  • 전처리 후 Tokenize 후 ...

 

1. Data set 불러오기

text = []
with open('/home/dialogues_text.txt', 'r', encoding='utf-8') as f: text = f.readlines()
    
print("문장 갯수 : ", len(text))

#---output---
#문장 갯수 : 13118

 

2. 전처리 하기 

 

각 데이터에 대한 Label 은 각 문단에 문장 단위로 되어 있으므로 문장을 추출하는 전처리 과정을 해줍니다.

 

Original Data :

Original Text Data

 

train_text = []
for i in range(0, len(train_ori)):
    train_pre = train_ori[i].replace("\n","")
    train_pre = train_pre.replace("__eou__ ","&")
    train_pre = train_pre.replace("__eou__","&")
    train_text.append(train_pre)

train_data = []
train_con = train_text
count_v = 0;
for i in range(0, len(train_con)):
    text_cut = train_con[i]
    for i in range(0, len(train_con[i])):
        if text_cut != "":
            if count_v == 0:
                x = train_con[i].index(" &")
                train_data.append(text_cut[0:x])
                text_cut = text_cut[x+2::]
                count_v = 1
            else:
                x = text_cut.index(" &")
                train_data.append(text_cut[0:x])
                text_cut = text_cut[x+2::]

 

Preprocessed Data :

Preprocessed Text Data

 

3. Make sentencepiece model

templates= '--input={} \
--pad_id={} \
--bos_id={} \
--eos_id={} \
--unk_id={} \
--model_prefix={} \
--vocab_size={} \
--character_coverage={} \
--model_type={}'


train_input_file = train_data
pad_id=0  #<pad> token을 0으로 설정
vocab_size = 20000 # vocab 사이즈
prefix = 'botchan_spm' # 저장될 tokenizer 모델에 붙는 이름
unk_id=1 #<unknown> token을 1으로 설정
bos_id=3 #<start> token을 3으로 설정
eos_id=2 #<end> token을 2으로 설정
character_coverage = 1.0 # to reduce character set 
model_type ='word' # Choose from unigram (default), bpe, char, or word


cmd = templates.format(train_input_file,
                pad_id,
                bos_id,
                eos_id,
                unk_id,
                prefix,
                vocab_size,
                character_coverage,
                model_type)
          

 

import sentencepiece as spm

spm.SentencePieceTrainer.Train(cmd)

import sentencepiece as spm
sp = spm.SentencePieceProcessor()
sp.Load('botchan_spm.model')

with open('/home/choice/Desktop/abep/day1/botchan_spm.vocab', encoding='utf-8') as f:
    Vo = [doc.strip().split("\t") for doc in f]

# w[0]: token name    
# w[1]: token score
word2idx = {w[0]: i for i, w in enumerate(Vo)}

 

 

 

 

 

 

 

반응형