File size: 2,074 Bytes
83874aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from seqeval.metrics import precision_score, recall_score, f1_score, classification_report
from seqeval.scheme import IOB2
import pickle

import torch
from transformers import pipeline

from utils import apply_model, dnrti_to_securebert, map_predicted_to_true, predictions_to_iob, dnrti_to_cyner


# Load the data back
with open('dataset.pkl', 'rb') as f:
    loaded_data = pickle.load(f)
    sentences_tokens = loaded_data['sentences_tokens']
    true_labels = loaded_data['true_labels']

def evaluate(model_name, mapping):
    device = 0 if torch.cuda.is_available() else -1

    ner_pipeline = pipeline("token-classification", model=model_name, device=device)

    predictions, latency_per_sentence = apply_model(sentences_tokens, ner_pipeline)

    predicted_iob_tags = predictions_to_iob(sentences_tokens, predictions)

    predicted_iob_tags_mapped = map_predicted_to_true(predicted_iob_tags, true_labels, mapping)

    # Ensure all are strings
    mapped_true_labels_str = [[str(t) for t in sent] for sent in true_labels]
    predicted_iob_tags_str = [[str(t) for t in sent] for sent in predicted_iob_tags_mapped]


    precision = precision_score(mapped_true_labels_str, predicted_iob_tags_str, suffix=False, scheme=IOB2)
    recall = recall_score(mapped_true_labels_str, predicted_iob_tags_str, suffix=False, scheme=IOB2)
    f1 = f1_score(mapped_true_labels_str, predicted_iob_tags_str, suffix=False, scheme=IOB2)

    print("\n=== Entity-Level Evaluation (IOB2) ===")
    print(f"Precision: {precision:.4f}")
    print(f"Recall:    {recall:.4f}")
    print(f"F1-Score:  {f1:.4f}")
    print(f"Latency per sentence: {latency_per_sentence:.3f} seconds")

    print("\n=== Classification Report ===")
    print(classification_report(mapped_true_labels_str, predicted_iob_tags_str, suffix=False, scheme=IOB2))


if __name__ == "__main__":
    model_name='CyberPeace-Institute/SecureBERT-NER'
    if model_name == 'CyberPeace-Institute/SecureBERT-NER':
        mapping = dnrti_to_securebert
    else:
        mapping = dnrti_to_cyner

    evaluate(model_name, mapping)