Система классификации спама на основе BERT с FastAPI интерфейсом
Особенности • Установка • Использование • Архитектура • API • Обучение
Современная система для классификации SMS-сообщений как спам или не-спам (ham), построенная на базе предобученной модели BERT. Проект включает в себя полный цикл обработки данных, обучения модели и развертывания через REST API.
- BERT-based классификация — использование state-of-the-art трансформерной архитектуры
- FastAPI интерфейс — быстрое и современное REST API
- Полная предобработка — лемматизация, стемминг, удаление стоп-слов
- Готовая к продакшену — структурированный код и модульная архитектура
- Быстрое обучение — оптимизированный процесс fine-tuning
- Легкое развертывание — минимальные зависимости
| Компонент | Технология |
|---|---|
| ML Framework | PyTorch |
| Model | BERT (Transformers) |
| API Framework | FastAPI |
| Text Processing | NLTK |
| Data Processing | Pandas |
- Python 3.8 или выше
- pip
- Клонируйте репозиторий
git clone https://github.com/Kairatzh/Spam-Classification.git
cd Spam-Classification- Создайте виртуальное окружение
python -m venv venv- Активируйте виртуальное окружение
Windows:
venv\Scripts\activateLinux/MacOS:
source venv/bin/activate- Установите зависимости
pip install -r requirements.txt- Настройте конфигурацию (опционально)
cp .env.example .env
# Отредактируйте .env под свои нуждыpython main.pyИли через uvicorn:
uvicorn main:app --reload --host 0.0.0.0 --port 8000После запуска API будет доступен по адресу: http://localhost:8000
Интерактивная документация Swagger UI: http://localhost:8000/docs
ReDoc документация: http://localhost:8000/redoc
curl http://localhost:8000/healthcheckResponse:
{
"status": "ok",
"app_name": "Spam Classification API",
"version": "1.0.0",
"model_loaded": true
}curl -X POST "http://localhost:8000/predict" \
-H "Content-Type: application/json" \
-d '{"text": "Congratulations! You won $1000! Click here now!"}'Response:
{
"text": "Congratulations! You won $1000! Click here now!",
"prediction": 1,
"confidence": 0.95,
"label": "spam"
}import requests
response = requests.post(
"http://localhost:8000/predict",
json={"text": "Congratulations! You won $1000!"}
)
result = response.json()
print(f"Label: {result['label']}")
print(f"Confidence: {result['confidence']:.2%}")# Запуск всех тестов
pytest tests/ -v
# Запуск с coverage
pytest tests/ --cov=. --cov-report=html
# Запуск конкретного теста
pytest tests/test_api.py -vSpam-Classification/
│
├── 📁 data/ # Данные для обучения
│ └── combined_data.csv # Датасет SMS
│
├── 📁 tests/ # Unit тесты
│ ├── __init__.py
│ ├── test_api.py # Тесты API endpoints
│ └── test_model.py # Тесты модели
│
├── 📁 logs/ # Логи (создается автоматически)
│
├── 📄 config.py # Конфигурация приложения
├── 📄 logger.py # Настройка логирования
├── 📄 schemas.py # Pydantic модели для API
│
├── 📄 data_preprocess.py # Препроцессинг текста
├── 📄 model.py # SpamClassifier класс
├── 📄 model_training.py # Обучение модели
├── 📄 main.py # FastAPI приложение
│
├── 📄 .env.example # Пример конфигурации
├── 📄 requirements.txt # Зависимости
├── 📄 .gitignore # Git ignore
├── 📄 LICENSE # MIT License
└── 📄 README.md # Документация
- Централизованные настройки через Pydantic Settings
- Поддержка переменных окружения из
.env - Параметры модели, API, обучения
- Настройка логирования в файлы и консоль
- Ротация файлов логов (10MB макс)
- Разделение по модулям
- Pydantic модели для валидации
- Request/Response типы
- Встроенные примеры для документации
TextPreprocessorкласс для обработки текстаload_data()- загрузка CSV данныхpreprocess_data()- пайплайн обработки- Очистка, токенизация, лемматизация, стемминг
SpamClassifierкласс с lazy loading- Поддержка batch предсказаний
- Автоматическая загрузка pretrained/custom моделей
- Расчет confidence scores
- Train/validation split (80/20)
- Метрики: Accuracy, F1-score
- Learning rate scheduler
- Сохранение лучших чекпоинтов
- Progress bars с tqdm
- FastAPI с async/await
- Dependency injection для модели
- CORS middleware
- Обработка ошибок и логирование
- Lifespan events для инициализации
- Unit тесты для API (
test_api.py) - Unit тесты для модели (
test_model.py) - Покрытие edge cases
| Method | Endpoint | Описание |
|---|---|---|
GET |
/healthcheck |
Проверка работоспособности сервиса |
POST |
/predict |
Классификация текста |
{
"text": "Your message text here",
"prediction": 0
}{
"text": "Your message text here",
"prediction": 1
}Prediction values:
0— Ham (не спам)1— Spam (спам)
Параметры можно изменить в config.py или через .env:
LEARNING_RATE=2e-5 # Learning rate для Adam
NUM_EPOCHS=3 # Количество эпох
TRAIN_BATCH_SIZE=8 # Batch size
MAX_LENGTH=64 # Максимальная длина текста-
Подготовьте данные
- Поместите CSV файл в папку
data/ - Формат:
text,label(где label: 0=ham, 1=spam)
- Поместите CSV файл в папку
-
Запустите обучение
python model_training.py- Модель сохранится в
./saved_model/
Во время обучения отслеживаются:
- Training Loss (каждый batch)
- Validation Loss, Accuracy, F1-score (каждую эпоху)
- Сохраняется модель с лучшим F1-score
После обучения установите путь в .env:
MODEL_PATH=./saved_modelПроект использует комбинированный датасет SMS сообщений для классификации спама. Данные находятся в data/combined_data.csv.
Формат данных:
| Колонка | Описание |
|---|---|
text |
Текст SMS сообщения |
label |
Метка класса (0 или 1) |
Модель базируется на fine-tuned BERT и показывает высокую точность классификации SMS-сообщений:
- Быстрый инференс
- Предобработка текста
- Поддержка batch-предсказаний
Мы приветствуем любые улучшения! Чтобы внести вклад:
- Форкните проект
- Создайте ветку для фичи (
git checkout -b feature/AmazingFeature) - Закоммитьте изменения (
git commit -m 'Add some AmazingFeature') - Запушьте в ветку (
git push origin feature/AmazingFeature) - Откройте Pull Request
- Добавить метрики качества (accuracy, precision, recall, F1)
- Реализовать логирование
- Добавить Docker контейнеризацию
- Расширить тестовое покрытие
- Добавить мониторинг производительности
- Реализовать batch-prediction endpoint
- Добавить фронтенд интерфейс
Этот проект распространяется под лицензией MIT. См. файл LICENSE для подробностей.
Kairatzh
- GitHub: @Kairatzh
- Проект: Spam-Classification
- Hugging Face за библиотеку Transformers
- FastAPI за отличный фреймворк
- Сообщество PyTorch за поддержку
- Создателям BERT архитектуры
Сделано с любовью и Python
⭐ Поставьте звезду, если проект был полезен!