ویرگول
ورودثبت نام
Mohamad mozafari
Mohamad mozafariعلاقه مند به دنیای دیجیتال و مارکتینگ و سئو استفاده و بهینه سازی سرعت کار با استفاده درست از هوش مصنوعی های مختلف
Mohamad mozafari
Mohamad mozafari
خواندن ۶ دقیقه·۱ ماه پیش

کیورد کلاسترینگ با SERP گوگل: دقیق‌ترین روش دسته‌بندی کلمات بر اساس نیت واقعی کاربر

اگر بخواهم یک جمله درباره‌ی «کیورد کلاسترینگ» بگویم، این است:
کلاسترینگ یعنی تصمیم بگیریم هر کلمه کلیدی باید روی چه صفحه‌ای بنشیند—تا هم Cannibalization نگیریم، هم ساختار سایت‌مان درست شکل بگیرد.

خیلی‌ها کلاسترینگ را با «گروه‌بندی خوشگل در اکسل» اشتباه می‌گیرند؛ در حالی که کلاسترینگِ درست، پایه‌ی معماری اطلاعات سایت، استراتژی محتوا و حتی برنامه‌ی تولید لندینگ‌پیج‌هاست.

در این مقاله سه رویکرد را با هم جلو می‌بریم:

  1. کلاسترینگ دستی (Manual) — بهترین برای فهم بازار و شروع کار

  2. کلاسترینگ معنایی با NLP / BERT — سریع‌تر، ولی خطاپذیر

  3. کلاسترینگ بر اساس SERP Similarity — معتبرترین روش چون مستقیماً با نیت کاربر هم‌راستاست


1) کلاسترینگ دستی: اول باید «کلمه» را بشکافی

در روش دستی، شما هر کلمه را مثل یک جمله باز می‌کنید و می‌پرسید:

  • این کلمه درباره‌ی چی است؟ (نوع محصول/موضوع)

  • چه زیرشاخه‌ای دارد؟ (مثلاً مردانه/زنانه، آفتابی/طبی…)

  • چه ویژگی‌هایی داخلش هست؟ (رنگ، مدل، سایز، جنس…)

  • آیا برند دارد؟

  • مهم‌تر از همه: نیت کاربر چیست؟ اطلاعاتی؟ تجاری؟ خرید؟…

مثال ساده

«پیراهن آستین بلند قرمز نایکی»

می‌توانیم آن را در چند ستون تگ بزنیم:

  • نوع محصول: پیراهن

  • زیرشاخه: (اگر ذکر شده باشد: مردانه/زنانه/بچگانه…)

  • مدل/ویژگی: آستین بلند

  • رنگ: قرمز

  • برند: نایکی

  • Intent: غالباً تجاری/تراکنشی (کاربر احتمالاً دنبال خرید/مشاهده محصول است)

پس شما در گوگل‌شیت چند ستون می‌سازی و برای هر کیورد، تگ می‌زنی. این کار دو مزیت بزرگ دارد:

✅ بازار را می‌فهمی (نه فقط فایل تحویل بدهی)
✅ ساختار دسته‌بندی سایت از دل دیتا بیرون می‌آید

اما یک مشکل جدی دارد…

مشکل روش دستی

اگر پروژه ۵۰۰۰ تا ۵۰,۰۰۰ کلمه داشته باشد، تگ‌زنی دستی زمان‌بر و فرسایشی می‌شود. تازه، هرچه دیتاست بزرگ‌تر شود احتمال خطای انسانی هم بالا می‌رود.

اینجاست که خیلی‌ها می‌روند سراغ روش‌های ماشینی.


2) کلاسترینگ معنایی با NLP/BERT: سریع‌تر، ولی نه همیشه درست

در روش معنایی، شما سعی می‌کنی با مدل‌های زبانی (NLP) مثل BERT/Embeddingها بفهمی کدام کلمات از نظر معنا به هم نزدیک‌اند.

مثلاً:

  • «پیراهن آستین بلند قرمز»

  • «پیراهن قرمز آستین بلند»

  • «پیراهن نایکی قرمز»

از نظر معنایی نزدیک‌اند، پس مدل می‌گوید “این‌ها یک خوشه‌اند”.

مشکل مهم این روش: «معنا» همیشه برابر «نیت» نیست

دو کیورد ممکن است خیلی شبیه باشند، اما SERP متفاوت داشته باشند.

