সম্পর্কিত অনুসন্ধান তৈরি: তিন-স্তরীয় শব্দার্থিক মিল
এই নিবন্ধটি ব্যাখ্যা করে কিভাবে আমরা একটি তিন-স্তরীয় কৌশল ব্যবহার করে সাইটের প্রতিটি পৃষ্ঠার জন্য সম্পর্কিত অনুসন্ধান লিঙ্ক তৈরি করি যা শব্দার্থিক প্রাসঙ্গিকতা, ট্রাফিক বন্টন এবং অনুসন্ধানের বৈচিত্র্যের মধ্যে ভারসাম্য বজায় রাখে।
সমস্যা: প্রাসঙ্গিক নেভিগেশন লিঙ্ক
ব্যবহারকারীদের আরও বিষয়বস্তু আবিষ্কার করতে সাহায্য করার জন্য প্রতিটি পৃষ্ঠার সম্পর্কিত অনুসন্ধান লিঙ্ক প্রয়োজন। কিন্তু কোন কোন অনুসন্ধান প্রশ্নগুলি আমরা দেখাব?
চ্যালেঞ্জটি একাধিক লক্ষ্যের মধ্যে ভারসাম্য বজায় রাখা:
-
প্রাসঙ্গিকতা: লিঙ্কগুলি বর্তমান পৃষ্ঠার সাথে শব্দার্থিকভাবে সম্পর্কিত হওয়া উচিত
-
ট্রাফিক বন্টন: উচ্চ-ট্রাফিক অনুসন্ধানগুলি উচ্চ-ট্রাফিক পৃষ্ঠাগুলিতে প্রদর্শিত হওয়া উচিত
-
অনুসন্ধানের বৈচিত্র্য: প্রতিটি অনুসন্ধান প্রশ্ন একাধিক পৃষ্ঠায় প্রদর্শিত হওয়া উচিত (১০+ বার)
-
ইউআরএল স্বতন্ত্রতা: একই গন্তব্যের দিকে দুবার লিঙ্ক করবেন না
-
কভারেজ: প্রতিটি পৃষ্ঠায় ৮টি মানসম্পন্ন লিঙ্ক থাকা উচিত
একটি সরল পদ্ধতি (খাঁটি শব্দার্থিক সাদৃশ্য) প্রতিটি পৃষ্ঠায় একই অনুসন্ধান দেখাতে পারে। একটি উন্নত পদ্ধতি ট্রাফিক-সচেতন প্রক্রিয়াকরণ সহ একটি তিন-স্তরীয় কৌশল ব্যবহার করে।
তিন-স্তরীয় কৌশল
আমরা প্রাসঙ্গিকতার ক্রমহ্রাসমান তিনটি স্তর ব্যবহার করে সম্পর্কিত অনুসন্ধান তৈরি করি:
স্তর ১: সম্পর্কিত অনুসন্ধান (উচ্চ সাদৃশ্য)
উচ্চ শব্দার্থিক সাদৃশ্য সম্পন্ন অনুসন্ধান প্রশ্ন যা সরাসরি পৃষ্ঠার বিষয়বস্তুর সাথে সম্পর্কিত:
-
উদাহরণ পৃষ্ঠা: "ট্রেও এন১০০ মিনি পিসি"
-
উদাহরণ অনুসন্ধান: "এন১০০ মিনি পিসি", "মিনি পিসি ৮জিবি", "কমপ্যাক্ট ডেস্কটপ এন১০০"
এগুলি সবচেয়ে প্রাসঙ্গিক মিল।
স্তর ২: জনপ্রিয় অনুসন্ধান (মধ্যম সাদৃশ্য)
মধ্যম সাদৃশ্য সম্পন্ন অনুসন্ধান প্রশ্ন যা বিষয়গতভাবে সম্পর্কিত কিন্তু কম নির্দিষ্ট:
-
উদাহরণ পৃষ্ঠা: "ট্রেও এন১০০ মিনি পিসি"
-
উদাহরণ অনুসন্ধান: "মিনি পিসি", "ছোট কম্পিউটার", "ফ্যানলেস পিসি"
এগুলি একই বিভাগের বিস্তৃত অনুসন্ধান প্রশ্ন।
স্তর ৩: ট্রেন্ডিং অনুসন্ধান (ফলব্যাক)
গ্লোবাল পাওয়ার অনুসন্ধান (সর্বোচ্চ ট্রাফিক) যা শব্দার্থিক মিল শেষ হয়ে গেলে ব্যবহৃত হয়:
-
উদাহরণ পৃষ্ঠা: যেকোনো পৃষ্ঠা
-
উদাহরণ অনুসন্ধান: "মিনি পিসি", "থিন ক্লায়েন্ট", "ইন্ডাস্ট্রিয়াল পিসি", "অল-ইন-ওয়ান পিসি"
এগুলি সাইট-ব্যাপী সবচেয়ে জনপ্রিয় অনুসন্ধান প্রশ্ন।
অ্যালগরিদম: ট্রাফিক-প্রথম প্রক্রিয়াকরণ
ধাপ ১: সমস্ত পৃষ্ঠা সংগ্রহ করুন
আমরা সাইটের প্রতিটি পৃষ্ঠা সংগ্রহ করি:
-
পণ্য (/p/): ধাপ ০ উৎস তথ্য থেকে
-
যন্ত্রাংশ (/i/): ধাপ ০ উৎস তথ্য থেকে
-
নিবন্ধ (/a/): ধাপ ০ উৎস তথ্য থেকে
-
পরিবার (/f/): ধাপ ০ উৎস তথ্য থেকে
-
বিভাগ (/c/): ধাপ ০ উৎস তথ্য থেকে
-
অনুসন্ধান পৃষ্ঠা (/q/): রাউটিং তথ্য থেকে (ধাপ ৭)
-
স্থির পৃষ্ঠা: হোম, সম্পর্কে, যোগাযোগ, ইত্যাদি।
এটি সাধারণত ~৬৪,০০০ পৃষ্ঠা দেয়।
ধাপ ২: এমবেডিং লোড করুন
আমরা পূর্ব-গণিত এমবেডিং লোড করি:
- পৃষ্ঠা: ধাপ ০ (পণ্য, যন্ত্রাংশ, নিবন্ধ) এবং ধাপ ৬ (অনুসন্ধান পৃষ্ঠা) থেকে পুনরায় ব্যবহার করুন
- অনুসন্ধান: ধাপ ৩খ (সব ৬৫হাজার অনুসন্ধান) থেকে
এমবেডিং পুনরায় ব্যবহার করলে অপরিবর্তিত তথ্য পুনরায় এমবেড করা এড়ানো যায়:
-
ধাপ ০ পুনঃব্যবহার: ~৫,০০০ পণ্য/যন্ত্রাংশ/নিবন্ধ এমবেডিং
-
ধাপ ৬ পুনঃব্যবহার: ~১২,৫০০ অনুসন্ধান পৃষ্ঠা এমবেডিং
-
নতুন এমবেডিং: ~৪৬,৫০০ অবশিষ্ট পৃষ্ঠা
ধাপ ৩: পৃষ্ঠা ট্রাফিক লোড করুন
আমরা গত ৯০ দিনের পৃষ্ঠা দর্শনের জন্য এথেনা ক্যোয়ারি করি:
traffic_data = generate_all_pages_traffic_index(lookback_days=90)
এটি ইউআরএল থেকে দেখা সংখ্যার একটি অভিধান প্রদান করে:
{
"/p/Treo-N100-8-256-2H-W6-11P": 5000,
"/q/mini-pc": 3000,
"/": 50000
}
ধাপ ৪: ট্রাফিক অনুযায়ী পৃষ্ঠা সাজান
আমরা পৃষ্ঠাগুলোকে ট্রাফিকের অবরোহী ক্রমে প্রক্রিয়া করি:
sorted_pages = sorted(all_pages, key=lambda p: page_traffic[p['url']], reverse=True)
এটি নিশ্চিত করে যে উচ্চ-ট্রাফিক পৃষ্ঠাগুলি প্রথমে অনুসন্ধান প্রশ্ন বেছে নিতে পারে।
ধাপ ৫: সাদৃশ্য গণনা করুন (ব্যাচড)
মেমরি দক্ষতার জন্য আমরা পৃষ্ঠাগুলিকে ১,০০০ এর ব্যাচে প্রক্রিয়া করি:
batch_page_embeddings = all_page_embeddings[batch_indices]
batch_similarities = util.cos_sim(batch_page_embeddings, query_embeddings)
# ... (বাস্তবায়নের বিবরণ বাদ দেওয়া হয়েছে)
এটি ব্যাচের জন্য একটি সাদৃশ্য ম্যাট্রিক্স তৈরি করে।
ধাপ ৬: অনুসন্ধান প্রশ্ন নির্বাচন করুন (তিন-স্তর)
প্রতিটি পৃষ্ঠার জন্য, আমরা তিন-স্তরীয় কৌশল ব্যবহার করে অনুসন্ধান প্রশ্ন নির্বাচন করি:
স্তর ১: উচ্চ সাদৃশ্য
for idx, similarity in enumerate(sorted_similarities):
if similarity < threshold_high:
break
# ... (বাস্তবায়নের বিবরণ বাদ দেওয়া হয়েছে)
স্তর ২: মধ্যম সাদৃশ্য (০.৬০-০.৮৫)
if len(selected_queries) < 8:
for idx, similarity in enumerate(sorted_similarities):
if similarity < 0.60:
break
if try_add_query(queries[idx]):
continue
স্তর ৩: পাওয়ার অনুসন্ধান (ফলব্যাক)
if len(selected_queries) < 8:
for power_query in power_query_list:
if try_add_query(power_query):
continue
ধাপ ৭: সীমাবদ্ধতা প্রয়োগ করুন
try_add_query() ফাংশনটি একাধিক সীমাবদ্ধতা প্রয়োগ করে:
অনুসন্ধান ব্যবহার সীমা (১০টি উপস্থিতি):
if query_usage[query] >= MAX_APPEARANCES:
return False
ইউআরএল স্বতন্ত্রতা (কোনও ডুপ্লিকেট গন্তব্য নয়):
url = get_dest_url(query)
if url in selected_urls:
return False
selected_urls.add(url)
স্ব-লিঙ্ক প্রতিরোধ:
selected_urls = {page_url} # বর্তমান পৃষ্ঠা দিয়ে শুরু করুন
প্রতি পৃষ্ঠায় ৮টি লিঙ্ক সীমাবদ্ধ:
if len(selected_queries) >= 8:
return False
ধাপ ৮: অনুসন্ধান প্রশ্নকে ইউআরএলে রূপান্তর করুন
আমরা ধাপ ৭ থেকে রাউটিং তথ্য ব্যবহার করে অনুসন্ধান প্রশ্নগুলিকে গন্তব্য ইউআরএলে রূপান্তর করি:
query_to_url_map = {}
for route in routing_data['routes']:
for query in route['queries']:
query_to_url_map[query] = route['destination']
এটি অনুসন্ধান গন্তব্যগুলির জন্য একটি দ্রুত O(1) লুকআপ তৈরি করে।
ধাপ ৯: ভাষা প্রচার (ঐচ্ছিক)
যদি ভাষা প্রচার সক্ষম থাকে, আমরা ইউআরএলে অনুসন্ধান প্রশ্নের ভাষা যুক্ত করি:
lang = detect_query_language(query)
if lang != "en":
url = f"{url}?lang={lang}"
এটি নিশ্চিত করে যে ব্যবহারকারীরা সম্পর্কিত অনুসন্ধানে ক্লিক করলে তাদের পছন্দের ভাষায় থাকেন।
ধাপ ১০: ডায়নামোডিবিতে সংরক্ষণ করুন
আমরা ব্যাচ লেখা ব্যবহার করে সম্পর্কিত অনুসন্ধানগুলি ডায়নামোডিবি তে সংরক্ষণ করি:
with RelatedSearchWidget.batch_write() as batch:
for page in batch_pages:
widget = RelatedSearchWidget(
page_url=page['url'],
links=[...],
tier_label="Related Searches"
)
batch.save(widget)
ব্যাচ লেখা পৃথক লেখার তুলনায় উল্লেখযোগ্য কর্মক্ষমতা উন্নতি প্রদান করে।
অনুসন্ধান ব্যবহার ট্র্যাকিং
আমরা ট্র্যাক করি প্রতিটি অনুসন্ধান প্রশ্ন কতবার ব্যবহৃত হয়েছে:
query_usage = {query: 0 for query in all_queries}
MAX_APPEARANCES = 10
অনুসন্ধান প্রশ্ন নির্বাচিত হওয়ার সাথে সাথে, আমরা তাদের ব্যবহার বৃদ্ধি করি:
query_usage[query] += 1
একবার একটি অনুসন্ধান প্রশ্ন ১০টি উপস্থিতিতে পৌঁছালে, এটি ভবিষ্যতের নির্বাচন থেকে বাদ পড়ে:
available_mask[query_idx] = False
এটি সাইট জুড়ে অনুসন্ধানের বৈচিত্র্য নিশ্চিত করে।
ট্রাফিক-প্রথম প্রক্রিয়াকরণের সুবিধা
ট্রাফিক দ্বারা পৃষ্ঠা প্রক্রিয়াকরণ (সর্বোচ্চ প্রথম) এর সুবিধা রয়েছে:
উচ্চ-ট্রাফিক পৃষ্ঠাগুলি সেরা মিল পায়:
-
হোম পৃষ্ঠা (৫০হাজার ভিউ) → শীর্ষ ৮টি সবচেয়ে প্রাসঙ্গিক অনুসন্ধান
-
জনপ্রিয় পণ্য (৫হাজার ভিউ) → পরবর্তী ৮টি সবচেয়ে প্রাসঙ্গিক অনুসন্ধান
-
নিশ পণ্য (১০০ ভিউ) → অবশিষ্ট প্রাসঙ্গিক অনুসন্ধান
স্বয়ংক্রিয় ফলব্যাক:
-
যদি উচ্চ-সাদৃশ্য অনুসন্ধান শেষ হয়ে যায়, মধ্যম-সাদৃশ্য অনুসন্ধান ব্যবহৃত হয়
-
যদি মধ্যম-সাদৃশ্য অনুসন্ধান শেষ হয়ে যায়, পাওয়ার অনুসন্ধান ব্যবহৃত হয়
ট্রাফিক বন্টন:
-
উচ্চ-ট্রাফিক অনুসন্ধানগুলি উচ্চ-ট্রাফিক পৃষ্ঠায় প্রদর্শিত হয়
-
নিম্ন-ট্রাফিক অনুসন্ধানগুলি নিশ পৃষ্ঠায় প্রদর্শিত হয়
-
সামগ্রিক ক্লিক-থ্রু সম্ভাবনা সর্বাধিক করে
স্থির পৃষ্ঠা হ্যান্ডলিং
স্থির পৃষ্ঠা (হোম, সম্পর্কে, যোগাযোগ) স্তর ১ এবং স্তর ২ এড়িয়ে সরাসরি স্তর ৩ এ যায়:
if page_type == 'static':
for power_query in power_query_list:
try_add_query(power_query)
tier_label = "Trending Searches"
এটি নিশ্চিত করে যে স্থির পৃষ্ঠাগুলি সাইট-ব্যাপী সবচেয়ে জনপ্রিয় অনুসন্ধান প্রশ্নগুলি দেখায়।
এমবেডিং পুনঃব্যবহার কৌশল
আমরা পূর্ববর্তী পাইপলাইন ধাপগুলি থেকে এমবেডিং পুনরায় ব্যবহার করি:
ধাপ ০ (উৎস তথ্য):
-
পণ্য:
/p/Treo-N100-8-256-2H-W6-11P -
যন্ত্রাংশ:
/i/N100 -
নিবন্ধ:
/a/mini-pc-guide
ধাপ ৬ (ক্লাস্টার অনুসন্ধান):
- অনুসন্ধান পৃষ্ঠা:
/q/mini-pc(স্লাগ → অনুসন্ধান পাঠ্য)
নতুন এমবেডিং:
- ধাপ ০ বা ধাপ ৬ এ নেই এমন অবশিষ্ট পৃষ্ঠা
এটি এমবেডিং সময় ~২ ঘন্টা থেকে ~২০ মিনিটে কমিয়ে দেয়।
ইনক্রিমেন্টাল এমবেডিং
যে পৃষ্ঠাগুলির নতুন এমবেডিং প্রয়োজন, আমরা ইনক্রিমেন্টাল ক্যাশিং ব্যবহার করি:
new_embeddings = incremental_embed_with_keys(
items=page_contents,
keys=page_urls,
cache_embeddings_path=SEO_PAGE_EMBEDDINGS_PATH,
cache_keys_path=SEO_PAGE_URLS_PATH,
model_name='all-mpnet-base-v2'
)
এটি ভবিষ্যতের রানের জন্য এমবেডিং ক্যাশ করে। বিস্তারিত জানতে এমবেডিং কৌশল দেখুন।
আউটপুট ফরম্যাট
সম্পর্কিত অনুসন্ধানগুলি ডায়নামোডিবিতে সংরক্ষণ করা হয়:
{
"page_url": "/p/Treo-N100-8-256-2H-W6-11P",
"tier_label": "Related Searches",
# ... (বাস্তবায়নের বিবরণ বাদ দেওয়া হয়েছে)
ওয়েব অ্যাপ্লিকেশনটি প্রতিটি পৃষ্ঠায় সম্পর্কিত অনুসন্ধান প্রদর্শন করতে এই টেবিলটি ক্যোয়ারি করে।
কর্মক্ষমতা বৈশিষ্ট্য
একটি সাধারণ সার্ভারে:
-
প্রক্রিয়াকরণ সময়: পৃষ্ঠার সংখ্যার উপর ভিত্তি করে পরিবর্তিত হয়
-
মেমরি ব্যবহার: এমবেডিং আকার এবং ব্যাচ আকারের উপর নির্ভর করে
-
ডায়নামোডিবি লেখা: সমস্ত পৃষ্ঠার জন্য ব্যাচ লেখা
-
এমবেডিং পুনঃব্যবহার: ইনক্রিমেন্টাল ক্যাশ থেকে উচ্চ শতাংশ
প্রক্রিয়াটি সাদৃশ্য গণনার সময় সিপিইউ-বাউন্ড। NumPy সাথে BLAS ত্বরণ ব্যবহার করে ম্যাট্রিক্স অপারেশনগুলি উল্লেখযোগ্যভাবে দ্রুততর করে।