بهینه‌سازی دسته‌بندی خودکار پست‌ها با استفاده از شباهت متنی در جنگو Django

بهینه‌سازی دسته‌بندی خودکار پست‌ها با استفاده از شباهت متنی در جنگو Django
بهینه‌سازی دسته‌بندی خودکار پست‌ها با استفاده از شباهت متنی در جنگو Django

بهینه‌سازی دسته‌بندی خودکار پست‌ها با استفاده از شباهت متنی در جنگو 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 خواهد شد.

اگر روش بهتری دارید در بخش نظرات این نوشته برای ما بنویسید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 2 میانگین: 5]