ที่เก็บนี้มีรหัสของกระดาษต่อไปนี้:
@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}
}
โปรดค้นหา preprint ที่นี่: Ziletti และ D'Ambrosi, https://arxiv.org/abs/2403.09226
บทความนี้ได้รับการยอมรับที่ NAACL 2024 Workshop ทางคลินิก NLP (https://clinical-nlp.github.io/2024/)
โปรดอ้างอิงงานนี้หากคุณใช้รหัสนี้ในงานหรือการวิจัยของคุณ
นี่คือเวิร์กโฟลว์สรุปของขั้นตอน:
และนี่คือผลลัพธ์หลัก: 
โปรดดูต้นฉบับสำหรับรายละเอียดเพิ่มเติม: https://arxiv.org/abs/2403.09226
คู่ questions-sql ที่มีป้ายกำกับอยู่ในไฟล์ text2sql_epi_dataset_omop.xlsx ในโฟลเดอร์ชุด dataset
เราใช้ Python 3.11 ในการทดลองของเรา
ติดตั้งเวอร์ชันล่าสุดจาก Master Branch บน GitHub โดย:
git clone <GITHUB-URL>
cd text-to-sql-epi-ehr-naacl2024
pip install -r requirements.txt
ก่อนอื่นเราต้องสร้างไฟล์ดอง (ไลบรารีแบบสอบถาม) จากไฟล์ excel ที่มีให้ในโฟลเดอร์ชุด dataset
cd scripts
python run_querylib_calc.py
ไฟล์ดองนี้จะถูกใช้เพื่อดำเนินการสืบค้น Augmented Generation (RAG) ที่ขั้นตอนการสร้างแบบสอบถาม
ในการดำเนินการทำนายให้เรียกใช้สคริปต์ prediction_pipeline.py กับคำถามของคุณในคำพูดสองเท่า ตัวอย่างเช่น,
cd scripts
python prediction_pipeline.py --question "How many women with atopic dermatitis?"
สิ่งนี้ควรกลับมา:
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;
ในการดำเนินการแบบสอบถามคุณจะอยู่ที่นี่คือลิงก์ไปยังชุดข้อมูลบน Google Cloud: https://console.cloud.google.com/marketplace/product/hhs/synpuf คุณสามารถเปิดลิงค์ (จะต้องใช้บัญชี Google) และเรียกใช้การค้นหาในบัญชี Google ของคุณ
ในการทำให้แบบสอบถามดำเนินการบน Google BigQuery คุณจะต้องแก้ไขชื่อที่สร้างขึ้นของตารางเพื่อให้สอดคล้องกับชื่อตารางสอบถาม Google นี่เป็นเพียงการเปลี่ยนชื่อตาราง
ตัวอย่างเช่น,
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);
ต้องเปลี่ยนเป็น
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);
เพื่อทำงานบนอินสแตนซ์ BigQuery ด้านบน
หากคุณมีคลังข้อมูลเกล็ดหิมะของคุณเองคุณอาจไม่จำเป็นต้องทำการเปลี่ยนแปลงเหล่านั้น
ในพื้นที่เก็บข้อมูลเรามีรุ่นจำลองสำหรับการเข้ารหัสทางการแพทย์เพื่อแสดงว่าการเข้ารหัสทางการแพทย์สามารถรวมเข้ากับกระบวนการได้อย่างไรดังที่แสดงในรูปด้านบน การเข้ารหัสจะดำเนินการภายใน ontology Snomed เนื่องจากเป็น ontology พื้นฐานสำหรับข้อมูลที่เก็บไว้ในโมเดลข้อมูลทั่วไป OMOP (OMOP-CDM) ตารางมักจะเรียกว่า Concept_table ใน OMOP-CDM
เราเตรียมตารางจำลองขนาดเล็กในโฟลเดอร์ชุด dataset ที่เรียกว่า medcodes_mockup.xlsx ที่นี่เราให้ข้อมูลสังเคราะห์ตามโครงสร้างข้อมูลของ OMOP-CDM คุณสามารถดาวน์โหลดอภิปรัชญาทั้งหมดได้จากหอสมุดแห่งชาติการแพทย์ที่นี่ (โปรดทราบว่าคุณต้องยอมรับข้อกำหนดและเงื่อนไขของพวกเขา)
ข้อมูลเพิ่มเติมเกี่ยวกับ Snomed-CT สามารถพบได้ที่นี่
ก่อนอื่นเราต้องสร้างไฟล์ดอง (ไลบรารี medcodeonto) จากไฟล์ excel ที่ให้ไว้
cd scripts
python run_medcoding_calc.py
ไฟล์ดองนี้จะถูกใช้เพื่อค้นหารหัสทางการแพทย์ภายในไฟล์ Pickle การรันไฟล์จะให้ตัวอย่างของวิธีการเข้ารหัส
โปรดทราบว่านี่เป็นเพียงการใช้งานจำลอง สำหรับรุ่นพร้อมผลิตเราขอแนะนำให้ใช้ฐานข้อมูลเวกเตอร์ (เช่น QDrant) การจัดทำดัชนีตารางแนวคิดทั้งหมดเช่นจากฐานข้อมูลเกล็ดหิมะ
หลังจากเรียกใช้ขั้นตอน Medical coding compilation คุณพร้อมที่จะเรียกใช้ท่อเต็ม: SQL Query Generation + การเข้ารหัสทางการแพทย์
นี่คือตัวอย่าง:
cd scripts
python prediction_pipeline.py --med_coding True --question "How many females with atopic dermatitis"
สิ่งนี้จะกลับมา
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;
โปรดทราบว่าขั้นตอนการเข้ารหัสทางการแพทย์เป็นแบบอย่างที่นี่เท่านั้น เพื่อให้ได้ผลลัพธ์ที่เชื่อถือได้คุณจะต้องเข้าถึงออนโทโลจีแบบเต็มรูปแบบ (ดูส่วน Medical coding compilation )