PDA

View Full Version : گفتگو: هوش مصنوعی در برنامه چت با روبات



_behnam_
چهارشنبه 29 دی 1389, 14:02 عصر
سلام دوستان
همین اول بگم که عنوان این تاپیک گفتگو هستش , من درخواست پروژه ندادم (واسه مدیران که بعدا نگن خودتون دست به کیبرد بزنید :لبخند:)
دوستان میخوام تو پروژم به برنامه هوش مصنوعی بدم به طوری که وقتی میخوای باش مکالمه کنی راحت بفهمه داری چی میگی. بفهمه ای جوابی که دادی ربطی به سوالی که پرسید داشت یا نه , 100ٍ% میدونم میشه
حالا واسه مرحله اول میخوام جمله ای رو که بهش میدم کلماتشو جدا کنه , بعد یکی یکی فیلتر کنه و بعد با اون کلمه ای که تو دیتابیس گذاشتم مقایسه کنه
مثلا من تو دیتابیس کلمه زیر رو بهش دادم

salamحالا وقتی بهش جمله زیر یا مشابه اونو میدم جوابیو که واسه سلام تعیین کردم بهم میده

azizam saalaaaaaaaaaaaaaaaaaamاول میاد کلمات جمله رو از هم جدا میکنه بعد کلمات رو فیلتر میکنه , یعنی اگه چندتا حرف پشت سر هم تو کلمه باشه اونارو به یکی تبدیل میکنه
مثلا saaaaaaaaaaaaaaaaaalaaaaaaaaaaaaam >>>> salam
خوب تا اینجا درست

اما مشکل من اینجاست
اگه من تو دیتابیس واسه کلمم 2تا حرف پشت سر هم بزارم دیگه اونو پیدا نمیکنه
مثلا من بهش کلمه زیر رو میدم

khoobiاگه کسی این جمله رو بده

saaaaaaaaaaalamm khooooooooooooooobiiiiکلمات فیلتر میشه
saaaaaaaaaaalamm = salam
khooooooooooooooobiiii = khobi
همه حرفا میشه یکی در نتیجه khobi با khoobi نا برابر میشه و جوابی پیدا نمیشه
حالا من دنبال راه حلی میگردم که اگه تو دیتا بیس کلمه khoobi رو مشخص کرده باشم دیگه
khoooooooooooooobiiiiii به khobi تبدیل نشه
بلکه بشه khoobi
نه تنها واسه خوبی بلکه واسه همه کلمات اینجوری باشه؟
خدا کنه تونسته باشم منظورم رو برسونم
================

اساتید به نظر شما من واسه اینکار باید چه مراحلی رو طی کنم ؟؟؟
میشه توضیح بدید ؟؟ :لبخندساده:

ممنون/

quiet_programmer
چهارشنبه 29 دی 1389, 16:40 عصر
ببخشینا ولی اگه درس هوش مصنوعی رو پاس میکردین به این کاری که شما میکنین نمیگفتن هوش مصنوعی میگفتن دیکشنری.

یه دیکشنری سرچ کنی به جوابت میرسی.

در ضمن برای این کار میتونی از گراف وضعیت استفاده کنی مثل دیکشنری گوشی ها (T9)

vbhamed
چهارشنبه 29 دی 1389, 17:01 عصر
سلام
خب كامپيوتر از كجا بايد بفهمه منظور كاربر واقعا khobi بوده يا khoobi ؟

_behnam_
چهارشنبه 29 دی 1389, 21:38 عصر
سلام
خب كامپيوتر از كجا بايد بفهمه منظور كاربر واقعا khobi بوده يا khoobi ؟
خوب اول و آخر او کلمه رو که میخوای با ستاره تعیین کنی
*khoobi*

_behnam_
چهارشنبه 29 دی 1389, 21:44 عصر
ببخشینا ولی اگه درس هوش مصنوعی رو پاس میکردین به این کاری که شما میکنین نمیگفتن هوش مصنوعی میگفتن دیکشنری.

یه دیکشنری سرچ کنی به جوابت میرسی.


خیلی شرمنده که اینو میگم :
اگه پستمو با دقت میخوندید متوجه میشدید که گفتم :
دوستان میخوام تو پروژم به برنامه هوش مصنوعی بدم به طوری که وقتی میخوای باش مکالمه کنی راحت بفهمه داری چی میگی. بفهمه ای جوابی که دادی ربطی به سوالی که پرسید داشت یا نه , 100ٍ% میدونم میشه

و گفتم که واسه مرحله اول :

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

