Inspiration

I live in Charlotte, North Carolina, about two hours from where Hurricane Helene hit in September 2024. More than 100 people died in our state. 911 systems were overwhelmed, and thousands of people asked for help by text and social media. A message like "Water in our attic. Two kids. We can't get out." sat in the same pile as "Power's out, we're fine."

Responders could not tell which messages were life or death, or which areas needed help first. And this keeps happening: Sandy, Harvey, Maria, Ida, Ian and Helene all overwhelmed emergency communications.

I had already built SKR Binary Rater, a small language model that triages support tickets as urgent or not urgent. I wanted to point the same idea at a problem where the stakes are human lives.

What it does

Rescue Rater ranks disaster help messages and sends each one to the nearest rescue team. It has four layers:

  1. Risk layer: each zip code gets a flood risk score $R_z \in [1, 10]$.
  2. Message layer: a fine-tuned DistilBERT model gives each message an urgent probability $p_u \in [0, 1]$.
  3. Priority layer: one score per message, where location and message content count equally:

$$P = R_z + 10 \cdot p_u \qquad (0 \le P \le 20)$$

  1. Dispatch layer: each urgent message goes to the nearest team, like ride-share matching. Teams work by priority first and distance second.

Messages land in three bands, so nothing urgent is dropped:

  • URGENT: $p_u \ge 0.7$
  • NEEDS REVIEW: $0.1 \le p_u < 0.7$
  • ROUTINE: $p_u < 0.1$

Urgent messages are grouped into hot zones, scored as $H = n_{urgent} \times R_z$. A zone above the alert level sends the nearest drone to confirm the need (simulated in the demo).

A human reviews every message. Rescue Rater only sets the order.

How we built it

  • Data: 432 synthetic help messages across 8 categories (trapped, medical, missing, collapse, power, info, property, supplies), each written in many wordings. Urgent and non-urgent messages are shuffled together, and whole wordings are held out for testing, so the model is tested on phrasing it never saw.
  • Model: DistilBERT (distilbert-base-uncased) from Hugging Face, fine-tuned for 3 epochs with PyTorch in Google Colab on a T4 GPU.
  • Baseline: TF-IDF with logistic regression, for comparison.
  • Geospatial layer: 10 real western North Carolina towns and zip codes with mock flood scores. Team-to-zip distance uses the haversine formula:

$$d = 2r \arcsin\left(\sqrt{\sin^2\frac{\Delta\phi}{2} + \cos\phi_1 \cos\phi_2 \sin^2\frac{\Delta\lambda}{2}}\right)$$

Results on 96 held-out test messages:

Rescue Rater Baseline
Accuracy 84% 59%
Urgent caught 39 of 48 48 of 48
False alarms 6 of 48 39 of 48

With the review band, 0 of 21 urgent messages were left in the routine pile.

Disclosures: the training method is reused from my earlier SKR Binary Rater project. All messages are synthetic, flood scores are mock values, and drone results are simulated. Claude (Anthropic) helped draft code and documentation; I designed the system, ran it, and checked every result.

Code: https://github.com/sathishcrmsf/rescue-rater

Challenges we ran into

  • Fake accuracy. In my earlier build, urgent and non-urgent examples were grouped together, and accuracy looked high when it wasn't. This time I shuffled the data and held out whole wordings.
  • Unseen phrasing. The model missed most "mudslide hit the house next door" messages, because it never saw that wording. Instead of hiding this, I added the NEEDS REVIEW band, which caught all of them.
  • Recall vs false alarms. The baseline catches every urgent message but also flags 39 of 48 calm ones, which is the same as no sorting. Balancing safety with useful sorting led to the three-band design.
  • Location. Real messages don't come with a clean zip code. In the demo, zips are assigned at random. In production they would come from address geocoding, carrier location on texts to 911, and an auto-reply that asks for an address.
  • Checking the facts. I checked every hurricane statistic against its source and corrected the ones that didn't match.

Accomplishments that we're proud of

  • A working end-to-end prototype, from raw message to team dispatch list.
  • 84% accuracy with 6 false alarms, against 39 for the baseline, on wordings the model never saw.
  • 0 of 21 urgent messages dropped, thanks to the review band.
  • The model reads meaning, not keywords: "Urgent: Are schools closed tomorrow?" scored ROUTINE.
  • A design that keeps a human in control at every step.

What we learned

  • Mix your training data, or your accuracy is fake.
  • Keep the score explainable. A simple formula lets responders see why a message is at the top.
  • More data isn't enough; you need more different data. 10,000 copies of the same 48 wordings would teach the model nothing new.
  • Every low score is a person. A low score must never mean ignored.

What's next for Rescue Rater

  • Real North Carolina flood data: FRIS for flood risk and FIMAN for live river gauges.
  • Address geocoding and carrier location from texts to 911.
  • 10,000+ real labelled disaster messages, including messy, short and misspelled ones, in more languages.
  • Road-closure routing instead of straight-line distance.
  • Wireless Emergency Alerts to hot zones, approved by an official.
  • A read-only pilot running next to a county 911 dispatch system.

Built With

Share this project:

Updates

Submission history