Named Entity Recognition for Early Modern English documents (1500-1800)
Project description
EarlyModernNER
Named Entity Recognition for Early Modern English documents (1500-1800).
Overview
EarlyModernNER extracts four types of entities from historical texts:
| Entity Type | Description | Examples |
|---|---|---|
| TOPONYM | Place names | London, Jamaica, West Indies |
| PERSON | Individual people | Oliver Cromwell, Governor Modyford |
| ORGANIZATION | Institutions | East India Company, Parliament |
| COMMODITY | Trade goods & materials | sugar, tobacco, silk |
Performance
Evaluated on 100 gold-standard annotated documents:
| Entity Type | Precision | Recall | F1 |
|---|---|---|---|
| TOPONYM | 0.93 | 0.82 | 0.87 |
| PERSON | 0.93 | 0.69 | 0.80 |
| ORGANIZATION | 0.93 | 0.46 | 0.62 |
| COMMODITY | 0.85 | 0.80 | 0.83 |
| Overall | 0.89 | 0.77 | 0.83 |
Quick Start
Installation
pip install earlymodernner
Or install from source:
git clone https://github.com/polayj/earlymodernner.git
cd earlymodernner
pip install -e .
Model adapters (~680MB total) are automatically downloaded from Hugging Face Hub on first use.
Usage
# Process a single file
python -m earlymodernner --input document.txt --output results.jsonl
# Process a directory
python -m earlymodernner --input /path/to/docs/ --output results.jsonl
# Output as CSV
python -m earlymodernner --input docs/ --output results.csv --csv
# Pre-download adapters (optional, for offline use)
python -m earlymodernner --download
Output Format
JSONL (default):
{
"doc_id": "document_name",
"text": "The sugar trade between Jamaica and Bristol...",
"entities": [
{"text": "Jamaica", "type": "TOPONYM"},
{"text": "Bristol", "type": "TOPONYM"},
{"text": "sugar", "type": "COMMODITY"}
]
}
CSV (with --csv):
doc_id,entity_text,entity_type
document_name,Jamaica,TOPONYM
document_name,Bristol,TOPONYM
document_name,sugar,COMMODITY
Requirements
- Python 3.9+
- CUDA-compatible GPU with 8GB+ VRAM
- See
requirements.txtfor dependencies
Project Structure
earlymodernner/
├── earlymodernner/ # Main package
│ ├── __main__.py # CLI entry point
│ ├── pipeline.py # Inference pipeline
│ ├── constants.py # Entity types & prompts
│ └── adapters/ # Trained LoRA adapters
├── dev/ # Training & development tools
│ ├── train_lora.py # Training script
│ ├── evaluate.py # Evaluation script
│ ├── training.md # Training documentation
│ └── config/ # Training configurations
├── docs/ # Documentation
│ ├── usage.md # Detailed usage guide
│ └── corpus.md # Training corpus details
└── results/ # Default output directory
Documentation
- Usage Guide - Detailed usage instructions, input/output formats
- Training Corpus - Data sources and annotation process
- Training Guide - How to train your own adapters
How It Works
EarlyModernNER uses an ensemble approach with four specialized models:
- Each entity type has its own fine-tuned LoRA adapter
- Documents are processed by all four adapters
- Results are merged using priority-based cascade (TOPONYM → COMMODITY → PERSON → ORGANIZATION)
- Overlapping entities are resolved by giving priority to higher-performing models
Technical details:
- Base model: Qwen3-4B-Instruct
- Fine-tuning: QLoRA (4-bit quantization)
- Training: Silver-standard annotations + synthetic hard negatives
Citation
@software{earlymodernner,
title = {EarlyModernNER: Named Entity Recognition for Early Modern English},
author = {Polay, Jacob},
year = {2026},
url = {https://github.com/polayj/earlymodernner}
}
License
MIT License
Author
Jacob Polay, MA Student, University of Saskatchewan
Acknowledgments
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file earlymodernner-0.1.0.tar.gz.
File metadata
- Download URL: earlymodernner-0.1.0.tar.gz
- Upload date:
- Size: 47.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1751517309ae7ff388dc2c75d71d16727533a611c162971f516eab6202c959f2
|
|
| MD5 |
eb9e37186ae89ca526bb7af637261c2f
|
|
| BLAKE2b-256 |
c4b2e327e0f36ec347339982c0d5ecf4d702acd48f2287428509c7153bca72b7
|
File details
Details for the file earlymodernner-0.1.0-py3-none-any.whl.
File metadata
- Download URL: earlymodernner-0.1.0-py3-none-any.whl
- Upload date:
- Size: 53.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a9c40927558268631029b6bda115a3f19ae1b38c0309466bb2ad1043f792632
|
|
| MD5 |
0a4dbecbf081bfffdc2ac54d1076bd55
|
|
| BLAKE2b-256 |
bee6986276553ce6397f94ffe2c8914ba95b6ab0bd5e9335d693c36a2233a791
|