Semantic radiology findings-to-diagnosis dictionary by GRAi (coregrai.com)
Project description
Radiology Semantic Dictionary
By GRAi -- radiology tooling at coregrai.com.
A lightweight Python package for mapping radiology imaging findings to diagnoses. No API calls, no LLM required - pure dictionary lookups with sub-millisecond response times.
Features
- 8,300+ imaging findings with pathology mappings
- 2,900+ medical concepts with synonyms and definitions
- 360+ differential diagnosis groups by finding pattern
- 700+ radiology synonym mappings (CT -> computed tomography, etc.)
- 69 named imaging signs with differentials (whirlpool sign, halo sign, etc.)
- 7 ACR classification systems (BI-RADS, LI-RADS, Lung-RADS, PI-RADS, TI-RADS, O-RADS, CAD-RADS)
- 25 measurement thresholds (Fleischner criteria, TI-RADS FNA, organ sizes)
- 36 board-tested mnemonics (VITAMIN D, CHICAGO, FLAMES, CRASH, etc.)
- 61 syndrome associations with screening recommendations (VHL, TSC, NF1, etc.)
Installation
pip install radiology-semantic-dict
Quick Start
from radiology_semantic import SemanticRadDict
# Initialize the dictionary
srd = SemanticRadDict()
# Map findings to diagnosis
result = srd.findings_to_diagnosis(
findings=["fat stranding", "RLQ", "lymphadenopathy"],
modality="CT"
)
print(result.primary_diagnosis) # "appendicitis"
print(result.confidence) # 0.73 (heuristic relevance, not a calibrated probability)
print(result.differentials) # [("appendicitis", 0.73), ("Diverticulitis", 0.55), ("crohn disease", 0.45)]
print(result.pathognomonic_findings) # [] (none of the matched findings are flagged pathognomonic here)
print(result.suggested_lookfor) # ["Appendiceal diameter >6 mm", "Appendicolith", "Diffusion restriction", ...]
API Reference
SemanticRadDict
The main class providing all lookup functionality.
findings_to_diagnosis(findings, modality=None, body_region=None, top_k=5)
Map a list of findings to likely diagnoses.
result = srd.findings_to_diagnosis(
findings=["ring-enhancing lesion", "periventricular"],
modality="MRI",
body_region="brain"
)
Returns: DiagnosisResult with:
primary_diagnosis: Most likely diagnosisconfidence: Heuristic relevance score in [0, 1] (relative ranking strength, not a calibrated probability)differentials: List of (diagnosis, confidence) tuplesmatching_findings: List of Finding objects that matchedpathognomonic_findings: List of pathognomonic finding namessuggested_lookfor: Additional findings to look for
get_findings_for_pathology(pathology, modality=None)
Get all known imaging findings for a disease/condition.
findings = srd.get_findings_for_pathology("appendicitis", modality="CT")
for f in findings:
print(f"{f.name} - Pathognomonic: {f.is_pathognomonic}")
get_differential(finding_pattern, modality=None, body_region=None)
Get differential diagnoses for a finding pattern.
ddx = srd.get_differential("ground glass opacity", modality="CT")
for d in ddx:
print(f"{d.presentation}: {d.differentials}")
get_imaging_sign(sign_name)
Look up a named imaging sign.
sign = srd.get_imaging_sign("whirlpool sign")
print(sign['indicates']) # "Volvulus (sigmoid, cecal) or midgut malrotation"
print(sign['differential']) # ["Sigmoid volvulus", "Cecal volvulus", ...]
print(sign['board_relevance']) # "HIGH"
expand_synonyms(term)
Get synonyms for a radiology term.
synonyms = srd.expand_synonyms("CT")
# ["computed tomography", "cat scan", "ct scan"]
synonyms = srd.expand_synonyms("hemorrhage")
# ["bleeding", "hematoma", "blood", "haemorrhage"]
get_classification(system, category=None)
Get ACR classification system information.
# Get all BI-RADS categories
birads = srd.get_classification("BI-RADS")
# Get specific category
birads_4 = srd.get_classification("BI-RADS", category="4")
print(birads_4[0]['malignancy_risk']) # "2-95%"
print(birads_4[0]['management']) # "Tissue diagnosis recommended"
get_measurement_threshold(query, modality=None, body_region=None)
Look up radiologic measurement thresholds.
thresholds = srd.get_measurement_threshold("spleen")
for t in thresholds:
print(f"{t.name}: {t.threshold_operator}{t.threshold_value}{t.unit}")
# Spleen length (splenomegaly threshold): >12cm
# Spleen length (massive splenomegaly): >20cm
# Filter by modality
thyroid = srd.get_measurement_threshold("thyroid", modality="US")
for t in thyroid:
print(f"{t.name}: {t.clinical_significance}")
get_mnemonic(mnemonic_name)
Look up a specific mnemonic.
m = srd.get_mnemonic("CHICAGO")
print(m.expansion)
# 'Crohn, Hernia, Intussusception, Cancer, Adhesions, Gallstone ileus, Obturation'
print(m.topic)
# 'Small bowel obstruction causes'
search_mnemonics(query, category=None, body_region=None)
Search mnemonics by topic or keyword.
# Find all neuro mnemonics
neuro = srd.search_mnemonics("", body_region="Neuro")
for m in neuro:
print(f"{m.mnemonic}: {m.topic}")
# Find mnemonics about T1 signal
t1_mnemonics = srd.search_mnemonics("T1")
get_syndrome_associations(syndrome)
Get imaging findings associated with a syndrome.
vhl = srd.get_syndrome_associations("VHL")
for a in vhl:
print(f"{a.associated_finding}: {a.frequency}")
# Hemangioblastoma (CNS): 60-80%
# Renal cell carcinoma (clear cell): 25-45%
# Pheochromocytoma: 10-20%
search_syndromes_by_finding(finding)
Find syndromes associated with a specific imaging finding.
syndromes = srd.search_syndromes_by_finding("cardiac myxoma")
for s in syndromes:
print(f"Consider: {s.syndrome_name}")
# Consider: Carney Complex
get_screening_recommendations(syndrome)
Get screening recommendations for a genetic syndrome.
recs = srd.get_screening_recommendations("TSC")
for r in recs:
print(f"{r['finding']}: {r['recommendation']}")
# SEGA: MRI every 1-3 years until age 25
# Renal angiomyolipoma: MRI abdomen every 1-3 years
stats()
Get statistics about loaded data.
print(srd.stats())
# {
# 'imaging_findings': 8332,
# 'medical_concepts': 2964,
# 'differential_groups': 361,
# 'classification_systems': 41,
# 'synonym_mappings': 718,
# 'imaging_signs': 69,
# 'measurement_thresholds': 25,
# 'mnemonics': 36,
# 'syndrome_associations': 61
# }
Use Cases
Clinical Decision Support
# Real-time finding interpretation
result = srd.findings_to_diagnosis(
["hepatic lesion", "arterial enhancement", "washout"],
modality="CT"
)
if "Hepatocellular carcinoma" in result.primary_diagnosis:
print("Consider LI-RADS classification")
lirads = srd.get_classification("LI-RADS")
Educational Applications
# Board exam preparation
sign = srd.get_imaging_sign("Hampton hump")
print(f"Sign: {sign['name']}")
print(f"Indicates: {sign['indicates']}")
print(f"Board relevance: {sign['board_relevance']}")
NLP Pipeline Enhancement
# Expand radiology terms for better text matching
terms = ["CT", "MRI", "tumor"]
expanded = []
for term in terms:
expanded.extend(srd.expand_synonyms(term))
# Now use expanded terms for text search/matching
Structured Reporting
# Auto-suggest differentials based on findings
findings = extract_findings_from_report(report_text) # Your NLP
ddx = srd.findings_to_diagnosis(findings, modality="CT")
print(f"Consider: {', '.join([d[0] for d in ddx.differentials[:3]])}")
Measurement Decision Support
# Check if a measurement triggers action
spleen_length = 14.5 # cm
thresholds = srd.get_measurement_threshold("spleen")
for t in thresholds:
if t.threshold_operator == ">" and spleen_length > t.threshold_value:
print(f"ALERT: {t.clinical_significance}")
print(f"Action: {t.action_if_met}")
Syndrome Workup Assistant
# Patient has a hemangioblastoma - check for syndromes
finding = "hemangioblastoma"
syndromes = srd.search_syndromes_by_finding(finding)
for s in syndromes:
print(f"Consider {s.syndrome_name}")
recs = srd.get_screening_recommendations(s.syndrome_name.split()[0])
for r in recs:
print(f" - Screen for: {r['finding']}")
Board Exam Study Tool
# Quiz yourself on mnemonics
import random
all_mnemonics = srd.search_mnemonics("")
m = random.choice(all_mnemonics)
print(f"What does {m.mnemonic} stand for?")
# User answers...
print(f"Answer: {m.expansion}")
print(f"Topic: {m.topic}")
Performance
- Initialization: ~100ms (one-time load)
- Lookups: <1ms per query
- Memory: ~50MB for full dictionary
License
MIT License - Free for commercial and non-commercial use.
Contributing
Contributions welcome! Please submit issues and pull requests on GitHub.
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 radiology_semantic_dict-1.4.0.tar.gz.
File metadata
- Download URL: radiology_semantic_dict-1.4.0.tar.gz
- Upload date:
- Size: 604.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d771960da669d726b674932dfaa136977a7d88b2dc7550d32a48f710cd2ba6f3
|
|
| MD5 |
11b35cd8ab3ab3fc0b58e7a5c67496bc
|
|
| BLAKE2b-256 |
d9abe0967ce91f6f165e0e08ddf6230341c266d8f37377a63b3d2785bfccaaf2
|
File details
Details for the file radiology_semantic_dict-1.4.0-py3-none-any.whl.
File metadata
- Download URL: radiology_semantic_dict-1.4.0-py3-none-any.whl
- Upload date:
- Size: 611.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6c8f5d75fbafe4c7706295bb199f640b14e1aea470c2957f82c6dc6f131894a
|
|
| MD5 |
4b10897e9ff46fa3fad5c691a6113c24
|
|
| BLAKE2b-256 |
c73321ced84076e88a54d62eec1c571b92a9e2b8a9ffe523979527c4ef3c5f00
|