نوب
3 سال پیش توسط نوب مطرح شد
1 پاسخ

یافتن متون مشابه در لاراول

@mhyeganeh
سلام و عرض ادب

میخوام توی جدول products ستون body را که از نوع text هست متنشونو به 2 صورت باهم مقایسه کنم
حالت اول : توی لیست محصولاتم اگر متن محصولم دقیقا با یک محصول دیگه یکی بود بهم نام محصول مرتبط را نشون بده
حالت دوم : اگر متن محصولاتم از لحاظ پاراگرافی تشابه داشتن هم حالا به هر طریقی بهم بگه که مثلا محصول A با محصول F مثلا 70درصد مشابهت دارن . یا بگه مثلا 3 پاراگرافشون یکیه

چطور باید این موردو راه اندازی کنم توی لاراول ؟ با whereRaw باید بزنم ؟


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

سلام
برای مورد اول یعنی پیدا کردن محصولاتی با متن توضیحات کاملا مشابه هم، یکی از ساده ترین کارهایی که می‌تونید بکنید این هست که یک command برای این کار ایجاد کنید. داخلش تمامی محصولات رو بگیرید و با یک حلقه foreach به ازای هر محصول، چک کنید آیا در جدول محصولات، رکورد دیگری غیر از همون مورد وجود داره که متن توضیحاتش برابر با اون مقدار باشه یا نه... مثلا اینجوری:

foreach(Product::all() as $product) {
    if ($same_body = Product::where('id', '<>', $product->id)->where('body', '=', $product->body)->first(['id'])) {
        $this->error("Product id={$product->id} has body equal to product id={$same_body->id}");
     }
}

برای موضوع دوم هم اگر می‌خواهید تناظر مو به مو تو پاراگراف رو چک کنید باید متن رو مثلا با explode به تفکیک پاراگراف جداسازی کنید و بعد چیزی مثل فرایند بالا رو به ازای المنت های دو آرایه انجام بدید.

اگر هم می‌خواهید تناظرهای حدودی و نه دقیق رو بررسی کنید من اطلاع دقیقی ندارم و فقط می‌دونم میره سمت مباحثی مثل Fuzzy Search یا Approximate string matching و Full-text search که خودش عالمیه.

برای مثالی که بالا فرستادم هم پیش فرضم این بود که فرایندی یک مرتبه ای هست و قرار نیست به کرات ازش استفاده بشه. به همین خاطر خیلی از نظر Performance شاید بهینه نباشه و راهکارهای بهینه تری هم وجود داشته باشه و این صرفا یک مثال هست.


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

ورود یا ثبت‌نام