small fix
This commit is contained in:
parent
134b585d49
commit
f491aaac21
24
main.py
24
main.py
@ -3,27 +3,23 @@ from datasets import load_dataset, load_metric
|
|||||||
from transformers import AutoTokenizer, AutoModelForTokenClassification, TrainingArguments, Trainer, DataCollatorForTokenClassification
|
from transformers import AutoTokenizer, AutoModelForTokenClassification, TrainingArguments, Trainer, DataCollatorForTokenClassification
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# Load the CoNLL-2003 dataset with trust_remote_code
|
|
||||||
dataset = load_dataset("conll2003", trust_remote_code=True)
|
dataset = load_dataset("conll2003", trust_remote_code=True)
|
||||||
|
|
||||||
# Load the tokenizer
|
|
||||||
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
|
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
|
||||||
|
|
||||||
# Define label list and map labels to IDs
|
|
||||||
label_list = dataset['train'].features['ner_tags'].feature.names
|
label_list = dataset['train'].features['ner_tags'].feature.names
|
||||||
|
|
||||||
# Tokenize and align labels function
|
|
||||||
def tokenize_and_align_labels(examples):
|
def tokenize_and_align_labels(examples):
|
||||||
tokenized_inputs = tokenizer(examples['tokens'], truncation=True, padding='max_length', is_split_into_words=True)
|
tokenized_inputs = tokenizer(examples['tokens'], truncation=True, padding='max_length', is_split_into_words=True)
|
||||||
labels = []
|
labels = []
|
||||||
for i, label in enumerate(examples['ner_tags']):
|
for i, label in enumerate(examples['ner_tags']):
|
||||||
word_ids = tokenized_inputs.word_ids(batch_index=i) # Map tokens to their respective word.
|
word_ids = tokenized_inputs.word_ids(batch_index=i)
|
||||||
previous_word_idx = None
|
previous_word_idx = None
|
||||||
label_ids = []
|
label_ids = []
|
||||||
for word_idx in word_ids: # Set the special tokens to -100.
|
for word_idx in word_ids:
|
||||||
if word_idx is None:
|
if word_idx is None:
|
||||||
label_ids.append(-100)
|
label_ids.append(-100)
|
||||||
elif word_idx != previous_word_idx: # Only label the first token of a given word.
|
elif word_idx != previous_word_idx:
|
||||||
label_ids.append(label[word_idx])
|
label_ids.append(label[word_idx])
|
||||||
else:
|
else:
|
||||||
label_ids.append(-100)
|
label_ids.append(-100)
|
||||||
@ -32,20 +28,15 @@ def tokenize_and_align_labels(examples):
|
|||||||
tokenized_inputs["labels"] = labels
|
tokenized_inputs["labels"] = labels
|
||||||
return tokenized_inputs
|
return tokenized_inputs
|
||||||
|
|
||||||
# Tokenize the datasets
|
|
||||||
tokenized_datasets = dataset.map(tokenize_and_align_labels, batched=True)
|
tokenized_datasets = dataset.map(tokenize_and_align_labels, batched=True)
|
||||||
|
|
||||||
# Split the dataset into training and evaluation sets
|
|
||||||
train_dataset = tokenized_datasets["train"]
|
train_dataset = tokenized_datasets["train"]
|
||||||
eval_dataset = tokenized_datasets["validation"]
|
eval_dataset = tokenized_datasets["validation"]
|
||||||
|
|
||||||
# Load the model
|
|
||||||
model = AutoModelForTokenClassification.from_pretrained("bert-base-cased", num_labels=len(label_list))
|
model = AutoModelForTokenClassification.from_pretrained("bert-base-cased", num_labels=len(label_list))
|
||||||
|
|
||||||
# Data collator for token classification
|
|
||||||
data_collator = DataCollatorForTokenClassification(tokenizer)
|
data_collator = DataCollatorForTokenClassification(tokenizer)
|
||||||
|
|
||||||
# Training arguments
|
|
||||||
training_args = TrainingArguments(
|
training_args = TrainingArguments(
|
||||||
output_dir='./results',
|
output_dir='./results',
|
||||||
evaluation_strategy="epoch",
|
evaluation_strategy="epoch",
|
||||||
@ -56,7 +47,6 @@ training_args = TrainingArguments(
|
|||||||
weight_decay=0.01,
|
weight_decay=0.01,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Define the trainer
|
|
||||||
trainer = Trainer(
|
trainer = Trainer(
|
||||||
model=model,
|
model=model,
|
||||||
args=training_args,
|
args=training_args,
|
||||||
@ -69,34 +59,26 @@ trainer = Trainer(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
# Train the model
|
|
||||||
trainer.train()
|
trainer.train()
|
||||||
|
|
||||||
# Evaluate the model
|
|
||||||
results = trainer.evaluate()
|
results = trainer.evaluate()
|
||||||
|
|
||||||
# Print the results
|
|
||||||
print("Evaluation results:", results)
|
print("Evaluation results:", results)
|
||||||
|
|
||||||
# Predict on the evaluation set
|
|
||||||
predictions, labels, _ = trainer.predict(eval_dataset)
|
predictions, labels, _ = trainer.predict(eval_dataset)
|
||||||
predictions = np.argmax(predictions, axis=2)
|
predictions = np.argmax(predictions, axis=2)
|
||||||
|
|
||||||
# Convert the predictions and labels to the original tags
|
|
||||||
true_labels = [[label_list[l] for l in label if l != -100] for label in labels]
|
true_labels = [[label_list[l] for l in label if l != -100] for label in labels]
|
||||||
true_predictions = [
|
true_predictions = [
|
||||||
[label_list[p] for (p, l) in zip(prediction, label) if l != -100]
|
[label_list[p] for (p, l) in zip(prediction, label) if l != -100]
|
||||||
for prediction, label in zip(predictions, labels)
|
for prediction, label in zip(predictions, labels)
|
||||||
]
|
]
|
||||||
|
|
||||||
# Create a DataFrame for the results
|
|
||||||
results_df = pd.DataFrame({
|
results_df = pd.DataFrame({
|
||||||
'tokens': eval_dataset['tokens'],
|
'tokens': eval_dataset['tokens'],
|
||||||
'true_labels': true_labels,
|
'true_labels': true_labels,
|
||||||
'predicted_labels': true_predictions
|
'predicted_labels': true_predictions
|
||||||
})
|
})
|
||||||
|
|
||||||
# Save the results to a CSV file
|
|
||||||
results_df.to_csv('mnt/data/ner_results.csv', index=False)
|
results_df.to_csv('mnt/data/ner_results.csv', index=False)
|
||||||
|
|
||||||
print("Wyniki analizy NER zostały zapisane do pliku 'mnt/data/ner_results.csv'.")
|
print("Wyniki analizy NER zostały zapisane do pliku 'mnt/data/ner_results.csv'.")
|
Loading…
Reference in New Issue
Block a user