اگه به فهمیدن مفهوم کلمات میگن دیکشنری , پس حتما ما آدما جای هوش دیکشنری تو کلمونه


بازم از اینکه خواستید کمک کنید ممنوم میشم /

vbhamed
چهارشنبه 29 دی 1389, 23:49 عصر
خوب اول و آخر او کلمه رو که میخوای با ستاره تعیین کنی
*khoobi*

سلام

منظورم اين بود كه اگر كاربر داد *khoooooooobi*، حالا كامپيوتر از كجا بايد بفهمه منظور واقعي كاربر khobi هست يا khoobi

_behnam_
پنج شنبه 30 دی 1389, 00:22 صبح
سلام

منظورم اين بود كه اگر كاربر داد *khoooooooobi*، حالا كامپيوتر از كجا بايد بفهمه منظور واقعي كاربر khobi هست يا khoobi

vbhamed جون من یه برنامه داشتم ربات یاهو بود . این قادر بود باهات صحبت کنه یعنی چرت و پرت رو از هم تشخیص میداد و میدونست که منظور از khoobi چیه
حالا حتما میگی چطور ؟
اومده بود یه دستور <subject> گذاشته بود
وقتی ربات از تو سوال میپرسید تو میتونستی چندین جواب واسش در نظر بگیری اگه جوابی که کاربر داد جزء جواب های از قبل تعیین شده باشه ربات دوباره جوابتو میداد اما اگه تو اون جوابا نبود ربات پیدا نمیکرد تشخیص میداد که تو یه چیزی که مرتبت با او موضوع نیستو جواب دادی
مثلا ربات میپرسه خوبی؟
تو میای واسه جوابش اینهارو تاین میکنی؟
مرسی = خدارو شکر
تو بهتری = نه بابا
نه = چیزی شده؟
بتوچه = اینم حرفیه
حالا ربات از کاربر میپرسه خوبی؟ تو جوابت یکی از ایناست مثلا میگی , مرسی ربات میگه خدارو شکر
حالا یه جوابم واسش تاین میکنی که اگه غیر از این چنتا بود یه چیزه دیگه بگه
مثلا در جوابش بگی : داره بارو میاد
ربات میگه : من حالتو پرسیدم تو میگی داره بارون میاد
یه چیزی تو این مایه ها میشه که برنامه کلماتو تشخیس میده

xxxxx_xxxxx
پنج شنبه 30 دی 1389, 01:03 صبح
سلام،

ببخشینا ولی اگه درس هوش مصنوعی رو پاس میکردین به این کاری که شما میکنین نمیگفتن هوش مصنوعی میگفتن دیکشنری.کاری که مد نظر ایشون هست در این قسمت از هوش مصنوعی قرار داره:
یادگیری ماشینی (Machine Learning) ------> تطبیق الگو (Pattern Matching) -------> عبارات با قاعده (Regular Expression)

در رابطه با عبارات با قاعده تحقیق کنید.

چون بحث برنامه نویسی مطرح نیست، تاپیک رو به بخش هوش مصنوعی منتقل می کنم. (عنوان تاپیک نیز اصلاح/تکمیل شد)

vbhamed
پنج شنبه 30 دی 1389, 06:43 صبح
vbhamed جون من یه برنامه داشتم ربات یاهو بود . این قادر بود باهات صحبت کنه یعنی چرت و پرت رو از هم تشخیص میداد و میدونست که منظور از khoobi چیه
حالا حتما میگی چطور ؟
اومده بود یه دستور <subject> گذاشته بود
وقتی ربات از تو سوال میپرسید تو میتونستی چندین جواب واسش در نظر بگیری اگه جوابی که کاربر داد جزء جواب های از قبل تعیین شده باشه ربات دوباره جوابتو میداد اما اگه تو اون جوابا نبود ربات پیدا نمیکرد تشخیص میداد که تو یه چیزی که مرتبت با او موضوع نیستو جواب دادی
مثلا ربات میپرسه خوبی؟
تو میای واسه جوابش اینهارو تاین میکنی؟
مرسی = خدارو شکر
تو بهتری = نه بابا
نه = چیزی شده؟
بتوچه = اینم حرفیه
حالا ربات از کاربر میپرسه خوبی؟ تو جوابت یکی از ایناست مثلا میگی , مرسی ربات میگه خدارو شکر
حالا یه جوابم واسش تاین میکنی که اگه غیر از این چنتا بود یه چیزه دیگه بگه
مثلا در جوابش بگی : داره بارو میاد
ربات میگه : من حالتو پرسیدم تو میگی داره بارون میاد
یه چیزی تو این مایه ها میشه که برنامه کلماتو تشخیس میده


