Skip to main content

polartox

NLP toolkit for annotator polarization research. Provides tools for synthetic dataset generation and polarization detection in human annotation studies.

Install

pip install polartox

Tools

Module Description Status
polartox.datagen Synthetic annotator pool with injected, ground-truth polarization Stable
polartox.polarized_trees Polarized Trees detection algorithm Stable (baseline)

polartox.datagen

Builds a pool of annotators with explicit demographic identities and generates annotation datasets where every text independently gets k active dimensions (0–4) that drive its disagreement:

  • k = 0 — no dimension explains anything, a true unimodal negative control
  • k ≥ 1 — a random subset of dimensions is active, each with its own random toxic/civil lean split and a continuous intensity (alpha) controlling how strongly it pulls toward its pole

Identities' rating distributions are built by taking the elementwise product of their active-dimension shapes — signal composes rather than averages away, reaching the full nDFU range instead of collapsing toward the middle.

from polartox.datagen import AnnotatorPool, DEFAULT_DIMENSIONS, DEFAULT_DEPTH_WEIGHTS, DEFAULT_INTENSITY_RANGE

pool = AnnotatorPool(
    dimensions=DEFAULT_DIMENSIONS,
    scale=5,
    intensity_range=DEFAULT_INTENSITY_RANGE,
    depth_weights=DEFAULT_DEPTH_WEIGHTS,
    annotators_per_identity=10,
)

result = pool.generate_dataset(
    n_texts=100,
    n_annotators_per_text=150,
    noise=0.05,
    seed=42,
)
dataset, ground_truth = result
# dataset columns: text_id, annotator_id, <dimensions>, rating
# ground_truth: per-text active_dims, lean (toxic/civil split), and alpha (intensity)

nDFU scoring is provided by the collaborative ndfu package (Pavlopoulos & Likas, 2024) rather than reimplemented here:

from ndfu import dfu, pdf

text_data = dataset[dataset["text_id"] == 0]
hist = pdf(text_data["rating"].tolist(), range(1, pool.scale + 1))
score = dfu(hist)

polartox.polarized_trees

Given an annotation dataset, recursively partitions annotators by demographic dimension to find the specific subgroups most polarized on a given text — which dimensions drive disagreement, and which intersectional subgroups diverge most strongly.

from polartox.polarized_trees import PolarizedTreesPipeline

pipe = PolarizedTreesPipeline(
    dims=list(DEFAULT_DIMENSIONS.keys()),
    scale=5,
    theta_filter=0.3,      # how polarized a text must be to analyze at all
    min_size_frac=0.03,    # min subgroup size, as a fraction of each text's annotators
    h=0.05,                # PRG gain threshold
    max_depth=6,
)

results = pipe.run_full_evaluation(dataset)
# results["F"], results["C"], results["P"] -- dataset-level metrics
# results["diagnostics"] -- ground-truth-free corpus stats, usable on real data

# on synthetic data, pass ground_truth=... (dict per text_id) for recovery metrics
results = pipe.run_full_evaluation(dataset, ground_truth=ground_truth)
results["recovery"]   # per-text jaccard / precision / recall / exact_match

Full API documentation available on GitHub.

Changelog

See CHANGELOG.md for release history.

Metadata

Release files for polartox 0.3.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 polartox 0.3.0
File Size Uploaded Provenance Actions
polartox-0.3.0.tar.gz 32.0 kB Without provenance Details for polartox-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for polartox 0.3.0
File Interpreter ABI Platform Actions
polartox-0.3.0-py3-none-any.whl Python 3 none any Details for polartox-0.3.0-py3-none-any.whl

Total release size: 58.1 kB

Release files / polartox-0.3.0.tar.gz

Download URL polartox-0.3.0.tar.gz
Size 32.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a74d3aacf3dc8e4d49f60fbc791a387c89e55b374db948e5e2c0215db25059c9
BLAKE2b-256 checksum
How to use checksums
b95215b17e80fe2209f1555f8dc067ac8bcb6dcb9dd124d416f6da5f15e9d864
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Release files / polartox-0.3.0-py3-none-any.whl

Download URL polartox-0.3.0-py3-none-any.whl
Size 26.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5e213c38be53bd967d9c81e99f0e583e162d7317557f5f332f335e9a306f0229
BLAKE2b-256 checksum
How to use checksums
5e28246e8d547d860b3883422ae3eb24e9bcb26d521861107b8a12cbd3282c1a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.2

Security for polartox 0.3.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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