PDA

View Full Version : پیدا کردن کلمات مشابه



sajjadrad
جمعه 29 بهمن 1389, 02:19 صبح
سلام دوستان
در دستور select امکان این هست که مقادیر مشابه هم بازیابی بشه؟
مثلا میخوام کلمات مشابه با کلمات وارد شده بازیابی بشه...
با دستور like نتونستم چون در بهترین حالت باید لغت کامل تو یه لغت دیگه باشه...
منظورم اینه که مثلا اگه hillo وارد شد بشه تشخیص داد که لغت صحیحش hello هست...اینا تو یه حرف فرق دارن اما امکان داره این اشتباه در هر کدوم از حروفش باشه به همین دلیل نتونستم از like استفاده کنم.
در کل به دنبال طراحی یه جستجو هستم...مثلا شبیه جستجوی گوگل؛وقتی که یه لغت رو اشتباه مینویسید صحیحش میکنه.

مرسی

Reza_Yarahmadi
جمعه 29 بهمن 1389, 10:49 صبح
پیدا کردن کلمات مشابه با یک دستور امکان پذیر نیست و باید برای اون ابتدا الگوریتمی ارائه بدید و بعد اونو پیاده سازی. مثلا کاراکترها رو یکی با همدیگه چک کنید و در صورت اینکه تعداد کاراکترهای مابه از درصد خاصی بیشتر بود اونو به عنوان کلمه مشابه برگردونه (این یک مثال بود).
جدای از مسائل الگوریتمی شما باید یک دایره لغت کامل داشته باشید تا بتونید مثل گوگل کلمات مشابه رو نمایش بدید.
در کل تقریبا وقت زیادی رو باید صرف کنید تا بتونید این کار رو کامل و بدون نقص انجام بدید.

sajjadrad
جمعه 29 بهمن 1389, 12:04 عصر
من یه دایره لغت از لغاتی که تو برنامه استفاده کردم رو تهیه کردم و میخوام که لغات رو با اونا مقایسه کنم اما نمیدونم که این روش مقایسه به چه صورته...میشه کمی راهنمایی کنید.
البته یه چیزایی پیدا کردم:


SELECT
*
FROM
Tasks
WHERE TypeID IN
(SELECT TypeID FROM Tasks
GROUP BY TypeID HAVING COUNT(*) > 1)
مرسی

Reza_Yarahmadi
جمعه 29 بهمن 1389, 12:47 عصر
نمیدونم این کدی که گذاشتید قراره چه کاری انجام بده و چطور میخواد این مشکل رو حل کنه :متفکر:
شما بعد از پیدا کردن الگوریتم مورد نظرتون ، اونو در قالب یک Function که 2 مقدار رشته ای میگیره و در صورت مشابه بودن 1 و در غیر اینصورت 0 برمیگردونه پیاده سازی کنید و بصورت زیر ازش استفاده کنید

Select *
From WordsTable
Where
dbo.YourFunction(Word, @YourWord) = 1

sajjadrad
جمعه 29 بهمن 1389, 14:43 عصر
اونو نمیدونم چون تو یه سایت پیدا کردم
خیلی ممنون از راهنماییتون...
من یه تابع واسه مقایسه دو رشته نوشتم :



public int compareString(string str1,string str2)
{
int strl1 = str1.Length;
int strl2 = str2.Length;
bool str1b = false;
int min = 0, counter = 0;
if (strl1 > strl2)
{
min = strl1 - 1;
str1b=true;
}
else
{
min = strl2 - 1;
}
bool lok = false;
if (str1b)
{
if (strl2 == min || strl2 == strl1)
{
lok = true;
}
if (lok)
{
for (int i = 0; i < min; i++)
{
if (str1[i] == str2[i])
{
counter++;
}
else if (str2[i] == str1[i+1])
{
counter++;
}
}
if (counter > min - 2)
{
return 1;
}
return 0;
}
else
{
return 0;
}
}
else
{
if (strl1 == min || strl1 == strl2)
{
lok = true;
}
if (lok)
{
for (int i = 0; i < min; i++)
{
if (str1[i] == str2[i])
{
counter++;
}
else if (str1[i] == str2[i + 1])
{
counter++;
}
}
if (counter > min - 2)
{
return 1;
}
return 0;
}
else
{
return 0;
}
}
}


اگه میشه اینو تست کنید و اگه موردی پیدا کردید که درست کار نمیکنه بهت تذکر بدید...
من چندتا نکته رو در نظر گرفتم....
یکی اینکه تفاوت تعداد حروف ها حداکثر یکی باشه
حرفی که اشتباه ذکر شده حداکثر یدونه باشه...حالا هر جا که باشه وسط رشته اول رشته و یا آخر رشته ...
مرسی

sajjadrad
جمعه 29 بهمن 1389, 14:52 عصر
بعدش وقتی اجرا کردم این خطای sql رو داد:


Cannot find either column "dbo" or the user-defined function or aggregate "dbo.compareString", or the name is ambiguous.

در ضمن من ازاین کمند استفاده کردم:


Select* From words Where dbo.compareString(word, '"+str+"') = 1

Reza_Yarahmadi
جمعه 29 بهمن 1389, 15:46 عصر
بعدش وقتی اجرا کردم این خطای sql رو داد:
خب دوست عزیز شما دارید یک متد #C رو توی دستور SQL صدا میزنید!! من خدمت شما عرض کردم یک Function توی SQL Server تعریف کنید و اونو توی دستور صدا بزنید.
همین متدی که نوشتید رو بصورت Function توی SQL Server بذارید و با همون دستوری که نوشتید ازش استفاده کنید. در صورتی که با نحوه نوشتن Function آشنا نیستید توی تالار SQL Server جستجو کنید.

sajjadrad
شنبه 30 بهمن 1389, 00:01 صبح
خب من یه صفحه پیدا کردم کلیک کنید (http://barnamenevis.org/showthread.php?270669-function-رو-برای-چی-استفاده-می-کنند&highlight=function+%D8%AF%D8%B1+sql)
الان اگه function رو آماده کنم کجا باید بنویسمش؟
منظورم اینه که کجا قرار بدم؟

بعدش اینکه فقط درباره قالب اصلی توضیح داده شده
من چطور میتونم از دستور های if و ... استفاده کنم؟

Reza_Yarahmadi
شنبه 30 بهمن 1389, 07:51 صبح
الان اگه function رو آماده کنم کجا باید بنویسمش؟
منظورم اینه که کجا قرار بدم؟

Function رو به ساختار بانك اضافه ميكنند (توي فايل بانكتون مثل جداول ،Viewها ، SPها ، تريگر ها و ....). بعد از اينكه Function رو نوشتيد كافيه يكبار روي بانك اجرا كنيد تا توي اون ساخته بشه. بعد از ساخت ديگه نيازي به اجراي مجدد دستور ساختش نيستيد و كافيه هر جا نياز داشتيد به همون صورتي كه بالا عرض كردم استفاده كنيد.

بعدش اینکه فقط درباره قالب اصلی توضیح داده شده
من چطور میتونم از دستور های if و ... استفاده کنم؟
بهتره يك مقدار درمورد TSQL مطالعه كنيد. پيشنهاد ميكنم مقاله زير رو كه آقاي كفاش زحمتش رو كشيدند حتما مطالعه كنيد تا با نحوه كد نويسي توي SQL Server آشنا بشيد.
http://barnamenevis.org/showthread.php?106494-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AA%D8%AD%D8%AA-SQLServer&highlight=