يحتوي هذا المستودع على رمز الورقة التالية:
@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 السريرية NLP (https://clinical-nlp.github.io/2024/)
يرجى الاستشهاد بهذا العمل إذا كنت تستخدم هذا الرمز في عملك أو بحثك.
فيما يلي سير عمل موجز للإجراء:
وهنا النتائج الرئيسية: 
يرجى الرجوع إلى المخطوطة لمزيد من التفاصيل: https://arxiv.org/abs/2403.09226
توجد أزواج السؤال المسمى في ملف text2sql_epi_dataset_omop.xlsx في مجلد dataset .
استخدمنا Python 3.11 في تجاربنا.
قم بتثبيت أحدث إصدار من الفرع الرئيسي على Github بواسطة:
git clone <GITHUB-URL>
cd text-to-sql-epi-ehr-naacl2024
pip install -r requirements.txt
أولاً ، نحتاج إلى إنشاء ملف Pickle (مكتبة الاستعلام) من ملف Excel المتوفر في مجلد dataset
cd scripts
python run_querylib_calc.py
سيتم استخدام ملف المخلل هذا لإجراء الجيل المعزز للاسترجاع (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 أعلاه.
إذا كان لديك مستودع بيانات ندفة الثلج الخاصة بك ، فقد لا تحتاج إلى إجراء هذه التغييرات.
في المستودع ، نقدم نسخة نموذجية للترميز الطبي لإظهار كيف يمكن دمج الترميز الطبي في هذه العملية ، كما هو موضح في الشكل أعلاه. يتم تنفيذ الترميز داخل الأنطولوجيا المذهلة ، لأن هذا هو الأنطولوجيا الأساسية للبيانات المخزنة في نموذج البيانات المشترك OMOP (OMOP-CDM). عادة ما يطلق على الجدول مفهوم _table في OMOP-CDM.
لقد أعدنا جدولًا صغيرًا للنماذج في مجلد dataset يسمى medcodes_mockup.xlsx . نحن هنا نقدم البيانات الاصطناعية بعد بنية بيانات OMOP-CDM. يمكنك تنزيل الأنطولوجيا بأكملها من المكتبة الوطنية للطب هنا. (يرجى ملاحظة أنك بحاجة إلى قبول شروطهم وأحكامهم)
يمكن العثور على مزيد من المعلومات حول Snomed-CT على سبيل المثال هنا
أولاً ، نحتاج إلى إنشاء ملف Pickle (مكتبة MedCodeonto) من ملف Excel المقدم
cd scripts
python run_medcoding_calc.py
ثم سيتم استخدام ملف المخلل هذا للبحث عن الرموز الطبية داخل ملف المخلل. سيقدم تشغيل الملف أيضًا مثالًا على كيفية تنفيذ الترميز.
لاحظ أن هذا ليس سوى تطبيق نموذج. للحصول على إصدار جاهز للإنتاج ، نقترح استخدام قاعدة بيانات متجه (على سبيل المثال 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 ).