ساخت سیستم جستجو با پایتون و توسعه وب

ساخت سیستم جستجو با پایتون و توسعه وب

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

مقدمه و مفاهیم کلیدی

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

مفاهیم کلیدی دیگری که در ساخت سیستم جستجو نقش دارند عبارتند از:

  • توکن‌سازی (Tokenization): فرآیند شکستن متن به واحدهای کوچکتر (توکن‌ها) مانند کلمات.
  • حذف کلمات توقف (Stop Word Removal): حذف کلمات رایج و بی‌اهمیت مانند “و”، “یا”، “در” که به بهبود دقت جستجو کمک می‌کند.
  • ریشه‌یابی (Stemming/Lemmatization): تبدیل کلمات به ریشه اصلی خود برای یافتن نتایج مرتبط با تغییرات مختلف یک کلمه (مثلاً “دویدن”، “می‌دود”، “دوید” به “دو”).
  • رتبه‌بندی (Ranking): تعیین ترتیب نمایش نتایج جستجو بر اساس میزان ارتباط آن‌ها با درخواست کاربر.

مرحله اول: جمع‌آوری و آماده‌سازی داده‌ها

فرض کنید می‌خواهیم یک سیستم جستجو برای مجموعه‌ای از مقالات متنی ایجاد کنیم. ابتدا باید این مقالات را جمع‌آوری و آماده‌سازی کنیم. این شامل خواندن فایل‌ها، حذف کاراکترهای غیرضروری، تبدیل متن به حروف کوچک و توکن‌سازی است.

در پایتون، می‌توان از کتابخانه‌هایی مانند os برای کار با فایل‌ها و re برای عبارات باقاعده (Regular Expressions) استفاده کرد.

import os
import re

def load_documents(directory):
    documents = {}
    for filename in os.listdir(directory):
        if filename.endswith(".txt"):
            filepath = os.path.join(directory, filename)
            with open(filepath, "r", encoding="utf-8") as f:
                text = f.read()
                text = re.sub(r'[^ws]', '', text).lower() # حذف علائم نگارشی و تبدیل به حروف کوچک
                documents[filename] = text
    return documents

# مثال استفاده
documents = load_documents("articles") # فرض کنید مقالات در پوشه‌ای به نام "articles" قرار دارند

مرحله دوم: ساخت ایندکس

پس از آماده‌سازی داده‌ها، نوبت به ساخت ایندکس می‌رسد. یک روش ساده برای ساخت ایندکس، استفاده از دیکشنری است که در آن کلیدها کلمات و مقادیر لیست نام فایل‌هایی هستند که آن کلمه در آن‌ها وجود دارد.

def create_index(documents):
    index = {}
    for filename, text in documents.items():
        tokens = text.split() # توکن‌سازی
        for token in tokens:
            if token not in index:
                index[token] = []
            index[token].append(filename)
    return index

# مثال استفاده
index = create_index(documents)

مرحله سوم: پیاده‌سازی جستجو

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

def search(index, query):
    query_tokens = query.lower().split()
    results = set()
    for token in query_tokens:
        if token in index:
            results.update(index[token])
    return list(results)

# مثال استفاده
query = "پایتون توسعه وب"
results = search(index, query)
print(results)

مرحله چهارم: بهبود دقت جستجو

سیستم جستجوی ساده‌ای که تا کنون پیاده‌سازی کردیم، ممکن است نتایج دقیقی ارائه ندهد. برای بهبود دقت، می‌توان از تکنیک‌های زیر استفاده کرد:

  • حذف کلمات توقف: قبل از ساخت ایندکس، کلمات توقف را از متن حذف کنید.
  • ریشه‌یابی: کلمات را به ریشه اصلی خود تبدیل کنید.
  • رتبه‌بندی: نتایج را بر اساس میزان ارتباط آن‌ها با درخواست کاربر رتبه‌بندی کنید.

برای ریشه‌یابی می‌توان از کتابخانه‌هایی مانند nltk استفاده کرد.

import nltk
from nltk.stem import PorterStemmer

nltk.download('punkt') # دانلود داده‌های مورد نیاز nltk

stemmer = PorterStemmer()

def stem_tokens(tokens):
    return [stemmer.stem(token) for token in tokens]

# مثال استفاده
tokens = ["running", "runs", "ran"]
stemmed_tokens = stem_tokens(tokens)
print(stemmed_tokens)

مرحله پنجم: پیاده‌سازی رابط کاربری وب

برای ارائه سیستم جستجو به کاربران، نیاز به یک رابط کاربری وب داریم. می‌توان از فریم‌ورک‌های وب پایتون مانند Flask یا Django برای این منظور استفاده کرد.

در اینجا یک مثال ساده با استفاده از Flask آورده شده است:

from flask import Flask, request, render_template

app = Flask(__name__)

# فرض کنید index و documents در جایی تعریف شده‌اند (مانند مراحل قبل)

@app.route("/", methods=["GET", "POST"])
def index():
    results = []
    if request.method == "POST":
        query = request.form["query"]
        results = search(index, query)
    return render_template("index.html", results=results)

if __name__ == "__main__":
    app.run(debug=True)

فایل index.html می‌تواند به شکل زیر باشد:

<!DOCTYPE html>
<html>
<head>
    <title>سیستم جستجو</title>
</head>
<body>
    <form method="POST">
        <input type="text" name="query" placeholder="جستجو...">
        <button type="submit">جستجو</button>
    </form>

    <h2>نتایج جستجو:</h2>
    <ul>
        <% for result in results %>
            <li><%= result %></li>
        <% endfor %>
    </ul>
</body>
</html>

نتیجه‌گیری

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

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *