Files
doczyai-pipelines/fieldExtraction/constants/constants.py
T
Alex Galarce 674add9a3e Merged in feature/black-and-isort (pull request #717)
Feature/black and isort

* black and isort constants

* black and isort codes

* black and isort crosswalks

* black and isort investment

* black and isort prompts

* isort testbed

* isort tracking

* black and isort utils

* poetry and black tests


Approved-by: Katon Minhas
2025-09-30 20:56:02 +00:00

298 lines
10 KiB
Python

from sentence_transformers import SentenceTransformer
from src.crosswalk.crosswalk_builder import CrosswalkBuilder
from src.crosswalk.list_builder import ListBuilder
from constants.embedding import CodeEmbedding
class Constants:
"""Class to manage all constants and mappings for a Doczy.ai execution"""
def __init__(self):
#################################### Dynamic and Exhibit-Level ####################################
# Dynamic Primary
self.CROSSWALK_LOB = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_lob.json"
)
self.VALID_LOBS = list(self.CROSSWALK_LOB.mapping.keys())
self.CROSSWALK_PROGRAM = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_program.json"
)
self.VALID_PROGRAMS = list(self.CROSSWALK_PROGRAM.mapping.keys())
self.CROSSWALK_NETWORK = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_network.json"
)
self.VALID_NETWORKS = list(self.CROSSWALK_NETWORK.mapping.keys())
self.CROSSWALK_PRODUCT = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_product_lob.json"
)
self.VALID_PRODUCTS = list(self.CROSSWALK_PRODUCT.mapping.keys())
# Dynamic Codes
self.CROSSWALK_PROV_SPECIALTY_CD = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_provider_specialty.json"
)
self.VALID_PROV_SPECIALTY = list(
self.CROSSWALK_PROV_SPECIALTY_CD.mapping.keys()
)
self.CROSSWALK_BILL_TYPE_CD = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_bill_type.json"
)
self.VALID_BILL_TYPE = list(set(self.CROSSWALK_BILL_TYPE_CD.mapping.values()))
self.CROSSWALK_PLACE_OF_SERVICE_CD = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_place_of_service.json"
)
self.VALID_PLACE_OF_SERVICE = list(
self.CROSSWALK_PLACE_OF_SERVICE_CD.mapping.keys()
)
self.CROSSWALK_CLAIM_TYPE_CD = CrosswalkBuilder().from_json(
path="constants/mappings/crosswalk_claim_type.json"
)
self.VALID_CLAIM_TYPE = list(set(self.CROSSWALK_BILL_TYPE_CD.mapping.keys()))
# Provider Type
self.LIST_VALID_PROV_TYPE = (
ListBuilder().from_json("constants/lists/valid_prov_type.json").list
)
#################################### Code Breakout ####################################
self.SYNONYM_MAP = (
CrosswalkBuilder()
.from_json(path="constants/mappings/synonym_map.json")
.mapping
)
self.STOP_WORD_LIST = (
ListBuilder().from_json("constants/lists/stop_words.json").list
)
self.DO_NOT_RUN = (
ListBuilder().from_json("constants/lists/do_not_run.json").list
)
self.REMOVAL_LIST = self._load_removal_list()
# Code Crosswalks
self.CPT_LEVEL1_MAPPING = (
CrosswalkBuilder()
.from_excel(
"constants/mapping_csvs/proc_cd/cpt_level1.csv", "Code", "Description"
)
.mapping
)
self.CPT_LEVEL2_MAPPING = (
CrosswalkBuilder()
.from_excel(
"constants/mapping_csvs/proc_cd/cpt_level2.csv", "Code", "Description"
)
.mapping
)
# self.CPT_LEVEL3_MAPPING = CrosswalkBuilder().from_excel("constants/mapping_csvs/proc_cd/cpt_level3.csv", "Code", "Description").mapping
self.HCPCS_LEVEL1_MAPPING = (
CrosswalkBuilder()
.from_excel(
"constants/mapping_csvs/proc_cd/hcpcs_level1.csv", "Code", "Description"
)
.mapping
)
self.HCPCS_LEVEL2_MAPPING = (
CrosswalkBuilder()
.from_excel(
"constants/mapping_csvs/proc_cd/hcpcs_level2.csv", "Code", "Description"
)
.mapping
)
# self.HCPCS_MAPPING = CrosswalkBuilder().from_excel("constants/mapping_csvs/proc_cd/hcpcs.csv", "Code", "Description").mapping
self.REV_LEVEL1_MAPPING = (
CrosswalkBuilder()
.from_excel(
"constants/mapping_csvs/rev_cd/rev_level1.csv", "Code", "Description"
)
.mapping
)
self.REV_MAPPING = (
CrosswalkBuilder()
.from_excel("constants/mapping_csvs/rev_cd/rev.csv", "Code", "Description")
.mapping
)
self.GROUPER_APR_DRG_MAPPING = (
CrosswalkBuilder()
.from_excel(
"constants/mapping_csvs/grouper_cd/drg_mapping_apr-drg.csv",
"Code",
"Description",
)
.mapping
)
self.GROUPER_MS_DRG_MAPPING = (
CrosswalkBuilder()
.from_excel(
"constants/mapping_csvs/grouper_cd/drg_mapping_ms-drg.csv",
"Code",
"Description",
)
.mapping
)
self.BILL_TYPE_MAPPING = (
CrosswalkBuilder()
.from_json("constants/mappings/crosswalk_bill_type.json")
.mapping
)
self.BILL_TYPE_REVERSE_MAPPING = (
CrosswalkBuilder()
.from_json("constants/mappings/crosswalk_bill_type.json")
.create_reverse_mapping()
)
# Embedding Model
self.EMBEDDING_MODEL = SentenceTransformer("all-roberta-large-v1")
# Embeddings
self.CPT_LEVEL1_EMBEDDING = CodeEmbedding("cpt_level1")
self.CPT_LEVEL2_EMBEDDING = CodeEmbedding("cpt_level2")
# self.CPT_LEVEL3_EMBEDDING = CodeEmbedding("cpt_level3")
self.HCPCS_LEVEL1_EMBEDDING = CodeEmbedding("hcpcs_level1")
self.HCPCS_LEVEL2_EMBEDDING = CodeEmbedding("hcpcs_level2")
self.REV_LEVEL1_EMBEDDING = CodeEmbedding("rev_level1")
self.REV_EMBEDDING = CodeEmbedding("rev")
#################################### Methodology Breakout ####################################
self.VALID_AARETE_DERIVED_FEE_SCHEDULE = (
ListBuilder().from_json(path="constants/lists/valid_fee_schedule.json").list
)
self.VALID_AARETE_DERIVED_FEE_SCHEDULE_VERSION = (
ListBuilder()
.from_json(path="constants/lists/valid_fee_schedule_version.json")
.list
)
self.VALID_REIMB_METHODOLOGY = (
ListBuilder()
.from_json(path="constants/lists/valid_reimb_methodology.json")
.list
)
self.VALID_UNIT_OF_MEASURE = (
ListBuilder()
.from_json(path="constants/lists/valid_unit_of_measure.json")
.list
)
self.VALID_CARVEOUTS = (
CrosswalkBuilder()
.from_json(path="constants/mappings/valid_carveouts.json")
.mapping
)
#################################### Other ####################################
self.COMPOUND_INDICATORS = (
ListBuilder()
.from_json(path="constants/lists/compound_indicators.json")
.list
)
self.EXHIBIT_HEADER_MARKERS = (
ListBuilder()
.from_json(path="constants/lists/exhibit_header_markers.json")
.list
)
def _load_removal_list(self):
return [
v.upper()
for v in self.VALID_LOBS
+ self.VALID_PRODUCTS
+ list(
set(
CrosswalkBuilder()
.from_json(path="constants/mappings/crosswalk_network.json")
.mapping.values()
)
)
+ self.VALID_CLAIM_TYPE
+ list(
set(
CrosswalkBuilder()
.from_json(path="constants/mappings/crosswalk_program.json")
.mapping.values()
)
)
+ ["INPATIENT", "OUTPATIENT", "IN-PATIENT", "OUT-PATIENT", "IP", "OP"]
+ [
"COVERED SERVICES",
"SERVICES",
"PROCEDURES",
"CONTRACTED",
"HEALTHCARE",
"HEALTH CARE",
"ALL OTHER",
"PER DIEM",
"ADMISSION",
"REIMBURSEMENT",
"ADDITIONAL PAYMENT",
"PAYMENT",
"RATE",
"FEE SCHEDULE",
"METHODOLOGY",
"OUTLIER",
"INTERMEDIATE",
"READMISSION",
"ACUTE",
"OPPS",
"FEE-FOR-SERVICE",
"PROGRAM",
"PRODUCT",
] # Generic Terms not found in any of the proc code mappings
]
def get_embedding(self, level: str):
"""
Returns the CodeEmbedding attribute corresponding to the given level.
Args:
level (str): The embedding level identifier (e.g., "rev", "cpt_level1").
Returns:
CodeEmbedding: The matching embedding object, or None if not found.
"""
level_map = {
# Revenue code embeddings
"rev": self.REV_EMBEDDING,
"rev_level1": self.REV_LEVEL1_EMBEDDING,
# CPT code embeddings
"cpt_level1": self.CPT_LEVEL1_EMBEDDING,
"cpt_level2": self.CPT_LEVEL2_EMBEDDING,
# "cpt_level3": self.CPT_LEVEL3_EMBEDDING, # Uncomment if needed
# HCPCS code embeddings
"hcpcs_level1": self.HCPCS_LEVEL1_EMBEDDING,
"hcpcs_level2": self.HCPCS_LEVEL2_EMBEDDING,
}
return level_map.get(level)
def get_constant(self, attr_name: str):
"""
Returns the value of a constant attribute by its string name.
Args:
attr_name (str): The name of the constant attribute to retrieve.
Returns:
The value of the requested attribute, or None if the attribute doesn't exist.
Example:
constants.get_constant("VALID_BILL_TYPE") will return the VALID_BILL_TYPE list.
"""
if not isinstance(attr_name, str):
return None
if hasattr(self, attr_name):
return getattr(self, attr_name)
return None