spacy lib を使用して作成されたトレーニング済みのNERモデルを評価しようとしています。通常、この種の問題では、f1スコア(精度と再現率の比率)を使用できます。トレーニングされたNERモデルの精度関数をドキュメントで見つけることができませんでした。
それが正しいかどうかはわかりませんが、次の方法(例)とf1_score
sklearn
から:
from sklearn.metrics import f1_score
import spacy
from spacy.gold import GoldParse
nlp = spacy.load("en") #load NER model
test_text = "my name is John" # text to test accuracy
doc_to_test = nlp(test_text) # transform the text to spacy doc format
# we create a golden doc where we know the tagged entity for the text to be tested
doc_gold_text= nlp.make_doc(test_text)
entity_offsets_of_gold_text = [(11, 15,"PERSON")]
gold = GoldParse(doc_gold_text, entities=entity_offsets_of_gold_text)
# bring the data in a format acceptable for sklearn f1 function
y_true = ["PERSON" if "PERSON" in x else 'O' for x in gold.ner]
y_predicted = [x.ent_type_ if x.ent_type_ !='' else 'O' for x in doc_to_test]
f1_score(y_true, y_predicted, average='macro')`[1]
> 1.0
考えや洞察は役に立ちます。
次のリンクで同じ質問がある人のために:
fscore、recall、precisionなど、さまざまなメトリックを見つけることができます。 scorer
の使用例:
import spacy
from spacy.gold import GoldParse
from spacy.scorer import Scorer
def evaluate(ner_model, examples):
scorer = Scorer()
for input_, annot in examples:
doc_gold_text = ner_model.make_doc(input_)
gold = GoldParse(doc_gold_text, entities=annot)
pred_value = ner_model(input_)
scorer.score(pred_value, gold)
return scorer.scores
# example run
examples = [
('Who is Shaka Khan?',
[(7, 17, 'PERSON')]),
('I like London and Berlin.',
[(7, 13, 'LOC'), (18, 24, 'LOC')])
]
ner_model = spacy.load(ner_model_path) # for spaCy's pretrained use 'en_core_web_sm'
results = evaluate(ner_model, examples)
どこ input_
はテキスト(例:「私の名前はジョン」)であり、annot
は注釈です(例:[(11,16、 "PEOPLE")]
scorer.scores
は複数のスコアを返します。例は githubのspaCyの例 から取得されます(リンクは機能しなくなります)