Repositori ini berisi kode dari makalah berikut:
@misc{ziletti2024retrieval,
title={Retrieval augmented text-to-SQL generation for epidemiological question answering using electronic health records},
author={Angelo Ziletti and Leonardo D'Ambrosi},
year={2024},
eprint={2403.09226},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
Silakan temukan preprint di sini: Ziletti dan D'Ambrosi, https://arxiv.org/abs/2403.09226
Makalah ini diterima di NAACL 2024 Clinical NLP Workshop (https://clinical-nlp.github.io/2024/)
Harap kutip pekerjaan ini jika Anda menggunakan kode ini dalam pekerjaan atau riset Anda.
Berikut ini adalah alur kerja ringkasan dari prosedur ini:
Dan inilah hasil utamanya: 
Silakan merujuk ke naskah untuk detail lebih lanjut: https://arxiv.org/abs/2403.09226
Pasangan pertanyaan-sql berlabel ada di file text2sql_epi_dataset_omop.xlsx di folder dataset .
Kami menggunakan Python 3.11 dalam percobaan kami.
Instal versi terbaru dari cabang master di github oleh:
git clone <GITHUB-URL>
cd text-to-sql-epi-ehr-naacl2024
pip install -r requirements.txt
Pertama, kita perlu membuat file acar (perpustakaan kueri) dari file Excel yang disediakan di folder dataset
cd scripts
python run_querylib_calc.py
File acar ini kemudian akan digunakan untuk melakukan pengambilan augmented generasi (RAG) pada tahap generasi kueri.
Untuk melakukan prediksi, jalankan prediction_pipeline.py dengan pertanyaan Anda dalam kutipan ganda. Misalnya,
cd scripts
python prediction_pipeline.py --question "How many women with atopic dermatitis?"
Ini harus kembali:
Question: How many women with atopic dermatitis?
SQL template:
SELECT COUNT(DISTINCT p.person_id) AS female_patients_with_atopic_dermatitis
FROM condition_occurrence AS co
JOIN person AS p ON co.person_id = p.person_id
WHERE co.condition_concept_id IN ([condition@atopic dermatitis])
AND p.gender_concept_id = 8532;
Untuk menjalankan kueri, Anda akan di sini adalah tautan ke dataset di Google Cloud: https://console.cloud.google.com/marketplace/product/hhs/synpuf Anda kemudian dapat membuka tautan (akan memerlukan akun Google), dan menjalankan kueri di akun Google Anda.
Untuk membuat kueri dapat dieksekusi di Google BigQuery, Anda perlu memodifikasi nama tabel yang dihasilkan untuk mematuhi nama tabel Query Google. Ini hanyalah penggantian nama tabel.
Misalnya,
SELECT COUNT(DISTINCT p.person_id) AS female_patients_with_atopic_dermatitis
FROM person AS p
JOIN condition_occurrence AS co ON p.person_id = co.person_id
JOIN concept AS c ON co.condition_concept_id = c.concept_id
WHERE p.gender_concept_id = 8532
AND c.concept_id IN (133834,4298597,4066382,4298599,4296193,4080929,4296192,4290738,4290734,4206125,4290736,4080928,4033671,4031630,4297478,4296190,4031631,4080927,4298598,4298601,4031013,4297362,4290740,4297495,40482226,4298600,4236759);
harus diubah menjadi
SELECT
COUNT(DISTINCT p.person_id) AS female_patients_with_atopic_dermatitis
FROM `bigquery-public-data.cms_synthetic_patient_data_omop.person` AS p
JOIN `bigquery-public-data.cms_synthetic_patient_data_omop.condition_occurrence` AS co ON p.person_id = co.person_id
JOIN `bigquery-public-data.cms_synthetic_patient_data_omop.concept` AS c ON co.condition_concept_id = c.concept_id
WHERE p.gender_concept_id = 8532
AND c.concept_id IN (133834,4298597,4066382,4298599,4296193,4080929,4296192,4290738,4290734,4206125,4290736,4080928,4033671,4031630,4297478,4296190,4031631,4080927,4298598,4298601,4031013,4297362,4290740,4297495,40482226,4298600,4236759);
Untuk menjalankan pada contoh BigQuery di atas.
Jika Anda memiliki gudang data kepingan salju sendiri, Anda mungkin tidak perlu melakukan perubahan itu.
Dalam repositori, kami menyediakan versi mockup untuk pengkodean medis untuk menunjukkan bagaimana pengkodean medis dapat diintegrasikan dalam proses, seperti yang ditunjukkan pada gambar di atas. Pengkodean dilakukan dalam ontologi SNOMED, karena itu adalah ontologi yang mendasari data yang disimpan dalam model data umum OMOP (OMOP-CDM). Tabel biasanya disebut Concept_table di OMOP-CDM.
Kami menyiapkan tabel mockup kecil di folder dataset yang disebut medcodes_mockup.xlsx . Di sini kami menyediakan data sintetis mengikuti struktur data OMOP-CDM. Anda dapat mengunduh seluruh ontologi dari Perpustakaan Kedokteran Nasional di sini. (Harap dicatat bahwa Anda perlu menerima syarat dan ketentuan mereka)
Informasi lebih lanjut tentang Snomed-CT dapat ditemukan misalnya di sini
Pertama, kita perlu membuat file acar (perpustakaan medcodeonto) dari file excel yang disediakan
cd scripts
python run_medcoding_calc.py
File acar ini kemudian akan digunakan untuk mencari kode medis dalam file acar. Menjalankan file juga akan memberikan contoh bagaimana pengkodean dilakukan.
Perhatikan bahwa ini hanya implementasi mockup. Untuk versi yang siap-produksi, kami sarankan untuk menggunakan database vektor (misalnya Qdrant), mengindeks seluruh tabel konsep misalnya dari database kepingan salju.
Setelah menjalankan langkah Medical coding compilation , Anda siap menjalankan pipa lengkap: SQL Query Generation + Medical Coding.
Ini adalah contoh:
cd scripts
python prediction_pipeline.py --med_coding True --question "How many females with atopic dermatitis"
Ini akan kembali
Use medical coding: True
Use Snowflake database: False
No sentence-transformers model found with name BAAI/bge-large-en-v1.5. Creating a new one with MEAN pooling.
Question: How many females with atopic dermatitis
SQL template:
SELECT COUNT(DISTINCT p.person_id) AS female_patients_with_atopic_dermatitis
FROM condition_occurrence AS co
JOIN person AS p ON co.person_id = p.person_id
WHERE co.condition_concept_id IN ([condition@atopic dermatitis])
AND p.gender_concept_id = 8532;
Loading embedding from C:UsersGKENYOneDrive - BayerPersonal Dataascenttext-to-sql-epi-ehr-naacl2024data_outmedcodes_onto.pkl
Retrieved codes: {'atopic dermatitis': [{'Score': 0.8221014142036438, 'CONCEPT_NAME': 'Dermatitis in children', 'CONCEPT_ID': 4296192, 'DOMAIN_ID': 'Condition', 'VOCABULARY_ID': 'SNOMED', 'STANDARD_CONCEPT': 'S', 'CONCEPT_CODE': 402196005}, {'Score': 0.8056577444076538, 'CONCEPT_NAME': 'Widespread dermatitis', 'CONCEPT_ID': 4298597, 'DOMAIN_ID': 'Condition', 'VOCABULARY_ID': 'SNOMED', 'STANDARD_CONCEPT': 'S', 'CONCEPT_CODE': 402186001}, {'Score': 0.7999188899993896, 'CONCEPT_NAME': 'Early childhood dermatitis', 'CONCEPT_ID': 4298599, 'DOMAIN_ID': 'Condition', 'VOCABULARY_ID': 'SNOMED', 'STANDARD_CONCEPT': 'S', 'CONCEPT_CODE': 402195009}, {'Score': 0.7992758750915527, 'CONCEPT_NAME': 'Facial dermatitis', 'CONCEPT_ID': 4298598, 'DOMAIN_ID': 'Condition', 'VOCABULARY_ID': 'SNOMED', 'STANDARD_CONCEPT': 'S', 'CONCEPT_CODE': 402192007}]}
Please note that the medical coding is based on a mockup ontology. Results will not be reliable
SQL filled:
SELECT COUNT(DISTINCT p.person_id) AS female_patients_with_atopic_dermatitis
FROM condition_occurrence AS co
JOIN person AS p ON co.person_id = p.person_id
WHERE co.condition_concept_id IN (4296192,4298597,4298599,4298598)
AND p.gender_concept_id = 8532;
Harap dicatat bahwa langkah pengkodean medis hanya contoh di sini. Untuk mendapatkan hasil yang dapat diandalkan, Anda harus memiliki akses ke ontologi snomed penuh (lihat bagian Medical coding compilation ).