PDA

View Full Version : یافتن متن های مشابه در sqlite



windowsyar
سه شنبه 30 آذر 1395, 15:26 عصر
سلام
یک بانک اطلاعاتی sqlite دارم
در هر فیلد از جدولم یک حدیث وجود دارد
حال می خواهم احادیث مشابه با یک حدیث را پیدا کند
---------------------------------
مثال
(متن 1)= سلام من از مشهد مقدس هستم اینجا هوا سرد است
(متن 2)= تو از مشهد هستی اینجا هوا سرد است
یعنی تقریبا 4 کلمه داشته باشد که یکی باشند
-----------------------------------------
تا اینجا می دانم که باید کلمات (متن یک) جدا شوند و هر کلمه در یک خانه آرایه قرار گیرد
ولی نمی دانم چگونه این کلمات متن یک را در بانک جستجو کنم
که اگر متنی حداقل 4 تا از این کلمات را داشت نمایش داده شود
امیدوارم متوجه شده باشید
------------------------------------------
در ضمن امروز یک کتاب خیلی خیلی قدیمی دیدم که نوشته بود
با دستور intersectتمام عناصر مشترک دو جمله SELECT را برمی گرداند گفتم شاید با این بشود ولی نمی دونم چطوراستفاده می شود

hamid_hr
سه شنبه 30 آذر 1395, 15:39 عصر
این لینک شاید کمک کنه بهتون
https://www.sqlite.org/fts3.html
فک کنم میتونین یک الگو درست کنین و ازش استفاده کنین

windowsyar
سه شنبه 30 آذر 1395, 20:43 عصر
این لینک شاید کمک کنه بهتون
https://www.sqlite.org/fts3.html
فک کنم میتونین یک الگو درست کنین و ازش استفاده کنین
سلام خیلی ممنون
این متن خیلی کامل و جامع هست
من هم با وجود این که انگلیسی ام خوب نیست روش خیلی وقت گذاشتم و خوندم
ولی اول هاش که چیز خاصی در رابطه با کار من نداشت
می شود بگویید کجایش با این کار من مرتبط است ؟
----------------------------------------------
و بعد هم این که من جدول و رکورد هایم را ساخته ام
آیا باید یک جدول جدید fts3 یا fts4 بسازم ؟
نمی شود با همین جدول یک کاری بکنم ؟
یا تبدیلش کنم ؟

codedeveloper
چهارشنبه 01 دی 1395, 12:18 عصر
SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
OR column1 LIKE '%word2%'
OR column1 LIKE '%word3%'
اینجا اگه یکی از این سه کلمه داخل فیلد باشه اونو برمیگردونه،
برای اینکه بتونید بخش Like رو به صورت پویا دربیارین هم میتونید قبل از دستور Select با استفاده از درستور Split کلمات وارد شده توسط کاربر رو جدا کرده و با استفاده از یک حلقه و یک متغییر رشته ای بخش Like رو تولید کنید و در آخر دستور
Select و بخش Where آن اضافه کنید و اگه هم کاربر چیزی وارد نکرده بود متغییر رشته ای خالی میشود و همه را خواهد آورد.
موفق باشید.

windowsyar
چهارشنبه 01 دی 1395, 13:28 عصر
SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
OR column1 LIKE '%word2%'
OR column1 LIKE '%word3%'
اینجا اگه یکی از این سه کلمه داخل فیلد باشه اونو برمیگردونه،
برای اینکه بتونید بخش Like رو به صورت پویا دربیارین هم میتونید قبل از دستور Select با استفاده از درستور Split کلمات وارد شده توسط کاربر رو جدا کرده و با استفاده از یک حلقه و یک متغییر رشته ای بخش Like رو تولید کنید و در آخر دستور
Select و بخش Where آن اضافه کنید و اگه هم کاربر چیزی وارد نکرده بود متغییر رشته ای خالی میشود و همه را خواهد آورد.
موفق باشید.
ممنون از توجهتون
ولی با این کد شما تمامی احادیثی که حتی اگر یک کلمه مشترک با این حدیث دارند برگردانده می شود (زیرا از OR استفاده شده )
من می خواهم حداقل 4 کلمه مشترک داشته باشند
مشکل اصلی روی همین 4 کلمه است هم در متن 1 هم در متن 2 هستند

codedeveloper
پنج شنبه 02 دی 1395, 10:18 صبح
خب دوست عزیز OR هارو به AND تبدیل کنید میشه همون 4 کلمه ای که میخواستین

windowsyar
پنج شنبه 02 دی 1395, 10:29 صبح
خب دوست عزیز OR هارو به AND تبدیل کنید میشه همون 4 کلمه ای که میخواستین
خب دوست عزیز به این سادگی ها هم دیگه نیست
من 20 تا کلمه دارم از این ها باید حداقل 4 تاشون یکی باشند
اگر بین اون 20 تا AND باشد باید همه 20 تا کلمه باشند ( واین دیگر مشابه نمی شود خودش می شود )
اگر هم or باشد اگر یک کلمه هم یکی باشد حدیث برگردانده می شود
----------------
شاید اینجوری یهتر متوجه شوید
نتایج کلمه 1 در دیتا گرید ویو 1 نمایش داده شود
نتایج کلمه 2در دیتا گرید ویو 2 نمایش داده شود
نتایج کلمه 3در دیتا گرید ویو 3 نمایش داده شود
نتایج کلمه ... در دیتا گرید ویو ... نمایش داده شود
حالا اگر یک نتیجه ای حداقل در 4 تا دیتا گرید ویو بود نمایش داده شود
باید نمایش داده شود
البته این برای فهمیدن بود اطلاعات و کلمات آنقدر زیاد است که نمی شود از دیتا گرید ویو استفاده کرد

windowsyar
جمعه 03 دی 1395, 09:52 صبح
خیلی فکر کردم تونستم این الگوریتم رو بدست بیارم (البته شبه الگوریتم)
لطفا بگید که این الگوریتم بهینه هست یا نه ؟
و چه طور به کد تبدیلش کنم.
الگوریتم این کار
-------------------------------------
متن m از کاربر گرفته شود
هر کلمه از m درون آرایه n قرار گیرد
حال تعداد مقادیر آرایه های n در s قرار گیرد
با یک حلقه for تمامی این حالت ها را در بانک جستجو کند



با فرض آنکه s (یعنی همان تعداد کلمات متن 6 باشد)
n(1) , n(2) , n(3) , n(4)
n(2) , n(3) , n(4) , n(5)
n(3) , n(4) , n(5) , n(6)

n(1) , n(3) , n(4) , n(5)
n(1) , n(4) , n(5) , n(6)

n(2) , n(4) , n(5) , n(6)

تمامی موارد بالا باید با یک حلقه فور در بانک جستجو شوند
اصولی یا غیر اصولی بودنش را بفرمایید




Mahmoud.Afrad
شنبه 04 دی 1395, 02:12 صبح
در اینگونه موارد Full Text Search بهترین راه حل هست مگر اینکه نتونید از این طریق به جواب برسید.
از لینکی که hamid_hr (http://barnamenevis.org/member.php?25531-hamid_hr) گذاشتند استفاده کنید. از قسمت matchable phrases (https://www.sqlite.org/fts3.html#matchable) میتونید برای مرتب سازی کمک بگیرید. یا اینکه اگر تونستید از تابع Rank اجرا بگیرید میتونه جواب شما باشه.
کد بنویسید هر کجا به مشکل خوردید سوال کنید.