Skip to content

Разработка сервиса для поиска похожих вопросов на медицинских форумах. (ML, MLE)

Notifications You must be signed in to change notification settings

FedorSafonov/Medical_QA

Repository files navigation

Сервис поиска похожих вопросов для медицинских форумов

Описание

Задача поиска похожих вопросов актуальна во многих областях, таких как онлайн-форумы, системы вопросов-ответов и чат-боты. Она позволяет пользователям быстро находить информацию, которая уже была обсуждена, избегая дублирования вопросов и повышая эффективность коммуникации.

Цель

Целью данного проекта является разработка сервиса для поиска похожих вопросов на медицинских форумах. Сервис поможет удержать пользователей на платформе и увеличить количество просмотров страниц, что в свою очередь повысит эффективность рекламных кампаний и улучшит общие показатели форумов.

Исходные данные

Для обучения и тестирования моделей используется датасет "medical_questions_pairs" от Hugging Face. Датасет содержит пары вопросов на английском языке, связанных с медицинской тематикой.

Методы

В проекте были использованы следующие методы и технологии:

  • Обработка естественного языка (NLP) для анализа и предобработки текстовых данных, включая токенизацию, лемматизацию и удаление стоп-слов.
  • Машинное обучение с использованием различных моделей NLP:
    • SentenceTransformers: all-mpnet-base-v2, all-MiniLM-L6-v2, all-MiniLM-L12-v2, paraphrase-multilingual-mpnet-base-v2, multi-qa-MiniLM-L6-cos-v1, all-distilroberta-v1, multi-qa-distilbert-cos-v1, multi-qa-mpnet-base-dot-v1.
    • Bag-of-Words: Классическая модель с использованием CountVectorizer из scikit-learn.
    • TF-IDF: Классическая модель с использованием TfidfVectorizer из scikit-learn.
    • Word2Vec: Модель для обучения word embeddings с использованием gensim.models.Word2Vec.
    • Universal Sentence Encoder (USE): Модель от Google для создания семантических представлений предложений.
  • FastAPI для создания микросервиса, предоставляющего функциональность поиска похожих вопросов.
  • Streamlit для разработки интерактивного веб-приложения для демонстрации работы сервиса.

Метрики оценки

Качество матчинга вопросов будет оцениваться с использованием следующих метрик:

  • Accuracy@5: Доля вопросов, для которых хотя бы один из 5 наиболее похожих предсказанных вопросов совпадает с истинным похожим вопросом. Ключевая метрика.
  • MRR@K (Mean Reciprocal Rank): Средний обратный ранг первого правильно предсказанного похожего вопроса.
  • DCG@K (Discounted Cumulative Gain): Метрика, которая учитывает не только наличие правильного ответа в топ-5, но и его позицию в списке.
  • AccuracyTriplet: Доля правильно классифицированных триплетов. Правильно классифицированный триплет - триплет, в котором косинусное сходство между заданным вопросом и истинным похожим вопросом больше, чем с не похожим.

Результаты

  • Результаты всех моделей представлены в таблицах ниже:
Модель Accuracy@5 MRR@5 DCG@5 AccuracyTriplet
SentenceTransformers (базовая - all-MiniLM-L6-v2) 0.9682 0.9039 0.9167 0.9482
SentenceTransformers (fine-tune CosineSimilarityLoss) 0.9242 0.8572 0.8657 0.9639
SentenceTransformers (fine-tune TripletLoss) 0.3320 0.2687 0.2805 0.8983
Bag-of-Words (без предобработки) 0.5686 0.4736 0.4879
Bag-of-Words (с предобработкой) 0.8036 0.6804 0.6968
TF-IDF (с предобработкой) 0.8619 0.7321 0.7469
Word2Vec (с предобработкой) 0.4355 0.3589 0.3710
USE (без предобработки) 0.8888 0.7894 0.8018
USE (с предобработкой) 0.8709 0.7615 0.7734
Метрики моделей SentenceTransformers
  model text_type Accuracy@5 MMR@5 DCG@5 time
