Peace Science LLM and Conflict Pre-conference
This research was sponsored by the U.S. Government. The views expressed in this paper are the authors’ alone and do not represent the views of the U.S. Government.
Applied researchers who want to use event data face a dilemma:
Either, use off-the-shelf data
ACLED, UCDP GED, ICEWS, DEED, AAAD, …
Or, build custom event data
Tailored to your question and your corpus.
Our goal: make the second option realistic for an applied researcher.
An open-source pipeline, NGEC, that you can run end-to-end or customize one step at a time.
(A much earlier version of this pipeline generated POLECAT.)
Treat detection as document classification: a set of binary classifiers, one per event type.
Attribute identification is extractive^* and per-event:
The model
The attribute model is conditioned on an event definition supplied at inference time:
To make it work with a new event type, write a new codebook definition (no need to retrain the attribute model).
The output is a JSON list of records with exact spans from the text, or [] if there is no event present:
(Full prompt in the backup slides, model on Huggingface.)
We drop SANCTION and ACCUSE from training, then evaluate on them.
| Condition | F1, found events | F1, all events |
|---|---|---|
| Trained on the type | 69.2 | 66.5 |
| OOS, with definition | 69.8 | 51.4 |
| OOS, bare label only | 59.9 | 45.7 |
We evaluate the attribute model on a held-out set of 500 VOA articles, annotated for all 16 PLOVER types (1,048 events). Gold spans are LLM-drafted and human-adjudicated.
| All events F1 | Found events F1 | Found events, exact F1 | |
|---|---|---|---|
| Actor | 52.7 | 71.7 | 60.8 |
| Recipient | 50.1 | 65.0 | 51.7 |
| Date | 58.9 | 77.9 | 76.7 |
| Location | 54.8 | 72.2 | 68.5 |
| Mean | 54.1 | 71.7 | 64.4 |
Wikipedia gives canonical identifiers and information about roles.
Geoparsing (Updated Mordecai3)
ECAV (Daxecker et al. 2019) is a good test: a different ontology, and it records raw spans and enough metadata to find the source story.
We score against ECAV’s final coded values. The model gets the article, ECAV’s passage, and the event type, so this tests the steps after event detection (i.e., after ConfliBERT).
500 sampled ECAV events, with 95% intervals. LLMs assign ECAV categories themselves.
The pipeline is modular: a large LLM can replace Step 2 if it suits your project.
| You want | Change | Retrain? |
|---|---|---|
| New event types | Fine-tune classifiers (e.g., ConfliBERT); write definitions | Classifiers only |
| New actor categories | Edit the category file | No |
| New attributes | Add synthetic training data | Attribute model |
| New corpus, similar English news | Nothing | No |
| Non-English text | Models and Wikipedia index, or translate first | Yes |
ngec download-index, ngec doctor. Includes instructions for coding agents (AGENTS.md).Andy Halterman
Slides and full paper at https://andrewhalterman.com.
NGEC: https://github.com/ahalterman/NGEC-2025
NGEC live demo: (email me for access)
Updated Mordecai Geoparser: https://github.com/ahalterman/mordecai3/
Geoparsing demo: http://104.131.30.142:9050/demo
SYSTEM
Extract every instance of the given political event type from the document as a JSON list, or [] if there is none.
Each record: {"event_type": ..., "mode": ..., "anchor_quote": ..., "actor": [...], "recipient": [...], "date": [...], "location": [...]}
Every string in actor, recipient, date, and location must be an exact, verbatim substring of the document. Return the JSON list only.
USER
## Document: {document}
## Event Type: {event_def}
{event_def} is the full entry: event type, optional sub-type, and special instructions.
100 VOA articles, each coded by three authors. Spans scored only if the event is detected (68 of 93 gold events).
| Field | Exact | Overlap |
|---|---|---|
| Actor | 67.6 | 81.2 |
| Recipient | 55.9 | 90.4 |
| Location | 69.1 | 91.2 |
| Date | 98.5 | 98.5 |
Percent of 1,662 events where the final value matches ECAV’s.
| Field | ECAV spans | Raw NGEC | NGEC + rules |
|---|---|---|---|
| Actor category | 88.9 | 62.3 | 63.2 |
| Recipient category | 89.6 | 45.2 | 55.2 |
| Location (within 25 km) | 71.8 | 54.8 | 54.8 |
| Date (exact) | — | 85.8 | 85.8 |
| Actor + recipient | 80.2 | 30.4 | 37.3 |
| Actor + recipient + location | 57.5 | 20.0 | 22.5 |
Rules: a protest, strike, blockade, or riot with no target gets State; an arrest with no actor gets State.
We compare using PLOVER’s “agents” file with PLOVER categories mapped to ECAV, or writing an ECAV-specific “agents” file.
| Category accuracy | PLOVER mapped to ECAV | ECAV-specific file |
|---|---|---|
| Actor | 65.6 | 88.9 |
| Recipient | 70.2 | 89.6 |
| ECAV \ NGEC | State | Citizens | Party | Armed | Foreign | Unknown | No span | Total |
|---|---|---|---|---|---|---|---|---|
| State | 89 | 17 | 6 | 17 | 0 | 2 | 49 | 180 |
| Citizens | 24 | 259 | 59 | 6 | 2 | 21 | 51 | 422 |
| Party | 14 | 59 | 82 | 5 | 1 | 5 | 36 | 202 |
| Armed group | 11 | 5 | 17 | 102 | 7 | 47 | 65 | 254 |
| Foreign | 23 | 2 | 1 | 21 | 63 | 6 | 22 | 138 |
| Unknown | 11 | 17 | 3 | 23 | 3 | 121 | 288 | 466 |
| ECAV \ NGEC | State | Citizens | Party | Armed | Foreign | Unknown | No span | Total |
|---|---|---|---|---|---|---|---|---|
| State | 244 | 32 | 28 | 19 | 19 | 35 | 244 | 621 |
| Citizens | 30 | 131 | 18 | 6 | 3 | 57 | 101 | 346 |
| Party | 25 | 22 | 111 | 1 | 0 | 20 | 49 | 228 |
| Armed group | 7 | 20 | 0 | 76 | 4 | 12 | 40 | 159 |
| Foreign | 28 | 19 | 2 | 8 | 88 | 10 | 29 | 184 |
| Unknown | 5 | 51 | 1 | 4 | 1 | 13 | 49 | 124 |
| Model | $ per 1k events | ECAV (1,662) | 100k articles |
|---|---|---|---|
| Claude Sonnet 5 | $5.92 | $9.84 | $592 |
| NGEC, GPU | $0.011 | $0.018 | $1.11 |
| NGEC, CPU | (1.26 h) | (2.1 h) | (126 h) |
| 50 ECAV documents, run twice | Sonnet 5 | GLM 5.3 | Qwen3-14B (local) |
|---|---|---|---|
| All answers identical | 25/50 | 3/50 | 45/50 |
| Refused calls | 0 | 40 (7 docs, Tibet) | 0 |
Halterman et al. · Creating Custom Event Data