깃허브
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])
반응형