PANH's picture
Upload 15 files
ffca110 verified
from evaluate import Evaluator, ALL_TASKS
from baselines import *
from alignscore.inference import Inferencer
import time
import json
import os
from argparse import ArgumentParser
SAVE_ALL_TABLES = True
SAVE_AND_PRINT_TIMER = False
class Timer():
def __init__(self) -> None:
self.t0 = time.time()
self.save_path = 'exp_results/time.json'
def finish(self, display_name):
t1 = time.time()
time_pass = t1 - self.t0
if SAVE_AND_PRINT_TIMER:
print(f"Evalautor {display_name} finished in {time_pass} secs.")
with open(self.save_path, 'a', encoding='utf8') as f:
json.dump({display_name: time_pass}, f)
f.write('\n')
def eval_ctc(model_type, tasks=ALL_TASKS):
ctc_scorer = CTCScorer(model_type)
evaluator = Evaluator(eval_tasks=tasks, align_func=ctc_scorer.score, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/CTC-{model_type}"
timer = Timer()
evaluator.evaluate()
timer.finish(f"CTC-{model_type}")
def eval_simcse(model_type, device, tasks=ALL_TASKS):
simcse_scorer = SimCSEScorer(model_type, device)
evaluator = Evaluator(eval_tasks=tasks, align_func=simcse_scorer.score, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/{model_type.split('/')[-1]}_f"
timer = Timer()
evaluator.evaluate()
timer.finish(f"{model_type.split('/')[-1]}_f")
def eval_bleurt(checkpoint, tasks=ALL_TASKS):
bleurt_scorer = BleurtScorer(checkpoint)
evaluator = Evaluator(eval_tasks=tasks, align_func=bleurt_scorer.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/BLEURT"
timer = Timer()
evaluator.evaluate()
timer.finish(f"BLEURT")
def eval_bertscore(model_type, device, batch_size, tasks=ALL_TASKS):
bertscore_scorer = BertScoreScorer(model_type=model_type, metric='f1', device=device, batch_size=batch_size)
evaluator = Evaluator(eval_tasks=tasks, align_func=bertscore_scorer.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/bertscore_{model_type.replace('/', '-')}_f"
timer = Timer()
evaluator.evaluate()
timer.finish(f"bertscore_{model_type.replace('/', '-')}_f")
def eval_bartscore(checkpoint, device, tasks=ALL_TASKS):
bartscore_scorer = BartScoreScorer(checkpoint, device)
evaluator = Evaluator(eval_tasks=tasks, align_func=bartscore_scorer.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/bartscore-{checkpoint.replace('/','-')}"
timer = Timer()
evaluator.evaluate()
timer.finish(f"bartscore-{checkpoint.replace('/','-')}")
### Below are Baselines for SummaC
def eval_mnli(model="roberta-large-mnli", device='cuda:0', tasks=ALL_TASKS):
mnli_scorer = MNLIScorer(model=model, device=device)
evaluator = Evaluator(eval_tasks=tasks, align_func=mnli_scorer.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/mnli-{model}"
timer = Timer()
evaluator.evaluate()
timer.finish(f"mnli-{model}")
def eval_ner(tasks=ALL_TASKS):
ner_scorer = NERScorer()
evaluator = Evaluator(eval_tasks=tasks, align_func=ner_scorer.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/NER"
timer = Timer()
evaluator.evaluate()
timer.finish(f"NER")
def eval_unieval(tasks=ALL_TASKS, device='cuda:0'):
unieval = UniEvalScorer(task='fact', device=device)
evaluator = Evaluator(eval_tasks=tasks, align_func=unieval.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/UniEval"
timer = Timer()
evaluator.evaluate()
timer.finish(f"UniEval")
def eval_feqa(tasks=ALL_TASKS):
feqa = FEQAScorer()
evaluator = Evaluator(eval_tasks=tasks, align_func=feqa.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/FEQA"
timer = Timer()
evaluator.evaluate()
timer.finish(f"FEQA")
def eval_questeval(tasks=ALL_TASKS):
questeval = QuestEvalScorer()
evaluator = Evaluator(eval_tasks=tasks, align_func=questeval.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/QuestEval"
timer = Timer()
evaluator.evaluate()
timer.finish(f"QuestEval")
def eval_qafacteval(tasks=ALL_TASKS, device='cuda:0'):
import os, sys
warning("using conda env qaeval!!!")
qafacteval = QAFactEvalScorer(device=device, model_folder=os.path.abspath('../BaselineForNLGEval/QAFactEval/models'))
evaluator = Evaluator(eval_tasks=tasks, align_func=qafacteval.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/QAFactEval"
evaluator.evaluate()
def eval_dae(tasks=ALL_TASKS, model_dir=None, device=0):
dae = DAEScorer(model_dir=model_dir, device=device)
evaluator = Evaluator(eval_tasks=tasks, align_func=dae.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/DAE"
timer = Timer()
evaluator.evaluate()
timer.finish(f"DAE")
def eval_bleu(tasks=ALL_TASKS, n_grams=1):
bleu = BLEUScorer(n_grams=n_grams)
evaluator = Evaluator(eval_tasks=tasks, align_func=bleu.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/BLEU-{n_grams}"
timer = Timer()
evaluator.evaluate()
timer.finish(f"BLEU-{n_grams}")
def eval_rouge(tasks=ALL_TASKS, rouge_type='1'):
rouge = ROUGEScorer(rouge_type=rouge_type)
evaluator = Evaluator(eval_tasks=tasks, align_func=rouge.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/ROUGE-{rouge_type}"
timer = Timer()
evaluator.evaluate()
timer.finish(f"ROUGE-{rouge_type}")
def eval_factcc(script_path, test_data_path,result_path, tasks=ALL_TASKS):
factcc = FactCCScorer(script_path=script_path, test_data_path=test_data_path, result_path=result_path)
evaluator = Evaluator(eval_tasks=tasks, align_func=factcc.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/FactCC"
timer = Timer()
evaluator.evaluate()
timer.finish(f"FactCC")
def eval_blanc(tasks=ALL_TASKS, device='cuda:0', batch_size=64):
blanc = BLANCScorer(device=device, batch_size=batch_size)
evaluator = Evaluator(eval_tasks=tasks, align_func=blanc.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/BLANC"
timer = Timer()
evaluator.evaluate()
timer.finish(f"BLANC")
def eval_summac(tasks=ALL_TASKS, summac_type='conv', device='cuda:0'):
summac = SummaCScorer(summac_type=summac_type, device=device)
evaluator = Evaluator(eval_tasks=tasks, align_func=summac.scorer, save_all_tables=SAVE_ALL_TABLES)
evaluator.result_save_name = f"baselines/SummaC-{summac_type}"
timer = Timer()
evaluator.evaluate()
timer.finish(f"SummaC-{summac_type}")
def eval_align_nlg(ckpt_path, comment='', base_model='roberta-large', batch_size=32, device='cuda:0', tasks=ALL_TASKS, nlg_eval_mode='nli_sp'):
align = Inferencer(ckpt_path=ckpt_path, model=base_model, batch_size=batch_size, device=device)
if 'smart' in nlg_eval_mode:
align.smart_type = nlg_eval_mode
else:
align.nlg_eval_mode = nlg_eval_mode
evaluator = Evaluator(eval_tasks=tasks, align_func=align.nlg_eval, save_all_tables=SAVE_ALL_TABLES)
name = f'AlignScore-{nlg_eval_mode}-{base_model}'
if comment:
name += '_' + comment
evaluator.result_save_name = f"align_eval/{name}"
timer = Timer()
evaluator.evaluate()
timer.finish(name)
def eval_gptscore(api_key, gpt_model='davinci003', tasks=ALL_TASKS):
gptscore = GPTScoreScorer(api_key=api_key, gpt_model=gpt_model)
evaluator = Evaluator(eval_tasks=tasks, align_func=gptscore.scorer, is_save_all_tables=IS_SAVE_ALL_TABLES)
evaluator.result_save_name = f"nlg_eval_fact/baselines/GPTScore-{gpt_model}"
evaluator.evaluate()
def eval_chatgptluo2023(api_key, chat_model='gpt-3.5-turbo', tasks=['qags_cnndm']):
chatgpt = ChatGPTLuo2023Scorer(task=tasks, api_key=api_key, chat_model=chat_model)
evaluator = Evaluator(eval_tasks=tasks, align_func=chatgpt.scorer, is_save_all_tables=IS_SAVE_ALL_TABLES)
evaluator.result_save_name = f"nlg_eval_fact/baselines/ChatGPTLuo2023-{chat_model}"
evaluator.evaluate()
def eval_chatgptgao2023(api_key, chat_model='gpt-3.5-turbo', tasks=['qags_cnndm']):
chatgpt = ChatGPTGao2023Scorer(task=tasks, api_key=api_key, chat_model=chat_model)
evaluator = Evaluator(eval_tasks=tasks, align_func=chatgpt.scorer, is_save_all_tables=IS_SAVE_ALL_TABLES)
evaluator.result_save_name = f"nlg_eval_fact/baselines/ChatGPTGao2023-{chat_model}"
evaluator.evaluate()
def eval_chatgptyichen2023(api_key, chat_model='gpt-3.5-turbo', tasks=['qags_cnndm']):
chatgpt = ChatGPTYiChen2023Scorer(task=tasks, api_key=api_key, chat_model=chat_model)
evaluator = Evaluator(eval_tasks=tasks, align_func=chatgpt.scorer, is_save_all_tables=IS_SAVE_ALL_TABLES)
evaluator.result_save_name = f"nlg_eval_fact/baselines/ChatGPTYiChen2023-{chat_model}"
evaluator.evaluate()
def eval_chatgptshiqichen2023(api_key, chat_model='gpt-3.5-turbo', tasks=['qags_cnndm']):
chatgpt = ChatGPTShiqiChen2023Scorer(task=tasks, api_key=api_key, chat_model=chat_model)
evaluator = Evaluator(eval_tasks=tasks, align_func=chatgpt.scorer, is_save_all_tables=IS_SAVE_ALL_TABLES)
evaluator.result_save_name = f"nlg_eval_fact/baselines/ChatGPTShiqiChen2023-{chat_model}"
evaluator.evaluate()
def run_benchmarks(args, argugment_error):
os.makedirs('exp_results/baselines', exist_ok=True)
os.makedirs('exp_results/align_eval', exist_ok=True)
if args.alignscore:
if not all((args.alignscore_model, args.alignscore_ckpt, args.alignscore_eval_mode)):
argugment_error('--alignscore-model, --alignscore-model, and --alignscore-ckpt must be specified to run AlignScore')
eval_align_nlg(
nlg_eval_mode=args.alignscore_eval_mode,
ckpt_path=args.alignscore_ckpt,
base_model=args.alignscore_model,
device=args.device, tasks=args.tasks,
comment=args.alignscore_comment
)
if args.ctc:
if not args.ctc_type:
argugment_error('--ctc-type must be specified to run CTC baseline')
for type in args.ctc_type:
eval_ctc(type, tasks=args.tasks)
if args.simcse:
if not args.simcse_ckpt:
argugment_error('--simcse-ckpt must be specified to run SimCSE baseline')
for ckpt in args.simcse_ckpt:
eval_simcse(ckpt, device=args.device, tasks=args.tasks)
if args.bleurt:
if not args.bleurt_ckpt:
argugment_error('--bleurt-ckpt must be specified to run BLEURT baseline')
eval_bleurt(args.bleurt_ckpt, tasks=args.tasks)
if args.bertscore:
if not args.bertscore_ckpt or not args.bertscore_batch_size:
argugment_error('--bertscore-ckpt and --bertscore-batch-size must be specified to run BERTScore baseline')
for ckpt in args.bertscore_ckpt:
eval_bertscore(ckpt, device=args.device, tasks=args.tasks, batch_size=args.bertscore_batch_size)
if args.bartscore:
if not args.bartscore_ckpt:
argugment_error('--bartscore-ckpt must be specified to run BARTScore baseline')
for ckpt in args.bartscore_ckpt:
eval_bartscore(ckpt, device=args.device, tasks=args.tasks)
if args.mnli:
if not args.mnli_ckpt:
argugment_error('--mnli-ckpt must be specified to run MNLI baseline')
for ckpt in args.mnli_ckpt:
eval_mnli(model=ckpt, device=args.device, tasks=args.tasks)
if args.ner:
eval_ner(tasks=args.tasks)
if args.unieval:
eval_unieval(tasks=args.tasks, device=args.device)
if args.feqa:
eval_feqa(tasks=args.tasks)
if args.questeval:
eval_questeval(tasks=args.tasks)
if args.qafacteval:
eval_qafacteval(tasks=args.tasks)
if args.bleu:
if not args.bleu_ngram:
argugment_error('--bleu-ngram must be specified to run BLEU baseline')
for n in args.bleu_ngram:
eval_bleu(tasks=args.tasks, n_grams=n)
if args.rouge:
if not args.rouge_type:
argugment_error('--rouge-type must be specified to run ROUGE baseline')
for type in args.rouge_type:
eval_rouge(tasks=args.tasks, rouge_type=type)
if args.dae:
if not args.dae_ckpt:
argugment_error('--dae-ckpt must be specified to run DAE baseline')
eval_dae(tasks=args.tasks, model_dir=os.path.abspath(args.dae_ckpt))
if args.factcc:
if not all((args.factcc_script, args.factcc_test_data, args.factcc_result_path)):
argugment_error('--factcc-script, --factcc-test-data, and --factcc-result-path must be specified to run FactCC baseline')
eval_factcc(
tasks=args.tasks,
script_path=os.path.abspath(args.factcc_script),
test_data_path=os.path.abspath(args.factcc_test_data),
result_path=os.path.abspath(args.factcc_result_path)
)
if args.blanc:
if not args.blanc_batch_size:
argugment_error('--blanc-batch-size must be specified to run BLANC baseline')
eval_blanc(tasks=args.tasks, device=args.device, batch_size=args.blanc_batch_size)
if args.summac:
if not args.summac_type:
argugment_error('--summac-type must be specified to run SummaC baseline')
for type in args.summac_type:
eval_summac(tasks=args.tasks, device=args.device, summac_type=type)
if __name__ == "__main__":
FACT_EVAL_TASKS = ['summac', 'true','xsumfaith', 'summeval', 'qags_xsum', 'qags_cnndm', 'newsroom', 'rank19', 'frank', 'samsum']
parser = ArgumentParser()
parser.add_argument('--tasks', nargs='+', type=str, default=FACT_EVAL_TASKS, choices=FACT_EVAL_TASKS)
parser.add_argument('--device', type=str, default='cuda:0')
parser.add_argument('--timer', action='store_true', help='Time all metric runs')
alignscore_parser = parser.add_argument_group('AlignScore')
alignscore_parser.add_argument('--alignscore', action='store_true', help='Run AlignScore benchmark')
alignscore_parser.add_argument('--alignscore-model', type=str, choices=['roberta-base', 'roberta-large'])
alignscore_parser.add_argument('--alignscore-ckpt', type=str)
alignscore_parser.add_argument(
'--alignscore-eval-mode',
type=str,
choices=['bin', 'bin_sp', 'nli', 'nli_sp', 'reg', 'reg_sp', 'smart-n', 'smart-l'],
default='nli_sp'
)
alignscore_parser.add_argument('--alignscore-comment', type=str, default='')
ctc_parser = parser.add_argument_group('Baseline - CTC')
ctc_parser.add_argument('--ctc', action='store_true', help='Run CTC baseline')
ctc_parser.add_argument(
'--ctc-type',
nargs='*',
type=str,
choices=['D-cnndm', 'E-roberta', 'R-cnndm'],
default=['D-cnndm']
)
simcse_parser = parser.add_argument_group('Baseline - SimCSE')
simcse_models = [
'princeton-nlp/unsup-simcse-bert-base-uncased',
'princeton-nlp/unsup-simcse-bert-large-uncased',
'princeton-nlp/unsup-simcse-roberta-base',
'princeton-nlp/unsup-simcse-roberta-large',
'princeton-nlp/sup-simcse-bert-base-uncased',
'princeton-nlp/sup-simcse-bert-large-uncased',
'princeton-nlp/sup-simcse-roberta-base',
'princeton-nlp/sup-simcse-roberta-large'
]
simcse_parser.add_argument('--simcse', action='store_true', help='Run SimCSE baseline')
simcse_parser.add_argument(
'--simcse-ckpt',
nargs='*',
type=str,
choices=simcse_models,
default=['princeton-nlp/sup-simcse-roberta-large']
)
bleurt_parser = parser.add_argument_group('Baseline - BLEURT')
bleurt_parser.add_argument('--bleurt', action='store_true', help='Run BLEURT baseline')
bleurt_parser.add_argument('--bleurt-ckpt', type=str)
bertscore_parser = parser.add_argument_group('Baseline - BERTScore')
bertscore_parser.add_argument('--bertscore', action='store_true', help='Run BERTScore baseline')
bertscore_parser.add_argument(
'--bertscore-ckpt',
nargs='*',
type=str,
default=['microsoft/deberta-xlarge-mnli']
)
bertscore_parser.add_argument('--bertscore-batch-size', type=int, default=16)
bartscore_parser = parser.add_argument_group(
'Baseline - BARTScore',
description='Please clone https://github.com/neulab/BARTScore to baselines/BARTScore.'
)
bartscore_parser.add_argument('--bartscore', action='store_true', help='Run BARTScore baseline')
bartscore_parser.add_argument(
'--bartscore-ckpt',
type=str,
nargs='*',
default=['facebook/bart-large-cnn']
)
mnli_parser = parser.add_argument_group('Baseline - MNLI')
mnli_parser.add_argument('--mnli', action='store_true', help='Run MNLI baseline')
mnli_parser.add_argument(
'--mnli-ckpt',
nargs='*',
type=str,
default=['roberta-large-mnli']
)
ner_parser = parser.add_argument_group(
'Baseline - NER overlap',
description='Please clone https://github.com/tingofurro/summac to baselines/summac.'
)
ner_parser.add_argument('--ner', action='store_true', help='Run NER overlap baseline')
unieval_parser = parser.add_argument_group(
'Baseline - UniEval',
description='Please clone https://github.com/maszhongming/UniEval to baselines/UniEval.'
)
unieval_parser.add_argument('--unieval', action='store_true', help='Run UniEval baseline')
feqa_parser = parser.add_argument_group(
'Baseline - FEQA',
description='Please clone https://github.com/esdurmus/feqa to baselines/feqa'
)
feqa_parser.add_argument('--feqa', action='store_true', help='Run FEQA baseline')
questeval_parser = parser.add_argument_group(
'Baseline - QuestEval',
description='Please clone https://github.com/ThomasScialom/QuestEval to baselines/QuestEval.'
)
questeval_parser.add_argument('--questeval', action='store_true', help='Run QuestEval baseline')
qafacteval_parser = parser.add_argument_group(
'Baseline - QAFactEval',
description='Please clone https://github.com/salesforce/QAFactEval to baselines/QAFactEval.'
)
qafacteval_parser.add_argument('--qafacteval', action='store_true', help='Run QAFactEval baseline')
bleu_parser = parser.add_argument_group('Baseline - BLEU')
bleu_parser.add_argument('--bleu', action='store_true', help='Run BLEU baseline')
bleu_parser.add_argument(
'--bleu-ngram',
nargs='*',
type=int,
choices=[1, 2, 3, 4],
default=[1, 2, 3, 4]
)
rouge_parser = parser.add_argument_group('Baseline - ROUGE')
rouge_parser.add_argument('--rouge', action='store_true', help='Run ROUGE baseline')
rouge_parser.add_argument(
'--rouge-type',
nargs='*',
type=str,
choices=['1', '2', 'l'],
default=['1', '2', 'l']
)
dae_parser = parser.add_argument_group('Baseline - DAE')
dae_parser.add_argument('--dae', action='store_true', help='Run DAE baseline')
dae_parser.add_argument('--dae-ckpt', type=str)
factcc_parser = parser.add_argument_group('Baseline - FactCC')
factcc_parser.add_argument('--factcc', action='store_true', help='Run FactCC baseline')
factcc_parser.add_argument('--factcc-script', type=str)
factcc_parser.add_argument('--factcc-test-data', type=str)
factcc_parser.add_argument('--factcc-result-path', type=str)
blanc_parser = parser.add_argument_group('Baseline - BLANC')
blanc_parser.add_argument('--blanc', action='store_true', help='Run BLANC baseline')
blanc_parser.add_argument('--blanc-batch-size', type=int, default=64)
summac_parser = parser.add_argument_group(
'Baseline - SummaC',
description='Please clone https://github.com/tingofurro/summac to baselines/summac.'
)
summac_parser.add_argument('--summac', action='store_true', help='Run SummaC baseline')
summac_parser.add_argument('--summac-type', nargs='*', type=str, choices=['conv', 'zs'], default=['conv', 'zs'])
args = parser.parse_args()
if args.timer:
SAVE_AND_PRINT_TIMER = True
def argugment_error(msg):
parser.error(msg)
run_benchmarks(args, argugment_error)