Введение
Эффективный поиск — ключевой элемент пользовательского опыта на любом сайте. Однако стандартные методы поиска в Django, такие как полнотекстовый поиск через django.contrib.postgres, часто ограничены точным соответствием ключевых слов. Машинное обучение (МО) позволяет выйти за рамки этих ограничений, предлагая семантический анализ, персонализацию и умное ранжирование результатов. В этой статье рассмотрим, как интегрировать МО в поисковую систему Django.
1. Сбор и предобработка данных
Для обучения модели необходимы данные:
- История поисковых запросов и кликов пользователей.
- Время, проведенное на странице после перехода из поиска.
- Метаданные контента (теги, категории, тексты).
Пример сбора логов в Django:
# models.py
class SearchLog(models.Model):
query = models.CharField(max_length=255)
user = models.ForeignKey(User, on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_now_add=True)
clicked_result = models.ForeignKey(Article, on_delete=models.SET_NULL, null=True)
Предобработка текста:
- Очистка от стоп-слов, спецсимволов.
- Лемматизация (например, с помощью nltk или spacy).
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
def preprocess(text):
words = text.lower().split()
return [lemmatizer.lemmatize(word) for word in words if word.isalnum()]
2. Выбор модели машинного обучения
Варианты моделей:
- TF-IDF + Косинусная близость: для сопоставления запросов с контентом.
- Word2Vec/GloVe: семантический поиск на основе векторных представлений слов.
- BERT: глубокий контекстный анализ (требует больше ресурсов).
- Ranking Models (LightGBM, XGBoost): ранжирование результатов по релевантности.
Пример использования Word2Vec:
from gensim.models import Word2Vec
# Обучение модели на текстах статей
sentences = [preprocess(article.text) for article in Article.objects.all()]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)
3. Интеграция модели в Django
Шаги:
- Создание кастомного поискового бэкенда.
- Использование МО-модели для оценки релевантности.
Пример view для поиска:
# views.py
from django.views import View
from django.http import JsonResponse
class MLSearchView(View):
def get(self, request):
query = request.GET.get('q')
processed_query = preprocess(query)
# Векторизация запроса
query_vector = get_average_vector(processed_query, model)
# Сравнение с векторами статей
results = []
for article in Article.objects.all():
article_vector = get_average_vector(preprocess(article.text), model)
similarity = cosine_similarity([query_vector], [article_vector])[0][0]
results.append((article, similarity))
# Сортировка по релевантности
sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
return JsonResponse({'results': sorted_results})
4. Оптимизация производительности
- Кэширование результатов поиска (например, через Redis).
- Использование векторных баз данных (FAISS, Annoy) для быстрого поиска похожих векторов.
- Асинхронная обработка через Celery для тяжелых вычислений.
Пример использования FAISS:
import faiss
import numpy as np
# Создание индекса
vectors = np.array([get_article_vector(article) for article in articles]).astype('float32')
index = faiss.IndexFlatL2(vectors.shape[1])
index.add(vectors)
# Быстрый поиск
_, indices = index.search(np.array([query_vector]).astype('float32'), k=10)
5. Рекомендательные системы
Дополните поиск рекомендациями на основе:
- Content-based filtering: похожий контент по векторам.
- Коллаборативная фильтрация: рекомендации на основе поведения пользователей.
Пример рекомендаций:
def get_similar_articles(article_id):
article_vector = get_article_vector(article_id)
_, indices = index.search(np.array([article_vector]), k=5)
return Article.objects.filter(id__in=indices[0])
Заключение
Интеграция машинного обучения в поиск Django позволяет значительно улучшить релевантность результатов, учесть семантику запросов и персонализировать выдачу. Начните с простых моделей (TF-IDF, Word2Vec), используйте предобработанные данные и оптимизируйте производительность через кэширование и специализированные библиотеки. По мере накопления данных внедряйте более сложные подходы, такие как BERT или нейросетевые ранжировщики.