سلام

ولي شما باز هم متوجه منظور من نشدين
من اصلا كاري به اين ندارم كه شما مي خواين چه استفاده اي كنيد، من خودم هم برنامه كلنجار رو ديدم كه تايپ مي كني جواب مي ده
منظور من چيزي ديگه هست، فرض كنيد كاربر از كامپيوتر سؤال مي كنه :

كرم كجاست ؟

خب حالا كامپيوتر از كجا بفهمه منظور كاربر اينه كه كِرِم (ماده آرايشي) كجاست يا اينكه كَرَم (شخصي به نام كَرَم) كجاست يا فلز كُرُم كجاست يا اينكه معني اينه كه من ناشنوا هستم (كر هستم)

شما گفتي اگر حروف تكراري حذف بشن مثلا khoooooooobi بشه khobi اونموقع كاربر اگر منظور واقعيش كلمه khoobi باشه به مشكل مي خوريد
ولي مسئله اينه كه كامپيوتر كه نمي تونه بفهمه منظور واقعي كاربر چي بوده كه حالا يه طوري بعضي جاها كلمه به khoobi تبديل بشه و بعضي جاها به khobi

در حقيقت كاربر بايد با يك قانوني اين رو به كامپيوتر بفهمونه
مثلا كلمه دور و در (مرواريد) رو در نظر بگيريد، هر دوشون مي تونن اشتباها نوشته بشن doooooor
كامپيوتر بايد اين رو يا به dor تبديل كنه يا door
بهتره در اينجا به عنوان راهنما به كاربر بگيد اگر منظورش دور هست تايپ كنه dur يعني از u استفاده كنه ولي اگر مرواريد منظورشه تايپ كنه dor يعني از O استفاده بشه حالا چه اشتباها duuuuuuur و چه اشتباها doooooor نوشته بشه ديگه ميشه راحت درستش كرد

namaz17
پنج شنبه 30 دی 1389, 13:11 عصر
مي تونيد توي الگوريتم فيلترتون بررسي كنيد كه قبل از اينكه تعداد كاركترهاي تكراري به 1 برسه اونو تو ديتابيس جستجو كنه. اگه وجود داشت همونجا فيلتر رو متوقف كنه

_behnam_
پنج شنبه 30 دی 1389, 14:02 عصر
سلام

ولي شما باز هم متوجه منظور من نشدين
من اصلا كاري به اين ندارم كه شما مي خواين چه استفاده اي كنيد، من خودم هم برنامه كلنجار رو ديدم كه تايپ مي كني جواب مي ده
منظور من چيزي ديگه هست، فرض كنيد كاربر از كامپيوتر سؤال مي كنه :

كرم كجاست ؟

خب حالا كامپيوتر از كجا بفهمه منظور كاربر اينه كه كِرِم (ماده آرايشي) كجاست يا اينكه كَرَم (شخصي به نام كَرَم) كجاست يا فلز كُرُم كجاست يا اينكه معني اينه كه من ناشنوا هستم (كر هستم)

شما گفتي اگر حروف تكراري حذف بشن مثلا khoooooooobi بشه khobi اونموقع كاربر اگر منظور واقعيش كلمه khoobi باشه به مشكل مي خوريد
ولي مسئله اينه كه كامپيوتر كه نمي تونه بفهمه منظور واقعي كاربر چي بوده كه حالا يه طوري بعضي جاها كلمه به khoobi تبديل بشه و بعضي جاها به khobi

در حقيقت كاربر بايد با يك قانوني اين رو به كامپيوتر بفهمونه
مثلا كلمه دور و در (مرواريد) رو در نظر بگيريد، هر دوشون مي تونن اشتباها نوشته بشن doooooor
كامپيوتر بايد اين رو يا به dor تبديل كنه يا door
بهتره در اينجا به عنوان راهنما به كاربر بگيد اگر منظورش دور هست تايپ كنه dur يعني از u استفاده كنه ولي اگر مرواريد منظورشه تايپ كنه dor يعني از O استفاده بشه حالا چه اشتباها duuuuuuur و چه اشتباها doooooor نوشته بشه ديگه ميشه راحت درستش كرد
اما اگه به اون روشی که گفتم عمل بشه (یعنی جواب هارو از پیش تایین کنیم) در صد اشتباه کاهش پیدا میکنه
من با این روش رباتمو جوری طراحی کردم که حتی وقتی بهش فش میدادی باهات قهر میکرد و تا زمانی که معذرت خواهی نمیکردی دیگه جوابتو نمیداد

