깃허브

bert를 통한 NER 학습 전처리

백준파이썬개발자:프로젝트골드 2024. 4. 23. 16:52
반응형

#)1pip install 하기

!pip install -U transformers
!pip install -U accelerate
!pip install -U datasets

 

#)2 데이터 받기

import pandas as pd
from datasets import load_dataset
data = load_dataset('conllpp')
data

 

#)3 데이터 출력

data['train'].features

 

#)4 데이터 출력 2

pd.DataFrame(data['train'][:])[['tokens', 'ner_tags']].iloc[0]

 

#)5 index2tag 만들기

tags = data['train'].features['ner_tags'].feature

index2tag = {idx:tag for idx, tag in enumerate(tags.names)}
tag2index = {tag:idx for idx, tag in enumerate(tags.names)}

 

#)6  함수정의:ner 태그를 만들기

def create_tag_names(batch):
  tag_name = {'ner_tags_str': [tags.int2str(idx) for idx in batch['ner_tags']]}
  return tag_name

 

#)7 함수실행

 

data = data.map(create_tag_names)
data

 

#)8 데이터 출력

pd.DataFrame(data['train'][:])[['tokens', 'ner_tags', 'ner_tags_str']]

 

#)9 bert 모델 가져오기

 

from transformers import AutoTokenizer

model_checkpoint = "distilbert-base-cased"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)

 

#)10 학습데이터 가져오기

 

inputs = data['train'][0]['tokens']
inputs = tokenizer(inputs, is_split_into_words=True)
print(inputs.tokens())

 

#)11 데이터 전체 출력

print(data['train'][0]['tokens'])
print(data['train'][0]['ner_tags_str'])

 

#)12 리스트를 append해주는 코드로 만약 sep을 만날경우 -100을 append를 해준다.

 

def align_labels_with_tokens(labels, word_ids):
  new_labels = []
  current_word=None
  for word_id in word_ids:
    if word_id != current_word:
      current_word = word_id
      label = -100 if word_id is None else labels[word_id]
      new_labels.append(label)

    elif word_id is None:
      new_labels.append(-100)

    else:
      label = labels[word_id]

      if label%2==1:
        label = label + 1
      new_labels.append(label)

  return new_labels

#)13 함수정의: 토큰화 하기

 

def tokenize_and_align_labels(examples):
  tokenized_inputs = tokenizer(examples['tokens'], truncation=True, is_split_into_words=True)

  all_labels = examples['ner_tags']

  new_labels = []
  for i, labels in enumerate(all_labels):
    word_ids = tokenized_inputs.word_ids(i)
    new_labels.append(align_labels_with_tokens(labels, word_ids))

  tokenized_inputs['labels'] = new_labels

  return tokenized_inputs

 

 

#)14  함수 실행:토큰화 실행

tokenized_datasets = data.map(tokenize_and_align_labels, batched=True, remove_columns=data['train'].column_names)

 

#)15 학습데이터 검증데터 테스트 데이터 확인을 위해서 df로 만듬

 

import pandas as pd

# train 데이터셋을 데이터프레임으로 변환
train_df = pd.DataFrame(tokenized_datasets['train'])

# validation 데이터셋을 데이터프레임으로 변환
validation_df = pd.DataFrame(tokenized_datasets['validation'])

# test 데이터셋을 데이터프레임으로 변환
test_df = pd.DataFrame(tokenized_datasets['test'])

 

 

#)16 학습데이터 출력

train_df

 

#)17토큰화 하기

from transformers import DataCollatorForTokenClassification

data_collator = DataCollatorForTokenClassification(tokenizer=tokenizer)
batch = data_collator([tokenized_datasets['train'][i] for i in range(2)])
batch

 

#)18 필요한 함수 다운받기

!pip install seqeval
!pip install evaluate

import evaluate
metric = evaluate.load('seqeval')

 

 

#)19 ner_tags컬럼출력하기

 

ner_feature = data['train'].features['ner_tags']
ner_feature

#)20 label_name으로 출력하기

label_names = ner_feature.feature.names
label_names

 

#)21 반복문을 통해서 labels로 출력하기

labels = data['train'][0]['ner_tags']
labels = [label_names[i] for i in labels]
labels

 

#)22

 

predictions = labels.copy()
predictions[2] = "O"

metric.compute(predictions=[predictions], references=[labels])
반응형