مثلاً:

  • «بهترین کفش رانینگ نایکی» → بیشتر مقاله/راهنما (Informational/Commercial)

  • «خرید کفش رانینگ نایکی» → صفحه دسته‌بندی/محصول (Transactional)

از نظر “معنا” نزدیک‌اند، اما “نیت” متفاوت است.
پس اگر فقط با NLP کلاستر کنی، ممکن است دو Intent را قاطی کنی و بعداً در ساختار سایت به مشکل بخوری.

نتیجه: روش NLP خوب است برای پیش‌گروه‌بندی سریع، اما برای تصمیم نهایی، کافی نیست.


3) بهترین و معتبرترین روش: کلاسترینگ با SERP Similarity

اینجا می‌رسیم به روشی که از نظر عملی، «واقعی‌ترین» است:

اگر دو کلمه کلیدی، نتایج صفحه اول گوگل‌شان شبیه باشد، یعنی گوگل تشخیص داده نیت کاربرشان نزدیک است، پس باید در یک کلاستر باشند.

چرا این روش معتبرترین است؟

  • گوگل سال‌هاست با آزمون و خطا و داده‌های رفتاری (کلیک، ماندگاری، بازگشت به SERP…) فهمیده برای هر کوئری چه نوع صفحه‌ای باید نشان بدهد.

  • پس SERP عملاً تبدیل می‌شود به «خلاصه‌ی نیت کاربر».

منطق روش

برای هر کیورد، ۱۰ نتیجه اول گوگل را برمی‌داریم (URLها یا دامنه‌ها).
بعد دو به دو کیوردها را مقایسه می‌کنیم:

  • اگر مثلاً ۴ یا ۵ نتیجه مشترک داشتند → احتمالاً یک Intent دارند → یک کلاستر

  • اگر اشتراک کم بود → جدا

این یعنی کلاسترینگ بر اساس «شباهت SERP».


روش اجرایی کامل (گام به گام)

گام 1: دیتاست کیوردها را آماده کن

یک شیت ساده:

KeywordSERP_Top10_URLs…

ستون اول: کیوردها
ستون دوم: قرار است ۱۰ URL اول برای هر کیورد ذخیره شود.


گام 2: استخراج ۱۰ نتیجه اول برای هر کلمه

نکته مهم و قانونی

اسکرپ مستقیم نتایج گوگل معمولاً با محدودیت/کپچا/ریسک مواجه می‌شود و ممکن است خلاف سیاست‌های گوگل باشد.
راه حرفه‌ای‌تر استفاده از SERP API است (مثل SerpAPI، DataForSEO، Zenserp و…).

این APIها دقیقاً برای همین کار ساخته شده‌اند: گرفتن خروجی SERP تمیز، بدون کپچا، با پارامترهای کشور و زبان.

پارامترهای مهم برای فارسی/ایران:

  • hl=fa (زبان)

  • gl=ir (موقعیت)

  • num=10


گام 3: ذخیره URLهای تاپ10 در شیت

بهترین حالت این است که برای هر کیورد، ۱۰ URL را با یک جداکننده (مثلاً |) داخل یک سلول ذخیره کنی.

مثل:

url1|url2|url3|...|url10

گام 4: مقایسه دو به دو و محاسبه «اشتراک»

اینجا دو مدل رایج داریم:

مدل A: آستانه‌ی اشتراک (Overlap Threshold)

مثلاً می‌گیم:

  • اگر اشتراک ≥ 4 → یک کلاستر

مدل B: شباهت جاکارد (Jaccard Similarity)

فرمول:

  • Jaccard = (تعداد مشترک) / (تعداد کل یونیک)

مثلاً اگر ۱۰ تا URL داریم و ۵ تا مشترک:

  • Jaccard = 5 / 15 = 0.33

معمولاً برای Top10، یک آستانه‌های رایج:

  • Overlap ≥ 4 یا

  • Jaccard ≥ 0.30 ~ 0.40

(عدد دقیق وابسته به حوزه و SERP volatility است، ولی این بازه‌ها کاربردی‌اند.)


گام 5: ساخت کلاسترها

وقتی برای هر دو کیورد تصمیم گرفتی “مشابه‌اند یا نه”، می‌توانی یک گراف بسازی:

  • هر کیورد = یک نود

  • اگر مشابه بودند = بینشان یال می‌گذاری

  • هر Connected Component می‌شود یک کلاستر