quiet_programmer
پنج شنبه 30 دی 1389, 15:58 عصر
با سلام.

از اونجایی که معلومه تو میخوای یه دیتا بیس داشته باشی که یه سری کلید و یه سری مقدار داشته باشی.

مثلا میخوای یه کلید با مقدار مثلا Khobi داشته باشی و چند مقدار برای این کلید. مثلا مرسی، ممنون، تو چطوری و...

تا اینجا درست؟

خوب الان مشکل تو اینجاست که مثلا کاربر Khobi رو به صورت Khooooooooooobbbbbbbbbbbiiiiii ویا به شکل های دیگه وارد میکنه. ولی شامل کاراکترهای (به ترتیب) k وبعد h و یعد O وبعد b و بعد i.

درست؟

تو میخوای این رو تبدیل به Khobi یا همون کلیدت کنی.

اگه تا اینجا درست متوجه شده باشم پس راه حل تو برای این کار اینه که با عبارات منظم کار کنی. برای این کار هم باید برای تمامی کلیدهای خودت یه دیاگرام بکشی(درس نظریه زبانها و ماشین)

اما خوب خودت هم به خوبی میدونی که کار زمانبریه. برای اینکه تو زمانت صرفه جویی بشه میتونی عبارات منظم رو تو یه فایل متنی بنویسی بعد بدی به ابزار Lex تا کد رو تولید کنه.

اینجا من یه مثال برات میزارم. یه فایل cpp که حتما باید با کامپایلر Bcc32.exe کامپایل کنی. این فایل رو ابزار lex تولید کرده. از روی عبارات منظم فایل RE.L. فایل EXE هم میزارم که اگه کامپایلر Bcc32..exe رو نداشتی از اون استفاده کنی.

تو این برنامه بعد از اجرا اگه کلمه Khobi رو به هر شکلی که به نظرت میاد تایپ کنی اون رو به Khobi تبدیل میکنه.(فقط یادت باشه که ترتیب قرار گرفتن کاراکترهای KHOBI مهمه.) یعنی این برنامه برای hkobi جواب نمیده.


خوب این فقط برای کلمه khobi بود اما اگه میخوای کلمات دیگه ای هم بهش اضافه کنی عبارت منظمشو بنویس تو فایل RE.l و بعد بده به ابزار lex تا برات کد تولید کنه.

در ضمن اگه من کد cpp تولید کردم وگذاشتم اینجا فقط به خاطر این بود که الان فقط این ورژن از ابزار Lex در اختارم بود ولی تو میتونی ورژنهای دیگه ای از این ابزار پیداکنی که عبارات منظم تو رو به فایل C# ویا جاوا و یا هر زبان دلخواه دیگر تبدیل کنه.

اگه در مورد سینتکس فایل re.l هم به مشکلی برخورد کردی بگو تا اگه سوادم قد داد جواب بدم.

_behnam_
پنج شنبه 30 دی 1389, 19:26 عصر
ممنون اما من ویژوال بیسیک مد نظرم بود . نه زبان های دیگه

quiet_programmer
جمعه 01 بهمن 1389, 12:22 عصر
خوب اگه این همون چیزیه که شما میخواین بگین تا 2تا راه حل بگم برات

_behnam_
جمعه 01 بهمن 1389, 15:09 عصر
خوب اگه این همون چیزیه که شما میخواین بگین تا 2تا راه حل بگم برات
من این کارو تو پروژه انجام دادم , یعنی تبدیل khooooooooooooooooooobbbbbbbbbbbbiiiiii به خوبی و یا تبدیل ssssssaaaaaaaaaaaaaaaaaaaaaaalllllllaaaaaaaaaaaaaa aaaal به salam
اما مشکل من اینجاست که
اگه من تو دیتا بیس khoobi رو بزارم دیگه بعد از فیلتر شدن khooooooooooooobiiiiii دیگه باهم جور در نمیان
khooooooooooooooooooooobbiiiiiiii >> khobi در نتیجه khoobi <> khobi
من میخوام اگه تو دیتا بیس به جای khobi بیام khoobi رو بزارم دیگه khoooooooooobiiiiiiiiiiiii به khobi تبدیل نشه
بلکه به khoobi تبدیل بشه .
دوست عزیز اون کدیو که شما گذاشتی من خیلی ازش سر در نیووردم
اما فقط فهمیدم که اومده بودین حروف اصلیه کلمرو انتخواب کرده بودین مثل (k).(h).(o).(b).(i) که حرفای خوبی هست
حالا یه سوال از شما دارم :
آیا اگه تو این کد (k).(h).(o).(o).(b).(i) این رو انتخاب کنیم دیگه برنامه khoobi رو نشون میده؟
یعنی حروف o رو به 2 تا تبدیل میکنه ؟؟
اگه اینجوری باشه شاید اون چیزی باشه که من میخوام

