text2rel
TestTestTest
pip install text2rel
This is the package implementation of the code for the kinship ties and relational information from large text corpora, such as genealogies, biographies, and historical dictionaries.
Important information:
- For example package usage, see
test_workflow.ipynb - For information about individual functions before the package implementation and release, see
examplesfolder.
Expected input files
Each document should normally have these three files together in the same
folder under documents_root:
0_GenelogiesAndBiographies/
├── Example genealogy/
│ ├── Example genealogy_mod.htm # source HTML used for the inventory
│ ├── Example genealogy_mod.pdf # PDF with a readable OCR text layer
│ └── Example genealogy_Original.pdf # original PDF without OCR
└── Biographies/
└── Example biography/
├── Example biography_mod.htm
├── Example biography_mod.pdf
└── Example biography_Original.pdf
The filenames must share the same base name. The package uses the HTML for
inventory creation, prefers *_mod.pdf for page matching, and falls back to
*_Original.pdf, which can be OCRed with Tesseract when necessary.
Current release:
Current release includes inventory creation, setting text bounds, assigning font usage and selecting appropriate text chunks from the files (including restriction to "MainText" fonts and JumPJumP insertion).
Files structure:
Contains the HTMLCleaner class and thus the main logic.
Contains helper functions (like JumPJumP insertion)
Contains the file processing logic, such as loading and saving the JSON inventory.
Adds one-based PDF start_page and end_page values to chunk metadata using
exact and fuzzy text matching. Missing PDFs are skipped with null page values
and explicit filename guidance.
Add PDF page numbers
If you already created an HTMLCleaner, use cleaner.add_pdf_pages(). If you
only have an inventory JSON file, use add_pages_to_inventory_file() directly.
summary = cleaner.add_pdf_pages(
documents_root="../0_GenelogiesAndBiographies",
output_path="exact_html_inventory_new_ids_cleaned_pages.json",
)
The default fuzzy threshold is 0.80. The matcher prefers *_mod.pdf, falls
back to _Original.pdf when needed, and can use Tesseract for image-only
originals when Tesseract is installed.
Human Labeler Allocation
Automatic project creation attaches the existing Kinship ontology to Relations
and Events ontology to Events, then starts new projects after upload and member
setup. Existing projects are still skipped. Other workspaces can pass
ontology_ids={"Relns": "kinship_id", "Events": "events_id"} to
upload_labelers_data_to_labelbox().
When text chunks are allocated to labelers, each generated TXT filename indicates its task type:
Task_0contains chunks shared across all labelers.Task_1throughTask_9contain labeler-specific, unshared chunks.
New section 4 assessment workflow
The reusable assessment follows sections 4.2.2.1 and 4.2.2.2 of
240426 Information extraction system 260801.ipynb. Install the optional plot
dependencies, load the processed human and AI tables, and then create the
assessment tables before drawing anything:
pip install -e ".[plots]"
from text2rel import (
ReliabilityAssessment,
build_sweep_report,
plot_sweep_report,
plot_threshold_curves,
)
assessment = ReliabilityAssessment("inventory.json")
assessment.load_relations_data(relations_csv="human_relations.csv")
assessment.load_chatgpt_relations("machine_relations.csv")
# one_to_one is the package's stricter default for headline metrics.
relation_results = assessment.assess_llm_against_humans(data="relations")
plot_threshold_curves(relation_results["threshold_metrics"], direction="one_to_one")
# directional_best reproduces the notebook's two reusable-candidate views.
diagnostics = assessment.assess_llm_against_humans(
data="relations", matching_mode="directional_best"
)
fn_report = build_sweep_report(
diagnostics["human_to_llm_best_pairs"], data="relations"
)
plot_sweep_report(fn_report)
assess_llm_against_humans() returns the selected pairs, threshold metrics,
false-negative and false-positive review tables, structural exclusions, and
configuration metadata. Plot functions only render these returned tables; they
do not change matching or scores. See the separate New section 4 assessment
plots and tables section at the end of test_workflow.ipynb for relations
and events, notebook-style titles, confidence/length diagnostics, and review
summaries.
Convert downloaded OpenAI batches to CSV
Use the submitted cleaned inventory (or the exact submitted subset) to restore
chunk IDs. The function accepts a JSONL path or download_batch_results() output:
CSV saving is automatic: omitted or None output_csv writes llm_relations.csv
or llm_events.csv in the current working directory. Pass a path to choose another
destination. Reruns overwrite the destination; both DataFrames are still returned.
from text2rel import process_batch_results
relations, relation_audit = process_batch_results(
"batch_output_relations.jsonl", submitted_inventory,
extraction_type="relations", output_csv="llm_relations.csv",
)
events, event_audit = process_batch_results(
"batch_output_events.jsonl", submitted_inventory,
extraction_type="events", output_csv="llm_events.csv",
)
assessment.load_llm_relations("llm_relations.csv")
assessment.load_llm_events("llm_events.csv")
Taxonomy can be applied to the returned tables before assessment. These are the
ungrouped load_llm_* schemas, not historical load_chatgpt_* grouped CSVs.
Errors or missing responses raise by default; pass strict=False to inspect
partial results and their audit. Keep the audit, which also records successful
empty extractions. Custom schemas must retain s/r/t or S/V; extra fields
are preserved. For historical req_N IDs, pass an explicit mapping from each
request ID to its original chunk metadata (including chunk_id).
Download Labelbox annotations to human CSVs
Use download_labelbox_results(project_ids, allocation, tasks_dir, output_dir)
with project_ids={"relations": ["project_id"], "events": ["project_id"]}.
It reuses the Done-only exporter and saves human_relations.csv,
human_events.csv, and coverage CSVs. Each returned dictionary value is a
(facts, coverage) pair. Supply api_key and optionally author_map.
Keep the original allocation JSON and uploaded TXT files unchanged: offsets in
the TXT locate each annotation; allocation row IDs recover original chunk IDs.
For manual JSON/JSONL exports use
process_labelbox_results(exports, allocation, tasks_dir, "relations", output_csv)
(or "events"). Ambiguous mappings raise before saving that CSV.
Coverage records empty completed annotations separately; the current assessment
does not automatically score these empty chunks. Downloads include only Done
tasks and do not establish that every assigned task has been completed.
Labelbox event construction modes
labelbox_events_to_dataframe(..., construction_mode="graph") is the default.
It follows section 2.4.3.2 of the 260801 notebook: connected annotations are
rebuilt around one Verb, safe reversed arrows are corrected, and incomplete or
ambiguous structures remain auditable. Use construction_mode="legacy_simple"
only when explicitly reproducing the package's earlier permissive conversion.
Relation conversion uses its audited endpoint joins separately.
Metadata
Release files for text2rel 1.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| text2rel-1.0.5.tar.gz | 160.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| text2rel-1.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 329.6 kB
Release files / text2rel-1.0.5.tar.gz
| Download URL | text2rel-1.0.5.tar.gz |
|---|---|
| Size | 160.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8b92a46ebca207c7ab2502445924bcf57d3449906296da6a58d8d7d80144dd8f
|
|
BLAKE2b-256 checksum How to use checksums |
28f174b542c788f63495ab0c7c9f8228bada86ba4eacfe670034261f6eb76201
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 11, 2026.
Transparency logRelease files / text2rel-1.0.5-py3-none-any.whl
| Download URL | text2rel-1.0.5-py3-none-any.whl |
|---|---|
| Size | 168.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f4f38ada77aa8d949baca4aec11d2cea3653256d0a3b788f8242f1971042a91c
|
|
BLAKE2b-256 checksum How to use checksums |
f558302b175049f227c4cb9201099ce0664327d1a61ab673f6dd4baa6a192986
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 11, 2026.
Transparency logSecurity for text2rel 1.0.5
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for text2rel-1.0.5.tar.gz
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 Oct 11, 2026.
Transparency logA 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.