PDA

View Full Version : ایجاد اختلال در جستجو روی بانک (کلمه های عربی فارسی)



iranianprogrammers
پنج شنبه 16 فروردین 1386, 11:23 صبح
سلام دوستان .
من یک بانک اطلاعاتی شامل داستان و حدیث دارم .
موقعی که میخوام روی بانک جستجو کنم اگه زبان فارسی باشه هیچی پیدا نمیکنه و اگه زبان عربی باشه موارد زیادی رو پیدا میکنه .
مثلا در مورد کلمه ای مثل : ملکی در زبان فارسی زیر ی نقطه نداره ولی در زبان عربی زیر ی 2 تا نقطه داره .
یا کلمه ای مثل فدک در زبان فارسی ک سرکش داره ولی در زبان عربی ک سرکش نداره و یک حمزه داره ! .
دوستان این موضوع خیلی ضروریه واسم و کل پروژه م متوقف شده واسه این !
لطفا راهنمایی بفرمایید .

nasr
پنج شنبه 16 فروردین 1386, 11:56 صبح
از چه دیتابیسی استفاده می کنید؟

ghabil
پنج شنبه 16 فروردین 1386, 12:26 عصر
چند بار اینا اینجا گفته شده یک جستجو بکن

iranianprogrammers
پنج شنبه 16 فروردین 1386, 22:16 عصر
dbisam 4.21
در ضمن کل جدول index شده و از روش Full Text Search واسه جستجو استفاده میکنم .
میشه لطف کنید بگید با چه عنواوینی مطرح شده ؟

ghabil
پنج شنبه 16 فروردین 1386, 23:33 عصر
بیا این یک نمونش که در مورد Sort سوال کرده بودند :

اینو نگاه کن : ک ک این دوتا هردوشون کاف هستند اولی با کد یونیکد 1603 که کاف عربی هست و دومی با کد 1705 کد کاف فارسیه .

شما به دلیلی دارید کاف فارسی رو میگیرد و در دیتابیس ذخیره میکنید ; که طبیعتا سر جایی که شما انتظار دارید قرار نمیگیره .

راه حل ساده شما اینه که قبل از ذخیره دیتا همه کاف هارو تبدیل به کاف عربی بکنید و با یک دستور Update هم تمام دیتاهای موجود رو کاف عربی بکنید راه حل دیگتون اینه که یک ترتیب سرچ جدید برای DataBase تعیین کنید و با استفاده از اون سورت بکنید

ولی برای جستجو هم همینطوره یعنی باید همه کافها و ی ها رو یا عربی بکنید یا فارسی ، یا یک تابع مثلا توی SQL سرور تعریف کنید که مثلا همه کافهای فارسی رو به کاف عربی تبدیل کنه بعد شرطتون رو روی اون تابع بزارید که کار پرهزینه ای هست و بن نظر من همون یک بار پالایش دیتا کار بهتریه.

iranianprogrammers
جمعه 17 فروردین 1386, 00:17 صبح
سلام .
ممنون از توضیحاتتون .
مشکل اینه که اطلاعات الان خیلی وقته آماده شده و درون دیتابیس هست .
آیا بهتر نیست هنگام جستو کلمات مورد جستجو رو اسکن کنیم و در صورت وجود کاف فارسی اون رو تبدیل به عربی کنیم و جستجو رو انجام بدیم ؟
البته این یه تئوریه و از جواب دادنش مطمئن نیستم !
اما گفتم شما شاید در این زمینه تجربه ای داشته باشید .
ممنون میشم راهنمایی بفرمایید .

iranianprogrammers
جمعه 17 فروردین 1386, 00:19 صبح
راستی چطور میشه کد Unicode یک کارکتر رو فهمید ؟

ghabil
جمعه 17 فروردین 1386, 01:40 صبح
سلام .
ممنون از توضیحاتتون .
مشکل اینه که اطلاعات الان خیلی وقته آماده شده و درون دیتابیس هست .
آیا بهتر نیست هنگام جستو کلمات مورد جستجو رو اسکن کنیم و در صورت وجود کاف فارسی اون رو تبدیل به عربی کنیم و جستجو رو انجام بدیم ؟


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

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

حالا دیگه خود دانی.

من که برای دیدن مقایر یونیکد حروف از تابع unicodeCharAt جاوااسکریپت استفاده میکنم اما تو نرمافزارهای آفیس هم میتونی توی Insert Symbol ببینی.

solook
جمعه 17 فروردین 1386, 10:18 صبح
یا کلمه ای مثل فدک در زبان فارسی ک سرکش داره ولی در زبان عربی ک سرکش نداره و یک حمزه داره ! .
من هم همین مشکل رو داشتم .اگه برنامه شما کاملا فارسی هست بهترین راه اینه که
کل (ی و ک) داخل دیتابیس به فارسی replace کنی ..
البته (ی) اگه با زبان Arabic (Egyp) با شه هم با ی فارسی سازگاری داره هم با عربی