quiet_programmer
جمعه 01 بهمن 1389, 17:21 عصر
بله دقیقا.
فقط این یه اضافه کاریه، از اونجایی که Khoobi زیر مجموعه عبارت منظم تعریف شده است کافیه بیای بجای Cout<<"Khobi" بنویسی cout<<"Khoobi"

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


(k)+(h)+(o)+(b)+(i){cout<<"Khobi";}این یه عبارت منظمه که میگه اول K بیاد اون علامت + مشخص میکنه که این کاراکتر h یک یا بیشتر بار میتونه تکرار بشه. بعد h هم به همین ترتیب یعنی اصل کاریه اون علامت +ه. و الی آخر

در نهایت اگه اون عبارت منظم با رشته ی ورودی مطابقت کرد اونوقت دستور Cout<<"Khobi" اجرا میشه.

ببین با عبارات منظم میشه هر رشته ای که مد نظرت هست رو تولید کنی.
علاوه بر علامت + که معنی حداقل یک میده علامتهای دیگه ای هم داریم که معانی مختلفی میده. مثلا اگه بعد از یه کاراکتر علامت * بزاری یعنی اینکه اون کاراکتر میتونه اصلا تو رشته ی ورودی وجود نداشته باشه یا به تعداد بینهایت بار تکرار بشه. یا علامت ? یعنی وجود اون کاراکتر اخیاریه یعنی هم میتونه نیاد و اگر هم میاد به تعداد یکبار بیاد و ...

هرجا که نوشتم کاراکتر میتونه بجاش رشته هم قرار بدی مثلا


(ID)*23این عبارت با رشته های زیر مطابقت میکنه.

23
ID23
IDID23
IDIDID23
IDIDIDID....23

امیدوارم که متوجه شده باشی.

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

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

_behnam_
جمعه 01 بهمن 1389, 17:41 عصر
بله دقیقا. ببین فکر کنم اگه اول تو رو با عبارات منظم آشنا کنم بد نیست و میتونه کمک حالت باشه.


(k)+(h)+(o)+(b)+(i){cout<<"Khobi";}این یه عبارت منظمه که میگه اول K بیاد اون علامت + مشخص میکنه که این کاراکتر h یک یا بیشتر بار میتونه تکرار بشه. بعد h هم به همین ترتیب یعنی اصل کاریه اون علامت +ه. و الی آخر
پس اگه بین o و b یه o دیگه اضافه کنی یعنی بعد o اول حتما باید یه o دیگه هم بیاد.
در نهایت اگه اون عبارت منظم با رشته ی ورودی مطابقت کرد اونوقت دستور Cout<<"Khobi" اجرا میشه.

ببین با عبارات منظم میشه هر رشته ای که مد نظرت هست رو تولید کنی.
علاوه بر علامت + که معنی حداقل یک میده علامتهای دیگه ای هم داریم که معانی مختلفی میده. مثلا اگه بعد از یه کاراکتر علامت * بزاری یعنی اینکه اون کاراکتر میتونه اصلا تو رشته ی ورودی وجود نداشته باشه یا به تعداد بینهایت بار تکرار بشه. یا علامت ? یعنی وجود اون کاراکتر اخیاریه یعنی هم میتونه نیاد و اگر هم میاد به تعداد یکبار بیاد و ...

هرجا که نوشتم کاراکتر میتونه بجاش رشته هم قرار بدی مثلا


(ID)*23این عبارت با رشته های زیر مطابقت میکنه.

23
ID23
IDID23
IDIDID23
IDIDIDID....23

امیدوارم که متوجه شده باشی.

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

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

دوست عزیز واقعا ممنون که راهنمایی کردی , امکانش هست یه مثال کوچولو واسه ویژوال بزنی یا راهنمایی کنی چطور میتونم از عبارات منظم تو ویژوال استفاده کنم
ممنون /

quiet_programmer
جمعه 01 بهمن 1389, 18:06 عصر
فقط قبل از اینکه این مطلب رو بخونی اون مطلبی که قبلا نوشتم رو بخون چون خط اول رو ویرایش کردم.

