# scripts/fix_all_data.py import json, random from collections import Counter # ── Fix 1: Add at_risk examples to crisis data ──────────────────────────────── print("Fixing crisis data...") at_risk_examples = [ "I don't know how much longer I can keep going like this", "I feel completely hopeless about my future", "Nothing ever gets better no matter what I do", "I can't see a way out of this situation", "I feel like a burden to everyone around me", "I've been thinking that everyone would be better off without me", "I don't see the point in trying anymore", "I feel trapped and don't know what to do", "I've lost all hope that things will improve", "I feel like I'm disappearing and no one notices", "I'm exhausted and don't want to fight anymore", "Sometimes I wish I could just not wake up", "I feel like giving up on everything", "I can't go on pretending everything is okay", "I feel completely empty inside", "There's no reason to keep trying", "I don't want to be here anymore", "I feel like the world would be better without me", "I've been having dark thoughts I can't shake", "I feel like I'm at the end of my rope", "Every day feels pointless and I don't know why I bother", "I feel so alone even when people are around me", "I've been isolating myself because nothing feels worth it", "I feel numb and disconnected from everything", "I don't care what happens to me anymore", ] with open("data/crisis_balanced.jsonl") as f: existing = [json.loads(l) for l in f] safe_rows = [r for r in existing if r["label"] == "safe"][:1500] crisis_rows = [r for r in existing if r["label"] == "crisis"][:1500] # Build at_risk rows — oversample to 1500 at_risk_rows = [] while len(at_risk_rows) < 1500: for text in at_risk_examples: at_risk_rows.append({"text": text, "label": "at_risk"}) if len(at_risk_rows) >= 1500: break balanced = safe_rows + at_risk_rows + crisis_rows random.shuffle(balanced) with open("data/crisis_fixed.jsonl", "w") as f: for r in balanced: f.write(json.dumps(r) + "\n") dist = Counter(r["label"] for r in balanced) print(f" Crisis fixed: {dict(dist)} — total {len(balanced)}") # ── Fix 2: Expand distortion data massively ─────────────────────────────────── print("Expanding distortion data...") distortion_examples = [ # all_or_nothing (label 1) ("I never do anything right", "all_or_nothing"), ("I always mess everything up", "all_or_nothing"), ("Everything I try fails", "all_or_nothing"), ("I completely ruined it", "all_or_nothing"), ("Nobody ever supports me", "all_or_nothing"), ("I totally failed at this", "all_or_nothing"), ("Things never work out for me", "all_or_nothing"), ("I always say the wrong thing", "all_or_nothing"), ("I never get anything done", "all_or_nothing"), ("Everything is either perfect or pointless", "all_or_nothing"), ("I either succeed completely or I'm a failure", "all_or_nothing"), ("There is no middle ground for me", "all_or_nothing"), # catastrophizing (label 0) ("This is going to be a total disaster", "catastrophizing"), ("Everything is falling apart around me", "catastrophizing"), ("This will ruin my entire life", "catastrophizing"), ("The worst is definitely going to happen", "catastrophizing"), ("I can't handle this, it's too much", "catastrophizing"), ("This small mistake will cost me everything", "catastrophizing"), ("I'm going to lose everything because of this", "catastrophizing"), ("This is the end for me", "catastrophizing"), ("Things are spiraling completely out of control", "catastrophizing"), ("One bad day means my whole life is falling apart", "catastrophizing"), ("This is absolutely terrible and won't get better", "catastrophizing"), # mind_reading (label 2) ("I know they all think I'm stupid", "mind_reading"), ("She must hate me after what I said", "mind_reading"), ("They're definitely judging me right now", "mind_reading"), ("He thinks I'm a complete failure", "mind_reading"), ("Everyone can tell how anxious I am", "mind_reading"), ("I know my boss thinks I'm incompetent", "mind_reading"), ("They didn't reply so they must be angry at me", "mind_reading"), ("I can tell she was disappointed in me", "mind_reading"), ("Everyone in that room was thinking badly of me", "mind_reading"), ("They obviously don't like me", "mind_reading"), # fortune_telling (label 3) ("I know this interview will go badly", "fortune_telling"), ("I'm definitely going to fail the exam", "fortune_telling"), ("Things are only going to get worse from here", "fortune_telling"), ("I'll never find anyone who loves me", "fortune_telling"), ("I know I'm going to embarrass myself", "fortune_telling"), ("This relationship is doomed to fail", "fortune_telling"), ("I just know something bad is coming", "fortune_telling"), ("There's no point trying, I'll fail anyway", "fortune_telling"), # emotional_reasoning (label 4) ("I feel like a failure so I must be one", "emotional_reasoning"), ("I feel scared so something bad must happen", "emotional_reasoning"), ("I feel worthless so I am worthless", "emotional_reasoning"), ("I feel guilty so I must have done something wrong", "emotional_reasoning"), ("I feel stupid so I must be stupid", "emotional_reasoning"), ("I feel like a bad person so I must be one", "emotional_reasoning"), ("My feelings are proof that things are bad", "emotional_reasoning"), # should_statements (label 5) ("I should always be productive", "should_statements"), ("I must never make mistakes", "should_statements"), ("I should be able to handle this on my own", "should_statements"), ("I ought to be stronger than this", "should_statements"), ("I should always put others first", "should_statements"), ("I must be perfect at everything I do", "should_statements"), ("I should never need help from anyone", "should_statements"), ("I must always stay in control", "should_statements"), # labeling (label 6) ("I'm just a loser", "labeling"), ("I'm a complete failure as a person", "labeling"), ("I'm so stupid", "labeling"), ("I'm worthless", "labeling"), ("I'm a terrible person", "labeling"), ("I'm such an idiot", "labeling"), ("I'm a burden to everyone", "labeling"), ("I'm broken and can't be fixed", "labeling"), ("I'm a disappointment", "labeling"), # personalization (label 7) ("It's all my fault things went wrong", "personalization"), ("I ruined everything for everyone", "personalization"), ("The argument happened because of me", "personalization"), ("If I had been better this wouldn't have happened", "personalization"), ("Everyone is upset and it's because of me", "personalization"), ("I caused all of this", "personalization"), # mental_filter (label 8) ("Despite everything going well I keep thinking about that one mistake", "mental_filter"), ("I can only focus on the bad parts", "mental_filter"), ("All I notice is what went wrong", "mental_filter"), ("Even though people said nice things I only remember the criticism", "mental_filter"), ("I got good feedback but one negative comment ruined it", "mental_filter"), ("I can't stop focusing on that one failure", "mental_filter"), # discounting_positives (label 9) ("Sure I did well but it doesn't really count", "discounting_positives"), ("Anyone could have done that it wasn't a big deal", "discounting_positives"), ("The good things don't matter", "discounting_positives"), ("I only succeeded because I got lucky", "discounting_positives"), ("That compliment doesn't mean anything", "discounting_positives"), ("It doesn't count because it was easy", "discounting_positives"), # none (label 10) ("I had a pretty good day today", "none"), ("Things went okay this morning", "none"), ("I'm feeling a bit tired but managing", "none"), ("I talked to my friend and felt better", "none"), ("Work was busy but I got through it", "none"), ("I went for a walk and it helped", "none"), ("I'm not sure how I feel right now", "none"), ("Today was just a normal day", "none"), ("I finished the project and feel okay about it", "none"), ("I had lunch with a colleague", "none"), ("I am feeling a little stressed but it is manageable", "none"), ("Things could be better but I am coping", "none"), ] # Oversample to ~150 total (balanced across 11 classes) expanded = [] per_class = {} for text, label in distortion_examples: per_class.setdefault(label, []).append(text) target_per_class = 15 for label, texts in per_class.items(): while len([e for e in expanded if e["distortion"] == label]) < target_per_class: for text in texts: expanded.append({"text": text, "distortion": label}) if len([e for e in expanded if e["distortion"] == label]) >= target_per_class: break random.shuffle(expanded) with open("data/distortion_fixed.jsonl", "w") as f: for r in expanded: f.write(json.dumps(r) + "\n") dist2 = Counter(r["distortion"] for r in expanded) print(f" Distortion fixed: {len(expanded)} total examples") print(f" Per class: {dict(dist2)}") print("\n✅ Done. Use crisis_fixed.jsonl and distortion_fixed.jsonl for retraining.")