PDA

View Full Version : یافتن الگوریتم برای بهبود جستجوی کلمه



ASedJavad
پنج شنبه 25 اسفند 1390, 18:15 عصر
سلام
یه دیتا بیس دارم شامل نزدیک 50 هزار کلمه فارسی (بدون اعراب)
(فرض کنید یه چیزی مثل دیکشنری)
حالا کاربر میاد یه کلمه رو تایپ میکنه و برنامه میاد این کلمه رو تو دیتابیسش جستجو میکنه.
حالا میخوام ببینم به نظر شما چه الگوریتمی رو پیاده سازی کنم که خطای کاربر تاثیر کمتری تو نتایج جستجو داشته باشه؟
یه توضیح میدم:
وقتی کاربر یه کلمه رو تایپ میکنه ممکنه چهار جور اشتباه غیرفاحش (اشتباه تک حرفی) داشته باشه:
1- تایپ با یک حرف کمتر
مثلا بجای "پادشاه" تایپ میکنه "پادشا"
2- تایپ با یک حرف اضافه
مثلا بجای "پاشا" تایپ می کنه "پادشا"
3- تایپ با یک حرف جابجا:
مثلا بجای "پاداش" تایپ میکنه "پادشا"
4- تایپ با یک حرف اشتباه
مثلا بجای "پادشاه" تایپ میکنه پادساه"

حالا چجوری فرضا وقتی کاربر تایپ میکنه "پادشا" بیام براش کلمات "پاداش" و "پادشاه" و "پاشا" رو هم جستجو کنم؟

daniyal_1363
پنج شنبه 25 اسفند 1390, 18:50 عصر
سلام

بیا مسلئه رو به چند قسمت تقسیم کنیم

1 - توی نوشته هات اگه توجه کردی باشی دو حرف اولت که "پا" باشه توی همش یکیه - یعنی توی بانکت تمامی نوشته هایی رو که اولش مثلاً "پا" داشته باشه رو بیاره - خوب اینجوری شاید مثل یه جستجوی ساده باشه پس...

2 - حالا میتونیم نوشته ای که کاربر تایپ کرده رو به چند قسمت تقسیم کنیم و طبق تقسیماتی که داریم روی جستجوی قبلی اعمال کنیم تا محدودتر بشه


شاید منظورم رو درست نرسونده باشم واسه همین سعی میکنم طراحیش کنم و بزارم تا متوجه بشین

سید حمید حق پرست
پنج شنبه 25 اسفند 1390, 18:51 عصر
سلام
من هم دنبال این روش میگردم اما بانکم دیتابیس نیست TXT هست
فایل TXT, تقریبا مثل دیتا بیس شبیه سازیش کردم مثل نمونه زیر :
"ایرانی","محمد"
"رستمی","احمد"
"استانی","میثم"
"محمدی","حامد"
...و

ممنون میشم دوستان کمک کنن

یا علی (ع)

aria1o
پنج شنبه 25 اسفند 1390, 19:48 عصر
سلام
ببین این جواب کارت رو میده دوست عزیز (Text)