ببین تو از عبارات منظم تو هیچ کدوم از زبانها نمیتونی استفاده کنی. فقط باید عبارات منظم رو داخل یه ویرایشگر متنی بنویسی بعد بدی به ابزار Lex تا کد رو تولید کنه. همونطور که قبلا هم گفته بودم از ابزار Lex ورژنهای مختلفی وجود داره. به این شکل که یکی از این ابزارها کد c تولید میکنه یکی کد C# تولید میکنه یکی جاوا تولید میکنه و الی آخر. ولی دقیقا مطمئن نیستم که ابزار Lex برای تولید کد vb6 وجود داره یا نه. ولی VB.Net هست.

خوب ولی اگه این ابزار برای تولید کد vb6 وجود نداشته باشه باید به یکی از دو روش زیر استفاده کنی

1. اينکه بياي خودت براي کليه کليدها يه عبارت منظم بنويسي و بعد دياگرام بکشي براش وبعد با استفاده از وبي اون ديگرام رو تبديل به کد کني. (کار آسونيه فقط براي کليدهاي زياد واقعا زمانبره).
2. اين روش رو من پيشنهاد ميکنم. برنامه CPP رو طوري بنويسي که رشته ي ورودي رو به صورت پارامتر بخونه و رشته مورد نظر رو تو خروجي چاپ کنه. بعد از اين برنامه يه فايل exe توليد کني. اونوقت ميتوني از اين فايل تو برنامه وبي استفاده کني.

مثلا: اگه فايل exe تو اسم Lexer رو داشته باشه با اجرا به صورت:


Lexer.exe "Khoooooobiiiiiii"تو خروجي چي چاپ ميکنه؟ Khobi

اونوقت مياي تو برنامه VB اين فايل رو به صورت زير اجرا ميکني.

