یک سرویس میکروسرویس حرفهای مبتنی بر FastAPI برای تحلیل برچسبهای ساختاریافته دارویی (SPL) و شناسایی تعاملات و تداخلات دارویی.
🎯 هدف و کاربرد
کتابخانه Rakhshai-Drug Interaction LabelCheck این امکان را فراهم میکند که با ارسال اسامی داروها، بهطور خودکار برچسبهای ساختاریافته (SPL) را بررسی کرده و تعاملات دارویی بالقوه را تشخیص دهد.
این ابزار برای توسعهدهندگان دارویی، پژوهشگران سلامت دیجیتال، سامانههای تجمیع داده و اپلیکیشنهایی که نیاز دارند بدانند دو دارو در کنار هم تداخل دارند یا نه، مفید است.
با توجه به اینکه نامهای برند و ژنریک ممکن است متفاوت باشند، این سیستم ابتدا ورودیهای دارویی را به شناسههای RxNorm (RXCUI) نگاشت میکند تا تحلیل یکپارچه انجام شود. سپس بخشهای مناسب از برچسب دارویی را استخراج کرده، با روشهای پردازش زبان طبیعی (NLP) تحلیل میکند و ارزیابی تعامل را ارائه میدهد.
همچنین اگر دادهای از openFDA در دسترس نباشد، به طور خودکار از DailyMed به عنوان جایگزین استفاده میکند تا از پوشش بهتر داده اطمینان حاصل شود.
⚠️ توجه: دادههای openFDA ممکن است همیشه بهروز نباشند و این سرویس نباید مستقیماً برای تصمیمگیری پزشکی استفاده شود. استفاده از آن به عنوان ابزار کمکی و در کنار نظر متخصص توصیه میشود.
در مخزن نیز همین هشدار آمده است.
📘 معرفی کوتاه: openFDA و DailyMed
openFDA یک رابط برنامهنویسی (API) عمومی است که دادههای عمومی سازمان FDA آمریکا درباره داروها، دستگاههای پزشکی و غذاها را در قالبی ساختیافته و قابل جستجو در اختیار توسعهدهندگان، محققان و عموم قرار میدهد. U.S. Food and Drug Administration+2PMC+2
با استفاده از openFDA میتوان برچسبهای دارویی (labeling)، گزارشهای عوارض جانبی، فراخوانها (recall) و بسیاری منبع دادهای دیگر را مستقیماً دریافت کرد. open.fda.gov+2U.S. Food and Drug Administration+2
DailyMed سرویس تحت مدیریت کتابخانه ملی پزشکی ایالات متحده است که متن کامل و بهروز برچسب دارویی (prospectus / package insert) داروهای تایید شده را منتشر میکند. DailyMed+2support.nlm.nih.gov+2
داروها در DailyMed از طریق قالب SPL (Structured Product Labeling) نمایهسازی میشوند که هم شامل متن خوانا برای کاربران است و هم دادههای ساختیافته مانند ترکیب، دوز، نام مواد فعال و غیره. DailyMed+3National Library of Medicine+3support.nlm.nih.gov+3
همچنین DailyMed امکان دسترسی به نسخههای مختلف برچسب، تاریخچه تغییرات و دانلود فایلهای مرتبط را از طریق وبسرویسهای REST فراهم میکند.
🔍 ویژگیها و مزایای کلیدی
- معماری مدرن FastAPI با ساختاری ماژولار و مستندات API کامل
- عملکرد بالا با استفاده از I/O غیرهمزمان (asynchronous) و توانایی پاسخگویی همزمان
- نگاشت هوشمند نامهای دارویی (برند یا ژنریک) به RXCUI با استفاده از RxNorm و کش برای کاهش فراخوانیهای مکرر
- استخراج پرسشهای تعامل خاص از بخشهای مرتبط در برچسب دارویی با استفاده از NLP (spaCy با تشخیص جملات، تشخیص نفی و …)
- امتیازدهی مبتنی بر شواهد: هر جمله بررسی شده امتیاز اعتماد (confidence) میگیرد و تعاملات برگشتپذیر هستند
- پشتیبانی از fallback به DailyMed در صورت عدم موفقیت openFDA
- لاگینگ، مانیتورینگ و نمایش آمار (metrics) از طریق endpoint اختصاصی برای پیگیری عملکرد و خطاها
- آماده استقرار (Docker-ready) و تست شده با چارچوب pytest
📂 ساختار پروژه
ساختار کلی پروژه به این صورت است:
Rakhshai-Drug Interaction LabelCheck/
├── app/
│ ├── interaction_checker.py ← منطق اصلی نگاشت و تحلیل تعامل
│ └── main.py ← اپلیکیشن FastAPI، routing، مانیتورینگ
├── manual_tests/ ← مجموعهای از درخواستهای تست دستی
├── tests/ ← تستهای خودکار با pytest
├── requirements.txt ← وابستگیهای پایتونی
├── README.md ← مستندات پروژه
└── LICENSE.md ← مجوز MIT
همچنین اسکریپتی برای ارزیابی دقت (evaluate_accuracy.py) وجود دارد که سطح دقت تشخیص تعامل را بدون مدل NLP بررسی میکند و نشان داده است که در سناریوهای آزمایشی، عملکرد rule-based برابر با مدل-backed بوده است.
لینک دسترسی به کتابخانه : Rakhshai-Drug-Interaction-LabelCheck
🚀 شروع به کار
- مخزن را کلون کن:
git clone https://github.com/bazpardazesh-org/Rakhshai-Drug-Interaction-LabelCheck.git
cd Rakhshai-Drug-Interaction-LabelCheck
وابستگیها را نصب کن:
pip install -r requirements.txt
مدل spaCy مناسب را دانلود کن (برای دقت بهتر):
python -m spacy download en_core_sci_sm
# یا fallback به en_core_web_sm
سرور API را اجرا کن:
uvicorn app.main:app --host 0.0.0.0 --port 8000
تستهای خودکار را اجرا کن:
pytest
📦 نمونه درخواست و پاسخ
درخواست نمونه:
POST /check
{
"drugs": ["amiodarone", "fluconazole", "metformin"]
}
پاسخ موفق:
{
"input_drugs": ["amiodarone", "fluconazole", "metformin"],
"interactions": [
{
"pair": ["amiodarone", "fluconazole"],
"has_interaction": true,
"max_confidence": 0.8,
"evidence": [
{
"pair": ["amiodarone", "fluconazole"],
"sentence": "amiodarone may increase the serum concentration of fluconazole...",
"confidence": 0.8,
"triggered": true,
"class_derived": false,
"negated": false,
"provenance": {
"set_id": "1b4…",
"label_date": "20230101",
"section_name": "drug_interactions",
"url": "https://dailymed.nlm.nih.gov/…"
}
}
]
}
],
"metrics": {
"requests_total": 1,
"rxnorm_cache_hits": 0
},
"version": "1.1.0"
}
در صورت خطا، پاسخهایی مانند 400 Bad Request (برای ورودی نامعتبر)، 404 Not Found (اگر نام دارو به RXCUI تبدیل نشود یا بخش تعامل موجود نباشد)، 429 Too Many Requests (بهدلیل محدودیت API) یا 503 Service Unavailable (در صورت خطا در APIهای خارجی) داده میشود.
🛠 موارد کاربرد پیشنهادی
- افزونه یا ماژول در پلتفرمهای سلامت دیجیتال برای هشدار تعاملات دارویی
- ابزار پشتیبان در مراکز تحقیقاتی یا دانشگاهی برای تحلیل دادههای دارویی
- یک سرویس افزوده در سیستمهای الکترونیک سلامت (EHR / EMR)
- کاربرد در اپلیکیشنهای تلفن همراه حوزه سلامت برای بررسی ساده تداخل دارویی
- ادغام با چتباتها و سامانههای هوشمند مشاوره سلامت