欢迎访问宙启技术站
智能推送

使用Allennlp的SquadEmAndF1()评估中文SQuAD数据集的问答性能

发布时间:2023-12-19 06:43:46

在使用Allennlp评估中文SQuAD数据集的问答性能之前,首先需要准备好数据集和模型。

数据集准备:

1. 下载中文SQuAD数据集,可以从https://github.com/rajpurkar/SQuAD-explorer/tree/master/dataset 直接下载文件。

2. 将下载的文件解压缩,并将文件名改为train-vi.jsondev-vi.json,分别表示训练集和验证集。

模型准备:

1. 新建一个Python脚本,导入需要的库以及SQuAD评估器和SQuAD阅读器:

import json
from typing import Dict, Any

from allennlp.models.archival import load_archive
from allennlp.predictors import Predictor
from allennlp.data import Tokenizer
from allennlp.data.tokenizers import WordTokenizer
from allennlp.data.tokenizers.word_splitter import JustSpacesWordSplitter
from allennlp.data.tokenizers.word_filter import StopwordFilter

from allennlp_models.rc.squad import SquadEmAndF1, SquadReader

tokenizer = Tokenizer.from_params(Tokenizer.from_params(WordTokenizer(), 
                    word_splitter=JustSpacesWordSplitter(), 
                    word_filter=StopwordFilter()))
reader = SquadReader(tokenizer=tokenizer)

2. 加载已经训练好的模型和权重文件,准备进行评估:

archive_file = "path_to_trained_model_archive.tar.gz"
archive = load_archive(archive_file)
model = archive.model
model.eval()
predictor = Predictor.from_archive(archive, "squad")

3. 使用SQuAD评估器对验证集进行评估,并输出Exact Match(EM)和F1指标:

def evaluate() -> Dict[str, Any]:
    dev_file = "dev-vi.json"
    instances = reader.read(dev_file)
    metrics = SquadEmAndF1()
      
    for instance in instances:
        prediction = predictor.predict_instance(instance)
        passage_tokens = instance.fields["passage"].tokens
        question_tokens = instance.fields["question"].tokens
        em = prediction["best_span_str"] == instance.fields["answer"]["span_text"]
        f1 = metrics.get_f1_score(prediction["best_span_str"], instance.fields["answer"]["span_text"])
        metrics(em, f1)

    metrics_dict = metrics.get_metric()
    
    return metrics_dict

results = evaluate()
print(f"Exact Match: {results['em']:.2f}, F1: {results['f1']:.2f}")

将以上代码添加到Python脚本中,并执行该脚本,即可对中文SQuAD数据集进行问答性能的评估。

需要注意的是,以上代码中的archive_file需要替换为已经训练好的模型和权重文件的路径,dev_file需要替换为验证集文件的路径。