shell("Lexer.exe "+""""+SString+""""+" >C:\1.txt",VBHide)SString همون کليديه که کاربر وارد کرده. پس اگه کاربر Khoooooooooobbbbbbbbbiiiiiii رو وارد کرده باشه با اجرا به صورت کد بالا تو زبان vb کليد Khobi ميره تو فايل c:\1.txt. بعد ديگه خود بخوان شرح اين ماجرا

باز اگه خواستی بگو در مورد روش اول و روش دوم توضیح بدم

_behnam_
جمعه 01 بهمن 1389, 18:39 عصر
1. اينکه بياي خودت براي کليه کليدها يه عبارت منظم بنويسي و بعد دياگرام بکشي براش وبعد با استفاده از وبي اون ديگرام رو تبديل به کد کني. (کار آسونيه فقط براي کليدهاي زياد واقعا زمانبره).
در این مورد توضیح میدی؟

titan_550
شنبه 02 بهمن 1389, 11:52 صبح
زیاد وارد نیستم ولی فکر می کنم بتونی با الگوریتم ژنتیک و پیدا کردن توالی khoobi در رشته مورد نظرت به جواب برسی. یعنی اگر نتیجه مقایسه دو رشته یک توالی 6 تایی (تعداد کارکتر هایkhoobi) بود.(یعنی توالی کاملی از رشته معیار در رشته ورودی وجود داشته باشد)
ولی در این حالت این چیز ها رو هم به عنوان ورودی صحیح می گیره: khouooooubi یا kXXhooooooooooobiiiiiii

quiet_programmer
یک شنبه 03 بهمن 1389, 20:26 عصر
سلام. شرمنده که دیر کردم به خاطر کنکور و درس:لبخند:

آره میگفتم برای این کار اول باید با عبارات منظم آشنابشی و بعد بتونی براش دیاگرام بکشی. مثلا الان من یه دیاگرام برای کلمه Khoobi و Khobam رسم کردم.

65439

تو این دیاگرام رو به شکل زیر کد میکنی. فرض میکنیم یه کلمه توسط کاربر نوشته شده میخوایم ببینیم که این کلمه توسط این دیاگرام قابل قبوله یا نه.
اول یه کاراکتر میخونی اگه برابر K بود به State بعدی میری ولی اگه چیزی بجز K خونده شد مثلا F اونوقت تو نمیتونی به حالت دیگه بری پس این رشته ی ورودی توسط این گرامر قابل قبول نیست ولی اگه بازم k خونده شد تو همون State باقی میمونی تا یه o بخونی بعد با دیدن O به حالت بعدی میری. بعد یه کاراکتر دیگه میخونی اگه o بود میری به State بعدی و اگه b بود به اون Stateی میری که یال B هدایت میکنه و همینطور ادامه میدی تا به Final State برسی. Final State هم همونیه که با 2تا دایره نشون داده شده. اگه تونستی توسط یه رشته ی ورودی برسی به Final State پس اون رشته توسط گرامر یا بطور دقیق تر آتوماتون پذیرفته شده و تو میتونی توی Final State بگی که کاربر منظورش از این رشته چی بوده.

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

موفق باشی. امیدوارم تا 30ام مشکلت حل شده باشه.

البته بخشین تو این دیاگرام H از قلم افتاده

xxxxx_xxxxx
دوشنبه 04 بهمن 1389, 05:14 صبح
سلام،

اگه بازم k خونده شد تو همون State باقی میمونی تا یه o بخونی بعد با دیدن O به حالت بعدی میری. بعد یه کاراکتر دیگه میخونی اگه o بود میری به State بعدی و اگه b بود به اون Stateی میری که یال B هدایت میکنه
نیازی به دو State برای حرف O نیست. میشه هر دو رو ترکیب کرد. مگه نه؟


_behnam_ @
من که تو همون پست شماره 8 گفتم از عبارات با قاعده استفاده کنید.
برای اینکه بتونید از عبارات با قاعده در VB6 استفاده کنید، باید از کتابخانه vbscript استفاده کنید. (از منوی Project، گزینه References رو انتخاب کنید و بعد از بین لیست dll ها گزینه Microsoft VBScript Regular Expressions 5.5 رو انتخاب کنید)

quiet_programmer
دوشنبه 04 بهمن 1389, 12:15 عصر
با سلام.

چون جناب behnam عزیز فرموده بودند که Khoobi باید اکسبت بشه نه Khobi بخاطر اونه که دوتا State برای O در نظر گرفتم.

راستی اگه امکان داره در مورد Regular Experssions تو محیط vb توضیح بدبد؟

xxxxx_xxxxx
دوشنبه 04 بهمن 1389, 15:15 عصر
چون جناب behnam عزیز فرموده بودند که Khoobi باید اکسبت بشه نه Khobi بخاطر اونه که دوتا State برای O در نظر گرفتم.این کار اشکالی نداره، اما یک کار اضافی هست.


راستی اگه امکان داره در مورد Regular Experssions تو محیط vb توضیح بدبد؟ بحث عبارات باقاعده که مفصله ولی برای مثال همین khobi و khoooooooobi رو توضیح میدم.

بعد از اینکه کتابخونه مذکور رو اضافه کردید، کد زیر رو بنویسید:



Dim objRegExp As RegExp
Dim collMatches As MatchCollection
Set objRegExp = New RegExp

objRegExp.Pattern = "kho*bi"
Set collMatches = objRegExp.Execute("khoooooooooooooobi")
MsgBox collMatches(0)

به همین سادگی به همین خوشمزگی!
Pattern ما اینجا kho*bi هست. علامت ستاره (*) یکی از کاراکترهای ویژه هست به معنی تکرار. یعنی کاراکتر قبلیش (حرف o) در صورت تکرار پذیرفته است.
رشته موردنظرتون رو برای تطبیق باید بدید به متود Execute. خروجیش روی یک مجموعه Set میشه که برای دسترسی به عناصر اون مجموعه باید از For Each استفاده کنید. اما چون اینجا یک تطبیق بیشتر نداریم، نیازی به For Each نیست و مستقیم Index شماره 0 رو نمایش میدیم.

به طور پیشفرض به حروف کوچک و بزرگ حساس هست. برای Insensitive کردن باید خاصیت IgnoreCase رو True کنید:


objRegExp.IgnoreCase = True

موفق باشید/

_behnam_
دوشنبه 04 بهمن 1389, 22:53 عصر
این کار اشکالی نداره، اما یک کار اضافی هست.

بحث عبارات باقاعده که مفصله ولی برای مثال همین khobi و khoooooooobi رو توضیح میدم.

بعد از اینکه کتابخونه مذکور رو اضافه کردید، کد زیر رو بنویسید:



Dim objRegExp As RegExp
Dim collMatches As MatchCollection
Set objRegExp = New RegExp

objRegExp.Pattern = "kho*bi"
Set collMatches = objRegExp.Execute("khoooooooooooooobi")
MsgBox collMatches(0)

به همین سادگی به همین خوشمزگی!
Pattern ما اینجا kho*bi هست. علامت ستاره (*) یکی از کاراکترهای ویژه هست به معنی تکرار. یعنی کاراکتر قبلیش (حرف o) در صورت تکرار پذیرفته است.
رشته موردنظرتون رو برای تطبیق باید بدید به متود Execute. خروجیش روی یک مجموعه Set میشه که برای دسترسی به عناصر اون مجموعه باید از For Each استفاده کنید. اما چون اینجا یک تطبیق بیشتر نداریم، نیازی به For Each نیست و مستقیم Index شماره 0 رو نمایش میدیم.

به طور پیشفرض به حروف کوچک و بزرگ حساس هست. برای Insensitive کردن باید خاصیت IgnoreCase رو True کنید:


objRegExp.IgnoreCase = True

موفق باشید/
یه مشکل هست . اگه کلمه همخونی نداشته باشه اررور میده . چطوری جلو اررور رو بگیرم ؟

xxxxx_xxxxx
سه شنبه 05 بهمن 1389, 06:05 صبح
یه مشکل هست . اگه کلمه همخونی نداشته باشه اررور میده . چطوری جلو اررور رو بگیرم ؟
دو راه دارید.
یکی اینکه قبل از ارسال رشته موردنظرتون به متود Execute ابتدا اونو به متود Test بدید. متود Test کارش این هست که بررسی کنه ببینه آیا چیزی تطبیق میکنه یا نه. اگر جواب مثبت باشه، True برمیگردونه، در غیر اینصورت False.

If objRegExp.Test("khooooooobi") = True Thenاین کارو باید قبل از Execute انجام بدید.
ترجیحاً رشته خودتون رو توی یک متغیر قرار بدید و اون متغیر رو به این متودها بدید. نه اینطوری که من نوشتم.

راه دوم اینه که قبل از اینکه آیتم شماره 0 رو نمایش بدید، ببرسی کنید ببینید اصلاً MatchCollection شما آیتمی داره یا نه:

If collMatches.Count > 0 Then MsgBox collMatches(0)Property پیشفرض در MatchCollection همون Item هست. من برای خلاصه سازی، Item رو نمی نویسم. وگرنه اصلش اینطوریه:

If collMatches.Count > 0 Then MsgBox collMatches.Item(0)کلاس RegExp انعطاف پذیری بالایی داره. به طور مثال شما میتونید توی برنامه تون، کل جمله ای که کاربر به روبات میگه رو با یکبار ارسال به متود Execute تحلیل کنید. برای تحلیل رشته های چندخطی باید خاصیت MultiLine رو True کنید. و برای اینکه اگر بیش از یک تطبیق در رشته تون وجود داشت، همه اش رو برگردونه باید خاصیت Global رو True کنید. و برای اینکه به همه آیتم های تطبیق شده دسترسی داشته باشید خیلی راحت با یک For Each میتونید همشون رو دریافت کنید.

موفق باشید/

_behnam_
سه شنبه 05 بهمن 1389, 22:23 عصر
آقایی XXXXX_XXXXX میشه اگه واستون زحمتی نیست کاراکترهای ویژه RegExp رو همراه با کارایشون رو اینجا قرار بدید تا من و دیگران ازشون استفاده کنیم؟

ممنون/

xxxxx_xxxxx
چهارشنبه 06 بهمن 1389, 19:20 عصر
سلام،
همه علامت ها رو دقیق خاطرم نیست. (به همین دلیل هم به اشتباه گفتم از علامت * استفاده کنید. در حالی که برای برنامه شما باید از علامت + استفاده بشه) میتونید از تاپیک زیر ببینید:
معرفی برخی علائم عبارات منظم (http://barnamenevis.org/showthread.php?139020-%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D8%A8%D8%B1%D8%AE%DB%8C-%D8%B9%D9%84%D8%A7%D8%A6%D9%85-%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D9%85%D9%86%D8%B8%D9%85)

_behnam_
چهارشنبه 06 بهمن 1389, 23:58 عصر
آقای XXXXX_XXXXX واقعا ممنون ,
واقعا راهنمایاتون همون چیزی بود که میخواستم :قلب:

motanro
یک شنبه 02 بهمن 1401, 09:58 صبح
هوش مصنوعی خیلی رشته خوبیه، مخصوصا رشته پردازش تصویرش
در کل کاربرد هوش مصنوعی کلا گستردس و مثل یک ابزار هست که هر شخصی می تونه ازش استفاده خوب یا بد کنه
در رابطه با هوش مصنوعی (https://hamrah.academy/blog/artificial-intelligence/) آکادمی همراه اول یک مقاله خوب نوشته که واقعا عالی بود
بهتون پیشنهاد میدم که بخونید ...
اینم لینکش:
https://hamrah.academy/blog/artificial-intelligence/