문장 토큰 분류

홍찬우·2023년 7월 29일
0

문장 토큰 분류 task

주어진 문장의 각 token이 어떤 범주에 속하는지 분류

  • NER (개체명 인식)

    • 특정한 의미를 가지고 있는 단어, 어구 등을 인식
  • 품사 태깅


문장 토큰 분류를 위한 데이터

kor_ner

  • 스포츠 동아는 기관으로, ORG (Orginization)

    • B-ORG는 ORG의 Begin, I-ORG는 ORG의 Inner

문장 토큰 분류 모델 학습

  • 개체명 인식은 형태소 단위 토큰을 음절 단위 토큰으로 분해하는 것이 좋음

    • 잘못된 토크나이징이 개체명 인식에도 오류를 발생시킬 수 있음



실습 - 문장 토큰 단위 학습

데이터 전처리

  • 음절 단위로 쪼개고, 각 음절마다 기존 개체명을 매핑


unique_tags = set(tag for doc in tags for tag in doc)
tag2id = {tag: id for id, tag in enumerate(unique_tags)}
id2tag = {id: tag for tag, id in tag2id.items()}
  • 개체명을 숫자로 변환하기 위해 딕셔너리 사용


EDA

  • 각 개체명 별 데이터 개수

토크나이징

pad_token_id = tokenizer.pad_token_id # 0
cls_token_id = tokenizer.cls_token_id # 101
sep_token_id = tokenizer.sep_token_id # 102
# special token도 tag화 하는 작업
pad_token_label_id = tag2id['O']    # tag2id['O']
cls_token_label_id = tag2id['O']
sep_token_label_id = tag2id['O']
  • [CLS], [SEP], [PAD] 토큰도 O 태그로 개체명 매핑

  • 기존 토크나이저와 다르게 음절 단위로 토크나이징

  • 단어의 첫 음절을 제외하고 모두 prefix ##을 부착

  • input_ids[i] = tokenizer.convert_tokens_to_ids(syllable)

    • 기존 BERT tokenizer에서 음절과 매핑되는 id를 input_ids에 저장

    • BERT tokenizer의 한국어 vocab에는 대부분 음절 단위 단어들이 저장되어 있어 괜찮음



Label

  • label과 입력 token 개수가 같으므로 개수를 맞춰줘야 함

Model

model = BertForTokenClassification.from_pretrained(MODEL_NAME, num_labels=len(unique_tags))

  • BertForTokenClassification 사용
  • num_labels에 우리가 구분할 개체명 개수를 명시해야 함

Inference

입력 문장에 대해서도 반드시 음절 단위 토크나이징 후 모델에 피딩

각 음절에 개체명이 매핑됨



실습 - 기계독해

※ 기계독해 : 질문에 대한 답변이 포함된 문서가 주어졌을 때, 문서 토큰 내에서 정답 토큰의 위치를 파악하는 task



KorQuAD 데이터셋

  • context, question, answer로 구성

  • answer은 answer start 정보를 제공하며, answer start에 answer의 length만큼 더하면 end index가 됨


token index

  • 구축한 데이터는 음절의 인덱스를 가져옴

  • BERT 모델은 wordpiece 단위로 되어 있어 음절 단위의 숫자를 token index로 변환해줘야 함

    • 해당 token index가 정답의 시작이다라는 label을 학습
    • char_to_token 함수 사용

Model

BertForQuestionAnswering 사용


Inference

  • pipeline의 question-answering으로 추론









※ 모든 이미지 및 코드 출처는 네이버 커넥트재단 부스트캠프 AI Tech 5기입니다. ※

profile
AI-Kid

0개의 댓글