Paper · 2020-04-30 · cs.CL
Fact or Fiction: Verifying Scientific Claims
Introduces SciFact, 1,409 expert-written scientific claims checked against 5,183 abstracts with support or refute labels and rationales, and VeriSci, a baseline of TF-IDF retrieval, RoBERTa rationale selection and RoBERTa label prediction. Author-reported open-setting test F1: 39.5 (sentence, selection with label) and 46.5 (abstract, label with rationale).
Automated fact-checkingRationale extraction (models that show the supporting input)Domain adaptationfact-checkingretrievalevaluationdataset
arXivPDFCodeMarkdown12 min read
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Scientific papers cite each other all the time, and a sentence such as "drug X reduces inflammation" usually points to one or more studies that back it up. Checking whether a claim like that holds up means finding the right studies and judging whether they support or contradict it. Doing this by hand does not keep up with the literature, and general fact-checking tools are built for news and Wikipedia, not for specialist science.
The authors built a benchmark for this task. They took real sentences from research papers that cite other work, rewrote each one as a short, checkable claim, and had experts mark which cited abstracts support it, which contradict it, and which say too little. For every supporting or contradicting abstract they also marked the exact sentences that justify the verdict.
They also built a baseline system with three steps: find candidate abstracts with a simple keyword-similarity search, pick the sentences that look like evidence, and then decide the label from those sentences. A model trained first on a large general fact-checking dataset and then on the scientific data did best. The system is a research prototype, and the authors say it should not be used for medical decisions.
TL;DR
- Task: given a scientific claim and a corpus of abstracts, return the abstracts that SUPPORT or REFUTE the claim, each with rationale sentences §2 §4.
- Dataset SciFact: 1,409 claims, 5,183 abstracts, 809 / 300 / 300 train / dev / test claims §3 tab. 2.
- Baseline VeriSci: TF-IDF top-3 retrieval, RoBERTa-large rationale selection, and RoBERTa-large label prediction §5 app. A.1.
- Author-reported open-setting test F1: 39.5 for sentence selection with label and 46.5 for abstract label with rationale tab. 4. The paper says its main comparisons are statistically robust under bootstrap resampling §6.2 app. B.
Problem
Staying current with the literature is hard, and the risk of acting on outdated or wrong findings is high during fast-moving events such as COVID-19 §1. Earlier fact-checking datasets (FEVER, UKP Snopes) use claims that are either synthetic or come from political sources. Scientific claims need domain knowledge, and their verification needs annotators with domain expertise §1 §2. A scientific claim here is one atomic, verifiable statement; compound claims must be split §2. The authors simplify verification to a per-pair problem: a claim against a single abstract, with no global truth label §2.
Method
Task. The input is a claim c and a corpus A of abstracts. The system
predicts a set of evidence abstracts for c. For each predicted abstract it
predicts a label in {SUPPORTS, REFUTES, NOT_ENOUGH_INFO} and one set of rationale
sentences. The gold data may hold several rationales per abstract, but the model
predicts only one set §4.
Dataset construction (SciFact).
- Seed articles are sampled from a curated set of journals; each has at least 10 citations §3.1.
- Source citances (sentences that cite a seed article) are sampled from the S2ORC citation graph. Co-cited abstracts from the same citance are added to the corpus §3.1 fig. 2.
- Five distractor abstracts per source are added: papers cited elsewhere in the same article, in a different paragraph §3.1.
- Annotators read a citance in context, without the cited abstract, and write up to three atomic claims. Citances without a specific finding are skipped §3.2.
- An NLP expert writes negations of some claims to create REFUTES cases, avoiding obvious negation words §3.2.
- For each claim, annotators label every cited abstract as SUPPORTS, REFUTES or NOT_ENOUGH_INFO. Each claim has one label. Evidence was found in 63% of cited abstracts. For SUPPORTS and REFUTES pairs, annotators mark one or more rationales of at most three sentences each. Rationales within a pair are mutually exclusive §3.3 tab. 2.
VeriSci pipeline (baseline). The algorithm is written in prose in §5 and app. A. The paper gives no numbered algorithm box and no numbered equations.
- Abstract retrieval. Compute TF-IDF similarity between the claim and each
abstract, using unigram and bigram features. Keep the top
k = 3abstracts §5 app. A.1. - Rationale selection. For each sentence
a_iof a retrieved abstract, encode the pair[a_i, sep, c]with RoBERTa-large. Take the[CLS]vector, apply a linear layer and a sigmoid, and call the resultz_i. Keep every sentence withz_iat or above a thresholdt§5 app. A.1. - Label prediction. Concatenate the selected rationale sentences, a separator
and the claim,
[rationale, sep, c]. Encode with RoBERTa-large, take the[CLS]vector, and apply a linear layer with three outputs and a softmax §5. If an abstract has no rationale sentences, its label is NOT_ENOUGH_INFO §5. - Training data for label prediction. For SUPPORTS and REFUTES pairs, use the
gold rationales as input. For NOT_ENOUGH_INFO pairs, use the
ksentences of the abstract most similar to the claim, withksampled from {0, 1} §5 app. A.3.
# VeriSci inference for one claim [§5] [app. A.1]
# Input: claim (string); corpus (list of abstracts, each a list of sentences)
# Output: per retrieved abstract, a label and its rationale sentence indices
def verify_claim(claim, corpus):
# 1. Keep the 3 abstracts most similar to the claim by TF-IDF [app. A.1]
retrieved = top_k_by_tfidf(claim, corpus, k=3)
labels = {}
for abstract in retrieved:
# 2. Score every sentence as rationale, paired with the claim [§5]
scores = [
rationale_score(sentence, claim) # sigmoid in [0, 1]
for sentence in abstract.sentences
]
# 3. Keep sentences at or above the threshold t [app. A.1]
rationale = [
index
for index, score in enumerate(scores)
if score >= threshold # threshold = 0.5 for the SciFact model
]
# 4. No rationale sentences means NOT_ENOUGH_INFO [§5]
if not rationale:
labels[abstract.id] = "NOT_ENOUGH_INFO"
continue
# 5. Predict the label from the rationale text plus the claim [§5]
text = " ".join(abstract.sentences[i] for i in rationale)
labels[abstract.id] = predict_label(text, claim)
return labelsTraining schedule (SciFact). Both components use RoBERTa-large. Each component is trained for 20 epochs with a cosine learning-rate decay over those 20 epochs. The effective batch size is 256 via gradient accumulation app. A.2 app. A.3. The code builds the rationale-selector training set from every sentence of each claim's cited abstracts, labelled 1 if it is in a gold rationale transformer_scifact.py, and optimises cross-entropy on the 2-way logits transformer_scifact.py.
# Train the rationale selector on claim and abstract pairs [§5] [app. A.2]
# Input: pairs (claim, abstract sentences, gold rationale indices)
def train_rationale_selector(pairs):
# 1. Each example is one (claim, sentence) pair [§5]
examples = []
for claim, abstract, gold in pairs:
for index, sentence in enumerate(abstract.sentences):
# 2. Positive if the sentence is in a gold rationale [§5]
examples.append((claim, sentence, index in gold))
# 3. Cross-entropy on the 2-way logits, 20 epochs, batch 256 [app. A.2]
for epoch in range(20):
for batch in shuffled(examples, batch_size=256):
loss = cross_entropy(model(batch.claims, batch.sentences),
batch.labels)
update(model, loss)
return modelHyperparameters
Values come from the paper; the code citations show the matching default or where the code differs. "not stated" means neither the paper nor the code sets it.
| Name | Value | Where | Notes |
|---|---|---|---|
| Retrieval method | TF-IDF, unigram + bigram | §5 app. A.1 | Code also drops English stop words and indexes title + abstract tfidf.py |
Retrieved abstracts k | 3 | app. A.1 pipeline.sh | Tuned on the SciFact dev set |
| Encoder | RoBERTa-large (both components) | §6.2 transformer_scifact.py | SciBERT, BioRoBERTa and RoBERTa-base were tested tab. 3 |
Rationale threshold t (SciFact-trained) | 0.5 | app. A.1 pipeline.sh | Fixed, not tuned |
Rationale threshold t (FEVER zero-shot) | 0.025 | app. A.1 pipeline.sh | Tuned on the SciFact dev set |
Rationale threshold t (Snopes-trained) | 0.75 | app. A.1 | Not in the repo's pipeline script; "not stated" otherwise |
| Max input length | 512 tokens; rationale truncated first, claim never | §5 (footnote) transformer.py | |
| Batch size | 256 effective (8 per step, 32 accumulated steps) | app. A.2 transformer_scifact.py | |
| Epochs (SciFact) | 20 | app. A.2 app. A.3 transformer_scifact.py | Model saved every epoch; checkpoint chosen on dev |
| Epochs (FEVER / Snopes) | 3 / 5 | app. A.2 | |
| LR, rationale on SciFact | 1e-5 encoder, 1e-3 linear head | app. A.2 transformer_scifact.py | |
| LR, label on SciFact | 1e-5 encoder, 1e-4 linear head | app. A.3 transformer_scifact.py | |
| LR, rationale on FEVER | 5e-6 encoder, 5e-5 linear head | app. A.2 | Code defaults are 1e-5 / 1e-3; see Paper vs code |
| LR, rationale on Snopes | 1e-5 encoder, 1e-4 linear head | app. A.2 | |
| LR, label on FEVER and Snopes | 1e-5 encoder, 1e-4 linear head | app. A.3 | |
| LR schedule | Cosine decay; warm-up not stated | app. A.2 transformer_scifact.py | Code uses 0 warm-up steps |
| Optimizer | not stated in paper | transformer_scifact.py | Code uses Adam, no weight decay |
| Random seed | not stated | Code takes no seed argument | |
| Hyperparameter search | LR in {1e-3, 1e-4, 5e-5, 1e-5, 5e-6}; batch in {64, 256} | app. A.5 | Manual, selected on dev F1 |
| Hardware | 1 Nvidia P100 (Colab Pro) | app. A.4 | Rationale on SciFact: about 150 min for 20 epochs; label on SciFact: about 130 min for 20 epochs |
Results
Author-reported. Setup: SciFact test set (300 claims) for the main results, dev set for the component comparison §6 tab. 3 tab. 4. Metrics are micro-F1 over precision and recall §4. Abstract-level evaluation counts at most three rationale sentences per abstract; sentence-level evaluation does not limit the number §4. Standard deviations from a 10,000-sample bootstrap are shown after the ± sign app. B.
Table 4: test set, main results tab. 4. Columns: P = precision, R = recall, F1 = micro-F1 (± bootstrap std).
| Setting | Model | Level | Metric | P | R | F1 |
|---|---|---|---|---|---|---|
| Oracle abstract | Oracle rationale | Sentence | Selection-Only | 100.0 | 80.5 | 89.2 ± 2.1 |
| Oracle abstract | Oracle rationale | Sentence | Selection+Label | 89.6 | 72.2 | 79.9 ± 3.0 |
| Oracle abstract | Oracle rationale | Abstract | Label-Only | 90.1 | 77.5 | 83.3 ± 2.4 |
| Oracle abstract | Oracle rationale | Abstract | Label+Rationale | 90.1 | 77.5 | 83.3 ± 2.4 |
| Oracle abstract | Zero-shot (FEVER) | Sentence | Selection-Only | 42.5 | 45.1 | 43.8 ± 2.0 |
| Oracle abstract | Zero-shot (FEVER) | Sentence | Selection+Label | 36.1 | 38.4 | 37.2 ± 2.3 |
| Oracle abstract | Zero-shot (FEVER) | Abstract | Label-Only | 86.9 | 53.6 | 66.3 ± 3.1 |
| Oracle abstract | Zero-shot (FEVER) | Abstract | Label+Rationale | 67.9 | 41.9 | 51.8 ± 3.4 |
| Oracle abstract | VeriSci | Sentence | Selection-Only | 76.1 | 63.8 | 69.4 ± 2.6 |
| Oracle abstract | VeriSci | Sentence | Selection+Label | 66.5 | 55.7 | 60.6 ± 3.1 |
| Oracle abstract | VeriSci | Abstract | Label-Only | 87.3 | 65.3 | 74.7 ± 2.8 |
| Oracle abstract | VeriSci | Abstract | Label+Rationale | 84.9 | 63.5 | 72.7 ± 2.9 |
| Open | Oracle rationale | Sentence | Selection-Only | 100.0 | 56.5 | 72.2 ± 3.3 |
| Open | Oracle rationale | Sentence | Selection+Label | 87.6 | 49.5 | 63.2 ± 3.7 |
| Open | Oracle rationale | Abstract | Label-Only | 88.9 | 54.1 | 67.2 ± 3.2 |
| Open | Oracle rationale | Abstract | Label+Rationale | 88.9 | 54.1 | 67.2 ± 3.2 |
| Open | Zero-shot (FEVER) | Sentence | Selection-Only | 28.7 | 37.6 | 32.5 ± 2.3 |
| Open | Zero-shot (FEVER) | Sentence | Selection+Label | 23.7 | 31.1 | 26.9 ± 2.3 |
| Open | Zero-shot (FEVER) | Abstract | Label-Only | 56.0 | 42.3 | 48.2 ± 3.3 |
| Open | Zero-shot (FEVER) | Abstract | Label+Rationale | 42.3 | 32.0 | 36.4 ± 3.3 |
| Open | VeriSci | Sentence | Selection-Only | 45.0 | 47.3 | 46.1 ± 3.0 |
| Open | VeriSci | Sentence | Selection+Label | 38.6 | 40.5 | 39.5 ± 3.0 |
| Open | VeriSci | Abstract | Label-Only | 47.5 | 47.3 | 47.4 ± 3.1 |
| Open | VeriSci | Abstract | Label+Rationale | 46.6 | 46.4 | 46.5 ± 3.1 |
The paper reports these relative gains on the open setting: +47% on Sentence Selection+Label and +28% on Abstract Label+Rationale over the FEVER-only model §6.2.
Table 3: dev set, component comparison tab. 3. Rationale selection (P, R, F1) and label accuracy.
| Factor | Variant | Rationale P | Rationale R | Rationale F1 | Label acc. |
|---|---|---|---|---|---|
| Training data | FEVER | 41.5 | 57.9 | 48.4 | 67.6 |
| Training data | UKP Snopes | 42.5 | 62.3 | 50.5 | 71.3 |
| Training data | SciFact | 73.7 | 70.5 | 72.1 | 75.7 |
| Training data | FEVER + SciFact | 72.4 | 67.2 | 69.7 | 81.9 |
| Sentence encoder | SciBERT | 74.5 | 74.3 | 74.4 | 69.2 |
| Sentence encoder | BioRoBERTa | 75.3 | 69.9 | 72.5 | 71.7 |
| Sentence encoder | RoBERTa-base | 76.1 | 66.1 | 70.8 | 62.9 |
| Sentence encoder | RoBERTa-large | 73.7 | 70.5 | 72.1 | 75.7 |
| Model input | Claim only | not applicable | not applicable | not applicable | 44.5 |
| Model input | Abstract only | 60.1 | 60.9 | 60.5 | 53.3 |
COVID-19 case study §6.3. One medical student wrote 36 claims about COVID-19. The system retrieved abstracts for each, and one annotator judged each result plausible or not. 23 of 36 were judged plausible. This is an exploratory, single-annotator result with no metric beyond that judgement.
Annotation agreement §3.3. Label agreement on 232 claim-abstract pairs has Cohen's kappa 0.75. Rationale agreement given label agreement has kappa 0.71.
Paper vs code
Code at allenai/scifact, commit 68b98a5. Repository license Apache-2.0 for
code and CC BY 4.0 for claims; corpus abstracts are ODC-By 1.0 from S2ORC
LICENSE.md.
- Retrieval details. Paper: TF-IDF with unigram and bigram features §5 app. A.1. Code: also removes English stop words and fits the vectoriser on title plus abstract tfidf.py. The paper does not mention either detail.
- Rationale output. Paper: sigmoid of a single linear output §5. Code: a 2-way softmax, thresholding the positive-class probability [code: verisci/inference/rationale_selection/transformer.py#L50] transformer.py. The two forms are parameterisations of the same binary decision.
- Label training: NOT_ENOUGH_INFO inputs. Paper: the
kmost similar sentences to the claim, withkin {0, 1} §5 app. A.3. Code: random sentences, one or two per abstract transformer_scifact.py. - Label training: extra negatives. Code adds, for every evidence set in a SUPPORTS or REFUTES pair, one NOT_ENOUGH_INFO example made of one or two random non-rationale sentences transformer_scifact.py. The paper describes non-rationale negatives only for rationale selection §5.
- Label training: union positive. Code adds one extra positive example per abstract, made of all rationale sentences together [code: verisci/training/label_prediction/transformer_scifact.py#L51-L60]. The paper does not mention this.
- FEVER rationale learning rates. Paper: 5e-6 encoder, 5e-5 head app. A.2. The FEVER script's defaults are 1e-5 and 1e-3 [code: verisci/training/rationale_selection/transformer_fever.py#L20-L21]. The training doc does not pass learning rates training.md. Passing the paper values is needed to match the paper.
- Abstract-level rationale limit. Consistent: the evaluator uses the first three rationale sentences metrics.py metrics.py.
- Threshold for Snopes. The paper's 0.75 app. A.1 does not appear in the repo's pipeline script pipeline.sh. Only the FEVER zero-shot threshold (0.025) and the SciFact threshold (0.5) appear there. The Snopes threshold is therefore "not stated" for the repo's pipeline.
- Test set.
script/pipeline.shskips evaluation for the test fold [code: script/pipeline.sh#L108-L110]. The Table 4 test numbers cannot be recomputed with this script alone.
No discrepancies found for: the three-stage order, the NOT_ENOUGH_INFO rule for abstracts with no rationale transformer.py, the 512-token truncation of the rationale [code: verisci/inference/label_prediction/transformer.py#L44-L51], and the 20-epoch SciFact schedule transformer_scifact.py.
Pitfalls
- Retrieval limits the open setting. The paper estimates that replacing the rationale selector with an oracle adds about 20 points of sentence F1 (open setting), and replacing retrieval with an oracle adds about 20 more §6.2. Any reimplementation must match retrieval first.
- Retrieval defaults are unstated. Stop-word handling, tokenisation, title use and the TF-IDF vocabulary cut-off are not stated in the paper §5 app. A.1. The code's choices are listed under Paper vs code.
- Small training set. The SciFact training split has 809 claims tab. 2. The label model does best after FEVER pre-training (81.9 dev accuracy vs 75.7 on SciFact alone) tab. 3. The FEVER step needs the FEVER data, and the rationale model's FEVER training takes about 700 GPU-minutes app. A.4.
- Sentence selection vs label. Sentence Selection+Label is always lower than Selection-Only, because a wrong verdict makes a right rationale count as wrong §4 tab. 4. Do not compare the two columns with each other.
- Threshold choice differs by training set. Zero-shot FEVER uses t = 0.025, tuned on the SciFact dev set; the SciFact model uses 0.5 without tuning app. A.1. Applying the zero-shot threshold to a SciFact-trained model is not what the paper did.
- Rationales may be non-contiguous. 28 gold rationales have non-contiguous sentences, and rationales are mutually exclusive within a pair. The system predicts one unordered sentence set, with no contiguity constraint §3.3 §4.
- Bootstrap noise. With 300 test claims, the reported F1 standard deviations are 2 to 4 points tab. 4 app. B. Differences of a few F1 points fall within that range. The paper calls its main comparisons statistically robust §6.2 app. B.
- Truncation. Inputs longer than 512 tokens are truncated from the rationale side; the claim is never truncated §5 (footnote). Long rationales lose content silently.
- Compute cost. Rationale training on SciFact takes about 150 minutes for 20 epochs on one P100; FEVER training takes about 700 minutes app. A.4. Batch 256 is reached through accumulation of 8-item steps app. A.2.
- Data licences differ. The claims are CC BY 4.0. The corpus abstracts are S2ORC data under ODC-By 1.0 LICENSE.md. Using only the claims does not carry the abstract licence with it.
- COVID-19 results are exploratory. One annotator judged 36 claims. The paper calls the system a research prototype and says it must not be used for medical decisions §1 footnote.
- Claim-only baseline. The claim-only model reaches 44.5 dev accuracy tab. 3. The paper reads this as evidence that the negation step did not create an obvious shortcut §3.2 §6.1. It does not rule out subtler artifacts.
Lineage
- Builds on: the BERT-to-BERT pipeline of DeYoung et al. (ERASER) and Soleimani et al. (2019), which the paper follows for its three components §5. The paper gives no arXiv identifiers for them, so none are linked here.
- Compared against: a FEVER-trained zero-shot model, a SciFact-trained model with oracle inputs, and claim-only and abstract-only models §6.1 §6.2.
- Data sources: S2ORC (for the corpus and citation graph) §3.1.
Source and license
Adapted from “Fact or Fiction: Verifying Scientific Claims” by David Wadden, Shanchuan Lin, Kyle Lo, Lucy Lu Wang, Madeleine van Zuylen, Arman Cohan, Hannaneh Hajishirzi (arXiv:2004.14974), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/allenai/scifact at commit 68b98a56d93e (Apache-2.0). Any quoted code is shown under that license.