بهینهسازی دستهبندی خودکار پستها با استفاده از شباهت متنی در جنگو Django
در پروژههای مبتنی بر تولید و انتشار محتوا (مثل CMSها)، یکی از چالشهای بسیار مهم، دستهبندی دقیق مقالات و پستها در آن است. در این نوشته، قصد داریم روشی را معرفی کنیم که به کمک آن میتوان پستها و مقالات جدید را بر اساس شباهت متنی، به دستههای مناسب اختصاص داد. برای این کار، از کتابخانهی معروف scikit-learn و تکنیک بسیار کاربردی TF-IDF به همراه cosine similarity استفاده خواهیم کرد.
بهینهسازی دستهبندی خودکار پستها با استفاده از شباهت متنی در جنگو Django
چرا دستهبندی خودکار پستها اهمیت دارد؟
- بهبود تجربه کاربری: کاربران میتوانند راحتتر به محتوای مرتبط دسترسی داشته باشند.
- افزایش دقت در سازماندهی محتوا: کاهش خطای انسانی در انتخاب دستهبندی مناسب.
- بهینهسازی سئو: لینکسازی داخلی بهتر و افزایش نرخ تعامل کاربران.
معرفی روش پیادهسازی
تعریف مدل دستهبندی پستها: ابتدا مدل PostCategory را در پروژه خود تعریف میکنیم که شامل فیلدهای نام، توضیحات، و وضعیت فعال بودن آن دستهبندی است:
class PostCategory(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(unique=True, blank=True, null=True, max_length=500)
description = models.TextField(blank=True)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
پیادهسازی سرویس شباهت متنی: در این مرحله، کلاسی به نام TextSimilarityService ایجاد میکنیم که از الگوریتم TF-IDF برای محاسبه شباهت بین پستها و مقالات و دستهبندیها استفاده میکند:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
from posts.models import PostCategory
class TextSimilarityService:
def __init__(self):
self.vectorizer = TfidfVectorizer(stop_words="english")
self._update_category_vectors()
def _update_category_vectors(self):
categories = PostCategory.objects.all()
category_texts = []
self.categories = []
for category in categories:
category_text = f"{category.name} {category.description}"
category_texts.append(category_text)
self.categories.append(category)
if category_texts:
self.category_vectors = self.vectorizer.fit_transform(category_texts)
else:
self.category_vectors = None
def find_similar_category(self, title: str, content: str, threshold: float = 0.1):
default_category = PostCategory.objects.first()
if not self.category_vectors or not title or not content:
return default_category, 0.0
combined_text = f"{title} {content}"
combined_vector = self.vectorizer.transform([combined_text])
similarities = cosine_similarity(combined_vector, self.category_vectors)
best_match_index = np.argmax(similarities)
best_match_score = similarities[0, best_match_index]
if best_match_score >= threshold:
return self.categories[best_match_index], best_match_score
return default_category, 0.0
استفاده از این سرویس هنگام ذخیره پستها: در مدل پستها Post، هنگام ذخیره یک پست جدید، میتوان از این سرویس برای تخصیص خودکار دستهبندی Category استفاده کرد:
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
category = models.ForeignKey(PostCategory, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
def save(self, *args, **kwargs):
if not self.category:
similarity_service = TextSimilarityService()
self.category, _ = similarity_service.find_similar_category(self.title, self.content)
super().save(*args, **kwargs)
با استفاده روش بالا، هر پست Post جدید به صورت خودکار به مناسبترین دستهبندی Category اختصاص داده میشود. این کار باعث بهبود سازماندهی محتواها و کاهش نیاز به دخالت انسانی در فرآیند دستهبندی Category خواهد شد.
اگر روش بهتری دارید در بخش نظرات این نوشته برای ما بنویسید.


















اگر دستهبندیها خیلی کم باشن، نتیجه چه تاثیری داره؟
اگر سایت شما یک سایتی با هدف تولید محتوا بشه در سئوی شما تاثیر زیادی دارد.
این سرویس روی دیتابیس بزرگ هم بهینه هست؟
ممکن است کمی کند شود.
میشه threshold رو طوری تنظیم کرد که دقت بالاتر بره؟
بله.
اگر چند دسته خیلی شبیه به هم باشن، احتمال خطا زیاد میشه؟
بله ممکن است خطای تشخیص را بالا ببرید.
این روش برای پستهای خیلی طولانی هم جواب میده؟
بله تفاوتی ندارد.