iranianprogrammers
جمعه 17 فروردین 1386, 12:22 عصر
بهترین راه اینه که
کل (ی و ک) داخل دیتابیس به فارسی replace کنی ..میشه لطف کنید query سازگار با DBISAM رو برای من مثال بزنید ؟.


من که برای دیدن مقایر یونیکد حروف از تابع unicodeCharAt جاوااسکریپت استفاده میکنم اما تو نرمافزارهای آفیس هم میتونی توی Insert Symbol ببینیکدهارو دارم .
میخوام مثلا کد Unicode کلماتی که برای جستجو وارد شدن رو بدست بیارم و مقایسه کنم .
تابع دلفی شو میخوام .

راستی یه چیزه جالب که متوجه شدم اینه که اگه به زبان فارسی ویندوز یه Farsi از نوع Arabic 101 اضافه بشه مشکل جستجو حل میشه ! (یعنی خودش ی و ک ) رو باحالتی که ذخیره شده در میاره .
البته اطلاعات ذخیره شده در دیتابیس همه کپی پیست از صفحات وب هست و مستقیم تایپ نشدن که بگیم موقع ورود اطلاعات Arabic 101 روی سیستم ورود اطلاعات نصب بوده .

iranianprogrammers
پنج شنبه 30 فروردین 1386, 21:19 عصر
دوستان میشه لطف کنید تابع اینکار رو برای DBISAM برام مثال بزنید .

SYNDROME
جمعه 31 فروردین 1386, 09:59 صبح
با سلام
البته یک روش دیگری که است شما می توانید یکی از فایلهایSystem32 فارسی را در کامپیوترهای دیگر نصب کنید که مربوط به صفحه کلید است(موقع نصب برنامه با یک Copy و Past ساده.
البته من نام این فایل را به خاطر ندارم.
اگر کسی مودونه بگه؟
اگر نام اون را پیدا کردم می گم.

alinikaein
دوشنبه 18 آبان 1388, 17:50 عصر
سلام.

اولاً كه فايل استاندارد صفحه كليد فارسي ويندوز XP، فايلي به نام kbdfa.dll با ورژن 5.0.2180.1 هست. كه آپلود كردم.

در ثاني در صورتي كه از كوئري استفاده مي‌كنيد، مي‌تونيد با جايگزيني موارد زير، براي كوئري‌هاتون استفاده كنيد:




function compatibledString(inputText: String): String;
var
counter, counter2, counter3: Smallint;
found: Boolean;
tempChar: Char;
begin
Result := '';
for counter := 1 to Length(inputText) do
begin
found := False;
tempChar := inputText[counter];
for counter2 := 1 to maxCompatibleGroupNumber do
begin
for counter3 := 1 to Length(compatibleCharGroup[counter2]) do
begin
if tempChar = compatibleCharGroup[counter2][counter3] then
begin
Result := Result + '[' + compatibleCharGroup[counter2] + ']';
found := True;
Break;
end; // if
end; // counter 3
end; // counter 2
if not found then
Result := Result + tempChar;
end; // counter
end;
كه داريم:



compatibleCharGroup: array [1..5] of String;
و


function readCompatibleChar: Byte;
var
F: TextFile;
Counter: Byte;
begin
AssignFile(F, ApplicationPath + '\Compatible.ini');
Reset(F);
Counter := 0;
while not (Eof(F)) and (Counter <= 5) do
begin
Counter := Counter + 1;
Readln(F, compatibleCharGroup[Counter]);
end;
CloseFile(F);
Result := Counter;
end;
كه فايل Compatible.ini كه آپلود كردم، حاوي حالات مختلف حرف كاف و حرف ي هست و قابليت اين را داره كه گسترش پيدا كنه و براي حروف مشابه ديگه هم شبيه‌سازي بشه.

در اين حالت، شما بايستي در ابتداي برنامه readCompatibleChar را صدا بزنيد.
بعد هر جايي كه خواستيد كوئري بگيريد، كلمه‌ي مورد نظرتون را با كمك تابع compatibledString تبديل كنيد به فرمتي كه حالت‌هاي مختلف را بتونه براي شما در نظر بگيره.


نكته:
در اين تابع از خواص SQL استفاده كردم.


يا علي... موفق باشيد...

robodanial
سه شنبه 11 آبان 1389, 21:30 عصر
میشه یک لطفی بکنین و بگین این متغیر maxCompatibleGroupNumber چیه و نحوه تعریف کردنشو بنویسین؟