""" Dataset Loader Module Loads and caches the TruthfulQA dataset as well as CoQA, SQuAD, NQ, and TriviaQA from HuggingFace for ground truth comparison. """ import streamlit as st from datasets import load_dataset from typing import List, Dict @st.cache_data def load_truthfulqa(split: str = "validation"): """ Load the TruthfulQA dataset (generation config) from HuggingFace. """ dataset = load_dataset("truthful_qa", "generation") return dataset[split] @st.cache_data def get_all_qa_pairs(split: str = "validation") -> List[Dict]: """ Load TruthfulQA, SQuAD, NQ Open, Trivia QA, and CoQA. Returns a unified list of dictionaries with 'question', 'best_answer', and 'source'. """ pairs = [] # 1. TruthfulQA try: tqa = load_truthfulqa(split) for row in tqa: pairs.append({"question": row["question"], "best_answer": row["best_answer"], "source": "TruthfulQA"}) except Exception as e: print(f"Error loading TruthfulQA: {e}") # # 2. SQuAD # try: # print("Loading SQuAD dataset...") # squad = load_dataset("squad", split=split) # for row in squad: # ans = row["answers"]["text"][0] if row["answers"]["text"] else "" # if ans: # pairs.append({"question": row["question"], "best_answer": ans, "source": "SQuAD"}) # except Exception as e: # print(f"Error loading SQuAD: {e}") # # 3. NQ Open # try: # print("Loading NQ Open dataset...") # nq = load_dataset("nq_open", split=split) # for row in nq: # ans = row["answer"][0] if row["answer"] else "" # if ans: # pairs.append({"question": row["question"], "best_answer": ans, "source": "NQ"}) # except Exception as e: # print(f"Error loading NQ: {e}") # # 4. Trivia QA # try: # print("Loading Trivia QA dataset...") # trivia = load_dataset("trivia_qa", "rc.nocontext", split=split) # for row in trivia: # ans = row["answer"]["value"] # if ans: # pairs.append({"question": row["question"], "best_answer": ans, "source": "TriviaQA"}) # except Exception as e: # print(f"Error loading TriviaQA: {e}") # # 5. CoQA # try: # print("Loading CoQA dataset...") # coqa = load_dataset("coqa", split=split) # for row in coqa: # questions = row["questions"] # answers = row["answers"]["input_text"] # for q, a in zip(questions, answers): # pairs.append({"question": q, "best_answer": a, "source": "CoQA"}) # except Exception as e: # print(f"Error loading CoQA: {e}") return pairs def build_qa_lookup(split: str = "validation") -> dict: """ Return a dict mapping each question (lowercased) -> best_answer. Useful for fast exact-lookup. """ data = load_truthfulqa(split) return {entry["question"].strip().lower(): entry["best_answer"] for entry in data}