Skip to main content

country-resolver

Fast, offline country resolution for social media profiles.

country-resolver is a Python package for inferring a user's country from social media profile information. It is designed for noisy, real-world profile data from platforms such as X (formerly Twitter), GitHub, Mastodon, Bluesky, and similar services.

The package consists of two complementary modules:

Module Purpose
Country Resolver Resolves the dedicated location field into an ISO 3166-1 alpha-2 country code.
Bio Resolver Infers a user's current country of residence from profile biographies using natural language processing.

Together they provide a fast, explainable solution for country inference without relying on online geocoding services for most lookups.


Why Two Resolvers?

Profile location fields and biographies require different approaches.

A location field is usually short and structured:

Lagos, Nigeria
🇳🇬
Naija
Berlin

A biography is free-form natural language:

Originally from Nigeria.
Based in Berlin.

AI Engineer • Living in Canada 🇨🇦

Building software.
Born in Ghana.

Trying to process both using the same algorithm either misses valid signals or produces unnecessary false positives.

country-resolver therefore provides two specialized resolvers that can be used independently or together.


Features

  • ⚡ Offline-first resolution
  • 🌍 ISO 3166-1 alpha-2 country codes
  • 🏙️ City-to-country lookup
  • 🚩 Flag emoji support
  • 🔤 Country aliases and abbreviations
  • ✏️ Fuzzy matching for misspellings
  • 🧠 spaCy-powered biography analysis
  • 📊 Confidence scoring and evidence tracking
  • 🔍 Explainable predictions
  • 🧪 Comprehensive unit tests
  • 🌐 Optional online geocoder fallback for address-like locations

Installation

pip install country-resolver

For Bio Resolver, also install the English spaCy model:

python -m spacy download en_core_web_sm

Quick Start

Country Resolver

from country_resolver.location import CountryResolver

resolver = CountryResolver()

resolver.resolve("Lagos, Nigeria")
'NG'

Bio Resolver

from country_resolver.bio import BioResolver

bio = BioResolver(location)

bio.resolve(
    "Originally from Nigeria. Based in Berlin."
)
'DE'

Which Resolver Should I Use?

Your data Recommended module
Profile location field Country Resolver
Profile biography Bio Resolver
Both Use both together for the highest accuracy

Example Inputs

Input Module Output
Nigeria Location NG
🇳🇬 Location NG
Naija Location NG
Lagos Location NG
Caneda Location CA
Kora Nort Location KP
Earth Location None
Based in Berlin. Bio DE
Living in Canada 🇨🇦 Bio CA
Originally from Nigeria. Living in Germany. Bio DE

Package Architecture

country_resolver/
│
├── location/
│   ├── resolver.py
│   ├── lookup.py
│   ├── normalize.py
│   ├── geocoder.py
│   └── ...
│
└── bio/
    ├── resolver.py
    ├── parser.py
    ├── scoring.py
    ├── extractors.py
    └── ...


Design Philosophy

Offline First

The package performs all primary lookups locally.

Network requests are made only when the optional geocoder is enabled for address-like inputs.


Deterministic

The same input always produces the same output.


Conservative

Returning None is preferred over making an incorrect prediction.


Explainable

Both resolvers expose the reasoning behind their predictions, making results suitable for debugging, analytics, and machine learning pipelines.


Modular

Each resolver can be used independently, while sharing the same country resolution infrastructure.


Documentation

Detailed module documentation is available in:

  • location/README.md
  • bio/README.md

These documents describe each resolver's internal workflow, API, limitations, examples, and implementation details.


Testing

Run the full test suite with:

pytest

Roadmap

Future development may include:

  • Additional language support
  • Combined profile resolver
  • More profile signal resolvers

License

MIT License. See the LICENSE file for details.

Metadata

Release files for country-resolver 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for country-resolver 0.2.0
File Size Uploaded
country_resolver-0.2.0.tar.gz 21.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for country-resolver 0.2.0
File Interpreter ABI Platform
country_resolver-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 50.1 kB

Release files / country_resolver-0.2.0.tar.gz

Download URL country_resolver-0.2.0.tar.gz
Size 21.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c24aa9b03f8237834f952846b51cc7768b625d3825c4a000c6dd3c6e52e1564d
BLAKE2b-256 checksum
How to use checksums
52b388a72351e0e249b64590b16c79e3477bbad8030137fd7154c78fb0d5b44b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 19, 2026.

Transparency log

Release files / country_resolver-0.2.0-py3-none-any.whl

Download URL country_resolver-0.2.0-py3-none-any.whl
Size 28.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
08377d71b2be1121b4c3dde9a6024eab4d72e1cc6c816a32eca386ef0c08df9d
BLAKE2b-256 checksum
How to use checksums
9d6ebfd0bdb982949ffe80b770cc162b2ab4fb9bd67c0de39af5c2407d348369
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page