0 all-mpnet-base-v2 Изначальный 96.82% 90.94% 91.67% 655.86
1 all-MiniLM-L6-v2 Изначальный 96.36% 90.39% 90.94% 119.97
2 all-MiniLM-L12-v2 Изначальный 95.87% 90.13% 90.75% 221.17
3 multi-qa-distilbert-cos-v1 Изначальный 95.60% 89.95% 90.57% 298.25
4 multi-qa-MiniLM-L6-cos-v1 Изначальный 95.83% 88.83% 89.49% 119.93
5 multi-qa-mpnet-base-dot-v1 Изначальный 95.24% 88.55% 89.37% 647.01
6 all-distilroberta-v1 Изначальный 94.78% 87.23% 88.05% 301.65
7 paraphrase-multilingual-mpnet-base-v2 Изначальный 91.96% 84.95% 85.82% 601.49
8 multi-qa-distilbert-cos-v1 Предобработаный 92.91% 83.69% 84.59% 239.22
9 all-MiniLM-L6-v2 Предобработаный 93.27% 83.41% 84.27% 133.37
10 all-MiniLM-L12-v2 Предобработаный 92.55% 83.05% 83.87% 265.13
11 multi-qa-MiniLM-L6-cos-v1 Предобработаный 92.41% 82.88% 83.67% 181.84
12 paraphrase-MiniLM-L3-v2 Изначальный 92.16% 82.24% 83.21% 70.26
13 all-distilroberta-v1 Предобработаный 91.63% 81.60% 82.50% 231.91
14 paraphrase-multilingual-mpnet-base-v2 Предобработаный 89.79% 80.78% 81.79% 493.40
15 all-mpnet-base-v2 Предобработаный 91.07% 80.77% 81.75% 457.85
16 multi-qa-mpnet-base-dot-v1 Предобработаный 90.34% 80.60% 81.64% 513.54
17 paraphrase-MiniLM-L3-v2 Предобработаный 90.71% 79.94% 80.94% 80.79

Цветная версия Цветная версия

Выбор модели

Для построения приложения Streamlit и микросервиса FastAPI была выбрана базовая предобученная модель SentenceTransformers all-MiniLM-L6-v2, так как она показала наилучший баланс между качеством и скоростью работы. Эта модель обеспечивает высокую точность и при этом достаточно быстра для использования в интерактивном приложении и API.

Приложение Streamlit

Ссылка на веб приложение

Приложение Streamlit позволяет пользователю ввести вопрос и получить список из 5 наиболее похожих вопросов из базы данных. Сходство между вопросами отображается в процентах.

Инструкции по использованию:

  • Открыть приложение по ссылке
  • Выбрать язык (по умолчанию - Русский)
  • Ввести вопрос на английском языке в поле "Введите ваш вопрос"
  • Нажать на кнопку "Найти похожие вопросы"

Результат:

  • 5 похожих вопросов на английском языке со степенью сходства в скобках.

Скриншот приложения: image 1

Микросервис FastAPI

Микросервис FastAPI предоставляет API для поиска похожих вопросов. API имеет один endpoint /similar_questions, который принимает на вход вопрос в виде строки и возвращает JSON список похожих вопросов и их оценок сходства.

Инструкции по использованию:

    1. Скачать файлы 'download_model.py', 'idx2emb.pkl', 'idx2sen.pkl', 'app.py', 'requirements.txt'.
    1. Установить зависимости:
    pip install -r requirements.txt
    1. Загрузить модель:
    python download_model.py

    Или скачать директорию model.

    1. Запуститm API FastAPI:
    uvicorn app:app --reload
    1. Тестирование:

    Открыть адрес http://127.0.0.1:8000/docs в браузере. Здесь можно увидеть интерактивную документацию Swagger UI, которая позволяет отправлять запросы к API и просматривать ответы.

Внешний вид документации. alt text

Ввод конкретного запроса в браузере. alt text

Итоги

  • Создано приложение Streamlit.
  • Создан приложение FastAPI
  • Основные выводы: В ходе проекта были исследованы различные подходы к поиску похожих вопросов, включая классические модели (Bag-of-Words, TF-IDF) и модели на основе глубокого обучения (SentenceTransformers, Word2Vec, USE). Результаты показали, что модели SentenceTransformers и USE обеспечивают наилучшее качество, а предобработка текста значительно улучшает качество классических моделей. Fine-tuning моделей SentenceTransformers может как улучшить, так и ухудшить качество, в зависимости от выбранной loss-функции и параметров обучения.
  • Дальнейшее развитие: Проект может быть развит в следующих направлениях:
    • Использование других моделей: Можно попробовать использовать другие модели, такие как Graph Neural Networks, модели Question Answering или модели Paraphrase Detection.
    • Увеличение размера датасета: Обучение моделей на большем датасете может улучшить их качество и обобщающую способность.
    • Улучшение предобработки текста: Можно попробовать использовать более сложные методы предобработки текста, такие как нормализация, стемминг или учет синтаксической структуры предложений.
    • Fine-tuning моделей: Можно провести более глубокое исследование fine-tuning моделей SentenceTransformers, экспериментируя с различными loss-функциями, параметрами обучения и методами отбора данных.
    • Разработка более сложного интерфейса: Можно добавить в приложение Streamlit возможности фильтрации, сортировки, пагинации и другие функции, которые улучшат пользовательский опыт.
    • Интеграция с другими сервисами: API FastAPI может быть интегрирован с другими сервисами, такими как чат-боты, системы вопросов-ответов или поисковые системы.

Cтатус:

Завершён.

Стэк:

Python, ML, MLE, NLP, pandas, numpy, FastAPI, Streamlit, SentenceTransformers, spacy, Word2Vec, scipy, torch, sklearn, matplotlib, pickle

Ссылки

About

Разработка сервиса для поиска похожих вопросов на медицинских форумах. (ML, MLE)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published