این روش حتی اگر A با B مشترک باشد و B با C مشترک باشد، A و C هم داخل همان خوشه می‌افتند (منطقی و طبیعی).


اجرای عملی با Google Sheets + Apps Script (ایده اجرایی)

برای اینکه مقاله کاملاً آموزشی باشد، اینجا یک اسکلت قابل فهم می‌دهم.
(برای استفاده واقعی، باید API Key سرویس SERP خودت را جایگزین کنی.)

1) تابع گرفتن Top10 از SERP API و نوشتن در شیت

function fetchSerpTop10() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const lastRow = sheet.getLastRow(); const keywords = sheet.getRange(2, 1, lastRow - 1, 1).getValues(); // Col A const apiKey = 'YOUR_API_KEY'; for (let i = 0; i < keywords.length; i++) { const kw = keywords[i][0]; if (!kw) continue; // نمونه‌ی فرضی: باید با API واقعی جایگزین شود const url = 'https://serpapi.example.com/search?q=' + encodeURIComponent(kw) + '&num=10&hl=fa&gl=ir&api_key=' + apiKey; const res = UrlFetchApp.fetch(url); const json = JSON.parse(res.getContentText()); // فرض: json.organic_results شامل نتایج ارگانیک است const urls = (json.organic_results || []) .slice(0, 10) .map(r => r.link) .join('|'); sheet.getRange(i + 2, 2).setValue(urls); // Col B } }

2) تابع محاسبه اشتراک دو کیورد (Overlap)

function overlapCount(urlsA, urlsB) { const setA = new Set(urlsA.split('|').filter(Boolean)); const setB = new Set(urlsB.split('|').filter(Boolean)); let count = 0; setA.forEach(u => { if (setB.has(u)) count++; }); return count; }

3) ایده خروجی

می‌توانی یک شیت دوم بسازی که برای هر جفت کیورد:

  • Overlap را محاسبه کند

  • اگر ≥ 4 بود، در ستون “SameCluster=1” بزند

بعد با یک اسکریپت ساده‌تر، کلاسترها را با DFS/BFS بسازی و خروجی بدهی.


نکات خیلی مهم (تا پروژه واقعی خراب نشود)

1) مقایسه دو به دو O(n²) است

اگر ۱۰,۰۰۰ کیورد داشته باشی:

  • 10000² = 100 میلیون مقایسه
    غیرواقعی برای شیت.

✅ راه‌حل عملی:

  • ابتدا کیوردها را با روش معنایی یا دستی پیش‌گروه‌بندی کن (مثلاً بر اساس برند/نوع محصول)

  • سپس SERP Similarity را داخل هر گروه کوچک اجرا کن

این بهترین ترکیب دقت + مقیاس است.

2) SERP نوسان دارد

نتایج گوگل ممکن است با زمان/لوکیشن/دستگاه فرق کند.
پس پارامترهای hl و gl را ثابت نگه دار و زمان استخراج را هم نزدیک به هم انجام بده.

3) URL یا Domain؟

گاهی بهتر است به جای URL کامل، دامنه را معیار بگیری (مثلاً digikala.com).
چون ممکن است دو نتیجه از یک دامنه ولی صفحات مختلف باشند و هنوز نشان‌دهنده‌ی Intent مشابه باشند.


جمع‌بندی نهایی

  • دستی: بهترین برای فهم بازار و ساخت Taxonomy (ولی کند)

  • NLP/BERT: سریع برای پیش‌گروه‌بندی (ولی ممکن است Intent را قاطی کند)

  • SERP Similarity: دقیق‌ترین روش چون مستقیماً از تصمیم‌های گوگل روی Intent استفاده می‌کند

اگر بخواهی واقعاً “کلاسترینگ حرفه‌ای” انجام بدهی، بهترین ترکیب این است:

✅ دستی/معنایی برای پیش‌گروه‌بندی
✅ SERP Similarity برای تصمیم نهایی و ساخت خوشه‌های واقعی

گوگلکلاسترینگ
۰
۰
Mohamad mozafari
Mohamad mozafari
علاقه مند به دنیای دیجیتال و مارکتینگ و سئو استفاده و بهینه سازی سرعت کار با استفاده درست از هوش مصنوعی های مختلف
شاید از این پست‌ها خوشتان بیاید