سید حمید حق پرست
پنج شنبه 25 اسفند 1390, 20:59 عصر
ممنون دوست عزیز ولی من اینو نگفتم اینو گفتم که دوست عزیز ASedJavad (http://barnamenevis.org/member.php?u=60645) توضیح دادن . من تو فایل TXT متن رو به شکل زیر گذاشتم که یه جستو جو خاصی داره که میتونید اونرو از آدرس زیر دانلود کنید . میخوام روشی که دوست عزیزمون ASedJavad (http://barnamenevis.org/member.php?u=60645) توضیح دادن رو در این سورس بکار ببرم

دانلود (http://barnamenevis.org/attachment.php?attachmentid=71722&d=1309334395)


یا علی (ع)

ASedJavad
پنج شنبه 25 اسفند 1390, 23:42 عصر
سلام مجدد

ببین این جواب کارت رو میده دوست عزیز (Text)

فکر میکنم شما مسئله رو درست متوجه نشدید.
این سورسی که شما گذاشتید، سه روش مختلف جستجوی یک واژه در یک متنه.
در صورتی که من با نحوه جستجو مشکل ندارم بلکه مشکل من جستجوی کلمات مشابه هست.

بذارید بیشتر توضیح بدم:

شما یه صفحه گوگل باز کن و کلمه "برقامه نویز" رو توش سرچ کن یا کلمه "رنامه نویس" یا ...
اولین خطی که میاد اینه:

Showing results for برنامه نویس
یعنی حدس میزنه که شما اشتباه تایپ کردین و اشتباه شما رو تصحیح میکنه.
تو بابیلون هم تقریبا یه همچی قابلیتی داره.



بیا مسلئه رو به چند قسمت تقسیم کنیم

1 - توی نوشته هات اگه توجه کردی باشی دو حرف اولت که "پا" باشه توی همش یکیه - یعنی توی بانکت تمامی نوشته هایی رو که اولش مثلاً "پا" داشته باشه رو بیاره - خوب اینجوری شاید مثل یه جستجوی ساده باشه پس...
ممنون
ولی اون فقط یه مثال بود و ممکنه این اشتباه در اول لغت یا وسطش یا آخرش رخ داده باشه.مثلا فرض کن کاربر بجای "پادشاه" بنویسه "پدشاه"


شاید منظورم رو درست نرسونده باشم واسه همین سعی میکنم طراحیش کنم و بزارم تا متوجه بشین
ممنون میشم اگه این لطفو بکنید

_behnam_
جمعه 26 اسفند 1390, 00:01 صبح
سلام!
این چیزی که شما مدنظرتون هست فکر کنم جزء زیرشاخه های هوش مصنوعی باید باشه ، اگه اشتباه نکنم مربوط به تطبیق الگو هست
با دستور SQL گمون نکنم بشه یا اگه بشه من بلد نیستم اما فکر کنم ( البته 100%) با استفاده از عبارات با قاعده میشه اینکارو کرد ولی مشروط بر اینکه
شما 50000 رکورد رو یکی یکی با یک حلقه بی نهایت چک کنید
البته یه راه دیگه هم فکر کنم بشه :
مثلا با دستور LIKE و AND بیای توی رشته تمام حروف رو سرچ کنی

Like %پ% AND %ا% AND %د% AND %ش%

ولی دقیق نیست

ASedJavad
جمعه 26 اسفند 1390, 00:10 صبح
این چیزی که شما مدنظرتون هست فکر کنم جزء زیرشاخه های هوش مصنوعی باید باشه ، اگه اشتباه نکنم مربوط به تطبیق الگو هست
با دستور SQL گمون نکنم بشه یا اگه بشه من بلد نیستم اما فکر کنم ( البته 100%) با استفاده از عبارات با قاعده میشه اینکارو کرد ولی مشروط بر اینکه
شما 50000 رکورد رو یکی یکی با یک حلقه بی نهایت چک کنید
البته یه راه دیگه هم فکر کنم بشه :
مثلا با دستور LIKE و AND بیای توی رشته تمام حروف رو سرچ کنی

Like %پ% AND %ا% AND %د% AND %ش%

ولی دقیق نیست

اینکه با دستور sql بشه یا نه خیلی مهم نیست، مهم برام الگوریتمشه
اگه الگوریتم خوبی پیدا بشه، شاید بشه یه جورایی با sql یا بدون اون ، یه کاریش کرد

setroyd
جمعه 26 اسفند 1390, 00:21 صبح
شما باید از یک جستجوگری استفاده کنید که با توابع رشته ای نوشته شده باشه و بهینه باشه چون این کد اگر اشتباه کوچکی هم توش باشه کند میکنه برنامه رو چون جستجوی شما بر اساس حرف اول نیست بلکه تمام کاراکتر رو در بر میگیره . و این کار بهتره با api انجام بشه تا با vb با vb هم میشه ولی نه به اون سرعت .

ASedJavad
جمعه 26 اسفند 1390, 00:28 صبح
شما باید از یک جستجوگری استفاده کنید که با توابع رشته ای نوشته شده باشه و بهینه باشه چون این کد اگر اشتباه کوچکی هم توش باشه کند میکنه برنامه رو چون جستجوی شما بر اساس حرف اول نیست بلکه تمام کاراکتر رو در بر میگیره . و این کار بهتره با api انجام بشه تا با vb با vb هم میشه ولی نه به اون سرعت .

ممکنه بیشتر و عملی تر توضیح بدید؟

setroyd
جمعه 26 اسفند 1390, 00:37 صبح
علمی نداره شما با توابع دیگه نظیر sendmessage مثلا میتونی تو لیستی که مثلا توش نوشته ali بیای a رو تایپ کنی تا a ها لیست بشه درسته ؟؟ ولی اینکه بیا شما li رو بدی مثلا اونهایی که توشون li داره مثل ali این یعنی اینکه بیاد تمام کلمه هارو بخونه یعنی همه ی list رو بعد این هارو نمایش بده . مثل شما گفتی

مثلا بجای "پاداش" تایپ میکنه "پادشا"

کلمه ی دوم یک کلمه ی جدا از اول هست چون (پاد )در جفتشون مشترک هست پس میاد باز پاد هارو لیست میکنه نه پادشاه بزنه پاداش رو بیاره شما فقط میتونی نزدیک ترین کلمه به کلمه ی مورد نظر رو پیدا کنی . موفق باشی گرچه کامل نتونستم توضیح بدم و مطلب رو برسونم ولی امیدوارم منظورم رو فهمیده باشید .

ASedJavad
جمعه 26 اسفند 1390, 00:57 صبح
شما فقط میتونی نزدیک ترین کلمه به کلمه ی مورد نظر رو پیدا کنی . موفق باشی گرچه کامل نتونستم توضیح بدم و مطلب رو برسونم ولی امیدوارم منظورم رو فهمیده باشید .
ممنون
متوجه شدم شما چی میگد.
اینی که شما میفرمایید یعنی بیایم نذاریم کاربر کلمه اشتباه وارد کنه.
ولی من میخوام وقتی کاربر اشتباه وارد کرد بیام اشتباه رو تصحیح کنم.
همون چیزی که گفتم گوگل انجام میده.

setroyd
جمعه 26 اسفند 1390, 01:35 صبح
بله اینی هم که من گفتم به نزدیکترین کلمه اصلاه میکنه دیگه !!! حالا اگه تونستم برات مینویسم میزارم .

akbarg64
جمعه 26 اسفند 1390, 09:11 صبح
سلام.بهترین راه حلی که به ذهن من رسید اینه.مثلا شما تایپ کنید پا ببینید چی میشه

ASedJavad
جمعه 26 اسفند 1390, 10:21 صبح
سلام.بهترین راه حلی که به ذهن من رسید اینه.مثلا شما تایپ کنید پا ببینید چی میشه

سلام
ممنون
ولی این خطا رو تصحیح نمیکنه
بلکه طبق حزوف اولیه میاد بقیه حروف رو هم حدس میزنه

ذز صورتی که من میخوام مثلا اگه کاربر تایپ کرد "ژادشاه" باز هم پادشاه پیدا شه!

akbarg64
جمعه 26 اسفند 1390, 13:24 عصر
یه کم بیشتر در مورد برنامه ای که میخواین توضیح بدین.بدونیم.شاید بتونیم راه حل بهتری پیدا کنیم.

aria1o
جمعه 26 اسفند 1390, 14:08 عصر
با سلام
برنامه اول رو برای آقا سید حمید (http://barnamenevis.org/member.php?242085-سید-حمید-حق-پرست) گذاشته بودم

ولی برای شما باید بگم که به نظر منم طبق گفته دوست عزیزمون آقا بهنام شما یه دیتا بیس کامل از کلمات نیاز داری و با الگو گرفتن از هوش مصنوعی برنامرو طراحی کنی

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

ASedJavad
جمعه 26 اسفند 1390, 16:37 عصر
یه کم بیشتر در مورد برنامه ای که میخواین توضیح بدین.بدونیم.شاید بتونیم راه حل بهتری پیدا کنیم.
دیگه بیشتر از این نمیدونم چطوری توضیح بدم!
هدف من کم کردن تاثیر اشتباهات تایپی و اشتباهات املایی در نتیجه جستجوست.
نمیدونم شما تا حالا از ورژن های جدید بابیلون استفاده کردید یانه
وقتی تو تکست باکس ورودی بابیلون یه کلمه رو تایپ میکنید، بابیلون یه لیست نشون میده که کلماتی رو که با حروف تایپ شده شما اغاز میشن، میتونید تو اون لیست ببینید. این میشه اون سورسی که شما گذاشتید.
حالا فرض کنید شما کلمه ای رو تایپ میکنید که تو گلاسری های بابیلون نیست، اون وقت بعد از چند لحظه، بابیلون میاد براتون کلماتی رو لیست میکنه که شباهت دارن به اون چیزی که شما تایپ کردید. این میشه اون چیزی که من میخوام.

ولی برای شما باید بگم که به نظر منم طبق گفته دوست عزیزمون آقا بهنام شما یه دیتا بیس کامل از کلمات نیاز داری و با الگو گرفتن از هوش مصنوعی برنامرو طراحی کنی

من که همون اول گفتم یه دیتابیس از کلمات دارم!
درضمن متاسفانه درمورد هوش مصنوعی (اگرچه این کلمه رو زیاد شنیدم) هیچ اطلاعی ندارم.


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

هر چند هنوز کدتون رو بررسی نکردم ولی ایده خوبی به نظر میرسه. فقط باید از نظر سرعت هم بررسی بشه!

____________________________
پ ن: احتمالا طی چند روز آینده به اینترنت دسترسی نداشته باشم رو همین حساب نمیتونم تو بحثتون مشارکت کنم و جواباتون رو بررسی کنم.
ولی با این همه خوشحال میشم اگه ایده دیگه ای هم دارید بگید! :چشمک:

سید حمید حق پرست
جمعه 26 اسفند 1390, 16:38 عصر
با سلام
برنامه اول رو برای آقا سید حمید گذاشته بودم
ممنون از شما ولی من با جستجو مشکل ندارم . بلکه منم اون چیزی که دوست عزیز ASedJavad میخواسن رو میخواستم اما با این تفاوت که بانک من txt هست

aria1o
جمعه 26 اسفند 1390, 16:46 عصر
آقا حمید اگه پست 17 رو چک کنی فکر کنم تا حدی جواب شما هم داخلش باشه

سید حمید حق پرست
جمعه 26 اسفند 1390, 17:52 عصر
ممنون از شما . خوب بود فقط مشکلاتی که داره اینه :
1- فرض کنید amir رو نوشتیم اگه یه حرف کم بنویسیم با توجه به حرف اول همه ی کلمه هایی که حرف اولشون a باشه رو لیست میکنه
2- اگه مطابق شکل زیر بنویسیم مشکل نداره و کلمه رو پیدا میکنه :
الف - ammir
ب - amiir
پ - amirr
ولی اگه بنویسیم aamir نتیجه ای مشاهده نمیشه و کلمه رو پیدا نمیکنه
و از این بحدوده خارج بشیم نتیجه ای مشاهده نمیشه
ولی بازم ممنون
روش کار میکنم ببینم چی میشه


یا علی (ع)

aria1o
جمعه 26 اسفند 1390, 19:20 عصر
تو پست 17 گفتم که ؛همینجوری اینو نوشتم ،برای نتیجه بهتر و بالا بردن تشخیص برنامه به چندتا حلقه و شرط نیاز داره
موفق باشی

ASedJavad
شنبه 12 فروردین 1391, 22:00 عصر
با سلام
با وارد شدن متن اشتباه کاربر، برنامه حرف به حرف کلمات را مقایسه میکنه نزدیک ترین کلمه از لحاظ تعداد حروف رو از لیست انتخاب میکنه و نمایش میده


سلام
این الگوریتم دوتا مشکل داره
اولین مشکل که ظاهرا قابل حله (چه جوری؟!:متفکر:) اینه که ترتیب حروف تو این الگوریتم لحاظ نمیشه.
مثلا فرض کنید کاربر میخواد کلمه "پاداش" رو سرچ کنه. و اشتباهی تایپ میکنه "باداش" طبق الگوریتم شما، کلمه "شاداب" با صد درصد حروف مشابه نزدیک ترین کلمه به مورد جستجو شده هست!
و مشکل دوم که خیلی هم اساسیه، مشکل کاهش سرعت با افزایش دیتابیس هست.

یه الگوریتم هم به ذهن خود من رسید که به این صورته:

بیایم کلماتی رو که دارای درصد خاصی حروف مشابه با کلمه جستجو شده هستن، رو جستجو کنیم.
مثلا اگه کاربر کلمه 5 حرفی "باداش" رو سرچ کرد، با استفاده از عملگر like کلمات 4 حرفی "*ب*د*ا*ش*" و "ب*ا*ا*ش*" و "*ب*ا*د*ش*" و "*ب*ا*د*ا*" و "*ا*د*ا*ش*" رو سرچ کنیم. و مثلا برای کلمات 10 حرفی، کلیه کلمات 8 حرفی رو (به شیوه مشابه) سرچ کنیم و ...

که این کار هم دو تا مشکل داره:
اولیش باز سرعت پایینه
و دومیش اینه که مثلا در یک کلمه 5 حرفی، کلماتی با دو تا اشتباه، پیدا نمیشن!

ASedJavad
دوشنبه 04 اردیبهشت 1391, 00:52 صبح
سلام مجدداینو تو تالار ویبی ایجاد کرده بودم، ولی جواب خوبی نگرفتم
گفتم منتقلش کنم اینجا شاید بهتر باشه!
تا یار چه را خواهد و میلش به چه باشد.

vbhamed
چهارشنبه 06 اردیبهشت 1391, 07:35 صبح
سلام

خب قاعدتا از راه هوش مصنوعي ميشه به الگوريتمهايي براي اين كار رسيد، اما يكي از ساده ترين و سريعترين راهها اينه كه يك ديكشنري قوي داشته باشيد نه البته 50 هزار تايي خيلي بيشتر از اينها، بهتره كلماتي كه بيشترين استفاده رو دارن پيدا كنيد بعد با توجه به تجربه اشتباهاتي كه در اون كلمه اتفاق ميفته رو هم حدس بزنيد البته در صورتيكه اشتباه نوشتن خودش يك كلمه معني دار ايجاد نكنه، بعد به عنوان يك ركورد كلمه اشتباه و درستش رو در ديتابيس درج كنيد مثلا به ازاي همون كلمات ژادشا، پاشاه و ... ركوردهايي درج كنيد و درستش كه همون پادشاه هست رو هم جلوش بنويسيد، البته تكميل اين ديكشنري ممكنه زمان ببره ولي حتي از هوش مصنوعي هم دقيقتر و سريعتر عمل مي‌كنه، ديكشنري هم كه تكميل شد ديگه بقيش ميش يك جستجوي ساده

اين راهي هست كه تو اكثر نرم افزارها مثل Office استفاده ميشه، مطمئنا گوگل هم حداقل به عنوان يكي از روشها و يا شايد هم تنها روش از اين راه استفاده مي‌كنه

ضمنا من براي آفيس 2003 غلط ياب املايي فارسي ديده بودم شايد بتونيد از ديكشنري اون استفاده كنيد