- Полный отчёт по проекту можно посмотреть в report.md
- Ссылка на веб приложение в streamlit
Задача поиска похожих вопросов актуальна во многих областях, таких как онлайн-форумы, системы вопросов-ответов и чат-боты. Она позволяет пользователям быстро находить информацию, которая уже была обсуждена, избегая дублирования вопросов и повышая эффективность коммуникации.
Целью данного проекта является разработка сервиса для поиска похожих вопросов на медицинских форумах. Сервис поможет удержать пользователей на платформе и увеличить количество просмотров страниц, что в свою очередь повысит эффективность рекламных кампаний и улучшит общие показатели форумов.
Для обучения и тестирования моделей используется датасет "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 для создания семантических представлений предложений.
- SentenceTransformers:
- 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 |
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 позволяет пользователю ввести вопрос и получить список из 5 наиболее похожих вопросов из базы данных. Сходство между вопросами отображается в процентах.
Инструкции по использованию:
- Открыть приложение по ссылке
- Выбрать язык (по умолчанию - Русский)
- Ввести вопрос на английском языке в поле "Введите ваш вопрос"
- Нажать на кнопку "Найти похожие вопросы"
Результат:
- 5 похожих вопросов на английском языке со степенью сходства в скобках.
Микросервис FastAPI предоставляет API для поиска похожих вопросов. API имеет один endpoint /similar_questions
, который принимает на вход вопрос в виде строки и возвращает JSON список похожих вопросов и их оценок сходства.
Инструкции по использованию:
-
- Скачать файлы
'download_model.py'
,'idx2emb.pkl'
,'idx2sen.pkl'
,'app.py'
,'requirements.txt'
.
- Скачать файлы
-
- Установить зависимости:
pip install -r requirements.txt
-
- Загрузить модель:
python download_model.py
Или скачать директорию
model
. -
- Запуститm API FastAPI:
uvicorn app:app --reload
-
- Тестирование:
Открыть адрес http://127.0.0.1:8000/docs в браузере. Здесь можно увидеть интерактивную документацию Swagger UI, которая позволяет отправлять запросы к API и просматривать ответы.
Ввод конкретного запроса в браузере.
- Создано приложение 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 может быть интегрирован с другими сервисами, такими как чат-боты, системы вопросов-ответов или поисковые системы.
Завершён.
Python, ML, MLE, NLP, pandas, numpy, FastAPI, Streamlit, SentenceTransformers, spacy, Word2Vec, scipy, torch, sklearn, matplotlib, pickle
- Датасет: https://huggingface.co/datasets/medical_questions_pairs
- SentenceTransformers: https://www.sbert.net/
- Streamlit: https://streamlit.io/
- FastAPI: https://fastapi.tiangolo.com/