تابع sorted در python3 و تفاوت آن با python2 (چرا عاشق پایتونم)

تابع sorted یه تابع آماده (built-in) تو پایتونه که برای استفاده ازش نیاز به اضافه کردن هیچ پکیجی ندارید. این تابع در حالت خیلی ساده یک iterable به عنوان ورودی می‌گیره و مرتب شده‌اش رو در خروجی برمی‌گردونه.

نکته مهم در مورد این تابع اینه که تو Python3 نسبت به Python2 یه تغییر به ظاهر کم‌اهمیت، اما در واقع خیلی مهم و کاربردی کرده. برای اینکه توضیح این تغییر، تابع sorted رو توی هر دو نسخه پایتون تعریف میکنم.

تابع sorted در Python2

تابع sorted در پایتون۲ به این شیوه صدا زده میشه:

که این یعنی ورودی iterable اجباری (همون چیزی که میخوایم مرتبش کنیم) و cmp و key و reverse اختیاری هستند.

حالا این ورودی‌های اختیاری چی‌ هستند؟

cmp: یک تابعه که دو تا ورودی می‌گیره و یک مقدار مقایسه‌پذیر به عنوان خروجی برمی‌گردونه. این تابع در واقع به الگوریتم مرتب سازی میگه که بین دو تا ورودی کدومشون از اون یکی بزرگتره. اگر خروجی تابعی که به cmp داده میشه بزرگتر از صفر باشه یعنی ورودی اول بزرگتره، کوچکتر از صفر باشه یعنی ورودی دوم بزرگتره، و اگر مساوی با صفر باشه یعنی هر دو ورودی برابرند.

key: یک تابعه که یک ورودی و یک خروجی داره. در واقع این تابع کلیدی که در مقایسه استفاده میشه رو به الگوریتم مرتب‌سازی میده. مثلا اگر قرار باشه لیستی از استرینگ‌ها رو مقایسه کنیم، فکر خوبیه که str.lower رو به عنوان key پاس بدیم تا استرینگ‌ها اول به حروف کوچیک تبدیل بشن و بعد مرتب شن.

reverse: اگر این مقدار برابر False باشه مرتب سازی به شکل صعودی، و اگر True باشه مرتب سازی به شکل نزولی انجام میشه. به طور پیش‌فرض False است.

خب فکر می‌کنم تا الان تا حد خوبی با sorted تو پایتون ۲ آشنا شده باشیم. حالا ببینیم این تابع تو پایتون۳ چه تغییری کرده.

تابع sorted در Python3

تفاوتی که به چشم میاد حذف شدن ورودی cmp از این تابعه. چرا cmp حذف شد؟

چند جواب برای این سوال وجود داره. اما بهترینش اینه: سادگی! پایتون برمبنای یه سری اصول و قوانین ساده ولی مهم ساخته شده و تمام ویژگی‌های اون روی این چند ویژگی ساده بنا شده‌اند (دقیقا دلیل اینکه من عاشق پایتونم همینه). طراحان این زبان سعی می‌کنند تا این زبان رو حتی ساده‌تر از قبل کنند و یکی از کارهایی که برای این صورت گرفت حذف cmp بود. cmp یکی از بازماندگان C در پایتون بود و وقتی پایتون۳ اومد دیگه وقتش بود که با این تابع خداحافظی بشه، چون عملا خیلی کاربردی نداشت و این key بود که همه کارها رو انجام می‌داد.

حالا اگر اصرار داشتیم که موقع استفاده از پایتون۳ از cmp استفاده کنیم چی؟ این مشکل اخیرا برای من پیش اومد. بذارید اینجوری بگم که من یه شبکه عصبی دارم که دو تا ورودی میگیره و به من میگه کدوم از اون یکی مهمتره. حالا میخوام یه سری ورودی رو بر مبنای اهمیتشون مرتب کنم. راحت‌ترین راهی که به نظرم اومد استفاده از یه تابع compare بود. اینجوری که این تابع دو تا ورودی رو بگیره و بگه طبق نظر شبکه عصبی کدوم اینا از اون یکی مهمتره (بزرگتره). اما من تمام کدم رو با پایتون۳ نوشتم و علاقه‌ای نداشتم فقط به خاطر یک خط برگردم به پایتون۲ و یه سری چیزهای دیگه رو از دست بدم. پس چیکار کنم؟

خب راه حل ساده‌ است. داخل پکیج functools یه تابع وجود داره به نام cmp_to_key. همونطوری که از اسم این تابع معلومه، یه فانکشن compare میگیره و اون رو تبدیل میکنه به یک تابع key! جادویی به نظر میاد؟ شاید. شاید اگر هر زبان دیگه‌ای بود پیاده‌سازی این تابع صدها خط کد و لاجیک پیچیده‌ای نیاز داشت. اما با پایتون همه کار ساده و هوشمندانست. پیاده سازی این تابع رو با هم ببینیم:

این تابع یک کلاس تعریف می‌کنه و داخل اون یه سری توابع مقایسه‌ای که تو پایتون۳ معرفی شدند رو تعریف می‌کنه. حالا وقتی که روی آبجکت‌های این کلاس عملگرهای مقایسه‌ای مثال > < = اجرا بشن این توابع فراخوانی می‌شن و میگن که مثلا کدوم آبجکت از اون یکی بزرگتره. در واقع این تابع یک کلید برای مقایسه برمی‌گردونه که قوانین مقایسه این کلید از همون قوانین تابع compare پیروی می‌کنند. هوشمندانه نیست؟ یه سری امکانات و قواعد اولیه (تعریف توابع عمگرهای مختلف برای آبجکت داخل کلاس اون آبجکت) که منجر به ساده شدن کارهای به ظاهرا پیچیده (تبدیل توابع cmp به توابع key) میشه.

نظر بدید

من چطوری تافل ۱۱۱ گرفتم

تا الان چندین بار شده که تجربه خودم رو از تافل برای دوستام شفاهی توضیح دادم و مدتهاست که می‌خوام این تجربه رو اینجا کتبی بنویسم اما فرصت نمیشد. الان سعیم بر اینه که به طور نسبتا خلاصه، تجربه شخصیم از انگلیسی خوندن و امتحان تافل دادن رو اینجا بنویسم. لطفا توجه داشته باشید این‌ها تجربیات منه و روشیه که برای من کار کرد و نه معتقدم که به درد همه می‌خوره و نه ادعا دارم روش من بهترین روشه. نمره نهایی من ۱۱۱ بود. (Reading 30 – Listening 28 – Speaking 27 – Writing 26)

اولین و آخرین باری که به طور جدی شروع به کلاس زبان رفتن کردم سال اول یا دوم کارشناسی بود. البته من از خیلی وقت پیش به یادگرفتن زبان انگلیسی علاقمند بودم و یه بار هم چند ماه کلاسهای «کیش» رو رفتم که تقریبا زود ولش کردم. توی دوران دبیرستان هم یکی از تفریحاتم این بود که برم میدون انقلاب تا کتابهای داستان انگلیسی سطج پایین رو بخرم و تلاش کنم که بخونمشون. یا اینکه برم دم دکه روزنامه فروشی و یه شماره تهران تایمز رو بخرم و به کلماتش نگاه کنم و مطلقا چیزی نفهمم 🙂

همه این تجربیات پراکنده و از روی علاقه بودند. تا اینکه حدودهای سال ۹۰ خودم رو ملزم کردم که برم کلاس زبان. یک سال و نیم رفتم کلاس زبان ایران-استرالیا تو میدون ولیعصر تهران که خب تجربه خوبی بود. راستش مطمئن نیستم که چیزی از اون کلاسها یاد گرفتم یا نه. ولی احتمالا تو افزایش اعتماد به نفسم و مرور گرامری که قبلا تو مدرسه یادگرفته بودیم تاثیر گذار بود. بعد از حدود یک سال نیم و وقتی همش دو ترم مونده بود تا کتاب آخر هم تموم بشه حس کردم دیگه چیزی از این کلاس‌ها یاد نمیگیرم و ادامه دادنش هدر دادن پول و وقته. همین شد که رهاش کردم.

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

دوران کارشناسی تموم شد و به دوران ارشد رسیدم. این دوران برای دانش زبان انگلیسی من دوران مهمی بود. در واقع دورانی بود که تو جاهای مختلف مجبور شدم که از این زبان استفاده کنم فهمیدم تلاش‌های سالهای گذشته نتیجه داده. ضمنا این اجبار باعث شد که هر روز بهتر و بهتر بشم. خیلی نمی‌خوام وارد جزییات بشم، اما کلیاتش اینه که تو این دوران بود که چندتا سفر بک‌پکی به خارج از ایران داشتم و مجبور شدم که تو هاستل‌ها با آدمهای از کشورهای مختلف معاشرت کنم و ارتباط برقرار کنم، تو این دوران بود که یه رابطه عاطفی به زبون انگلیسی داشتم و باز تو این دوران بود که دو تا مقاله به انگلیسی نوشتم. در کل این دوران کمک کرد تمام چیزهایی که بلدم رو جمع‌بندی کنم و ازشون تو موقعیت‌های مختلف استفاده کنم.

تا اینکه رسیدم به نزدیک‌های اپلای و بعد از اینکه به این نتیجه رسیدم که می‌خوام برای دانشگاه‌های کانادا اپلای کنم، لازم شد که امتحان زبان بدم. تافل رو انتخاب کردم چون دوستای دیگه‌ام اکثرا تافل داده بودند و اینجوری می‌شد از اونا برای منابع راهنمایی بگیرم و چون به نظرم اومد که امتحان سرراست‌تریه. اینجوری شد که برای پنج هفته بعد تو سنتر سنجش ثبت نام کردم و تنها پنج هفته فرصت داشتم که بخونم. خیلی استرس زاست نه؟

ادامه این نوشته

نظر بدید

چرا Numpy سریعتره و کندوکاو در اعماق چند دستور

یک آرایه نامپای در واقع با ترکیب metadata تعریف میشه (مثلا تعداد ابعاد، shape، نوع داده) و خود داده‌ها. داده‌ها تو بلاکهای پیوسته و همسان مموری (RAM) ذخیره میشن. تفاوت اساسی بین یه آرایه و یه لیست نامپای در واقع همین پیوسته بودن داده‌ها در مموریه. همین تفاوته که باعث میشه نامپای اینقدر سریعتر و بهینه‌تر باشه.

چرا این موضوع مهمه؟ چند تا از دلیلاش رو اینجا می‌نویسم:

  • محاسبات روی آرایه میتونن خیلی بهینه با زبان سطح پایین C نوشته شن ( عملا بیشتر نامپای با C نوشته شده). با دونستن آدرس بلاک مموری و نوع دیتا (Data Type) محاسبات تبدیل به یه حلقه ساده روی تمام آیتم‌ها میشه. در صورتی که همین محاسبات با پایتون کلی overhead داره (چون باید آدرس هر عضو لیست جداگونه به دست بیاد).
  • همسایگی داده‌ها در حافظه باعث میشه که بشه از کش سی‌پی‌یو استفاده کرد. اینطوری که سی‌پی‌یو بخشهایی از حافظه که داده توشه رو تو رجیستر خودش کش میکنه و اینجوری سرعت محاسبات به شدت بالا میره.
  • همسایگی حافظه باعث میشه نامپای بتونه از دستورات محاسبات برداری‌ای که در سی‌پی‌یوهای جدیدتر هست استفاده کنه. مثلا تکنولوژی SSE و AVX تو اینتل و XOP تو AMD.

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

ادامه این نوشته

نظر بدید

یه کتاب خوب تا آخر امروز مجانی شده!

سایت packtpub.com که هر از گاهی کتابهای خوب رو برای مدت محدود برای دانلود مجانی میذاره، امروز کتاب Learning Data Mining With Python رو گذاشته و تا آخر امشب وقت دارید تا با عضو این سایت شدن کتاب رو دانلود کنید.

این کتاب رو دکتر رابرت لیتون نوشته و طبق گفته خودش هدفش این بود که آدمهایی که برنامه نویسی بلدند و به طور کاربردی درگیر دیتا ماینینگ و ماشین لرنینگ کنه. این کتاب سعی میکنه تا حد امکان درگیر تئوری و ریاضی الگوریتم‌ها نشه و مسائل ماشین لرنینگ رو با زبون پایتون و پکیج Sci-Kit Learn حل کنه. در کل اگر برنامه‌نویس هستید و دوست دارید دستی به دیتا ماینینگ بزنید و در عین حال درگیر ریاضیات سنگینش نشید، این کتاب برای شما به نظر کتاب مناسبی میاد.

کتاب رو میتونید از این لینک دانلود کنید

Image result for learning data mining with python robert layton

نظر بدید

یادگیری ماشینی چیزی جز ریاضی نیست

آدرس رو غلط نرید، یادگیری ماشینی هیچ چیزی جز ریاضی نیست. وقتی که میگم ریاضی منظورم ترکیبیه از  حسابان و معادلات دیفرانسیل و آمار. تمام الگوریتم‌هایی که می‌بینید جادو می‌کنند و یاد می‌گیرند و دستاورد کارشون این روزها تو صدر اخبار می‌شینه، در واقع همون فرمول‌های ریاضی هستند که با کمک کامپیوتر‌ها و با کمک ماتریس‌های بزرگی از ورودی و خروجی‌های دلحواه ما (همون چیزی که بهشون میگیم دیتا) حل شده‌اند و به جواب رسیدند. این چیزیه که خیلی ‌از ماها وقتی برای اولین بار با این الگوریتم‌ها آشنا میشیم نمی‌بینیم. یک مثلا ساده‌ از حرفم درخت تصمیمه که فقط و فقط با کم کردن Cross Entropy ساخته میشه. هر چند که مثال‌هایی از این دست زیاده، اما من میخوام تو این نوشته در مورد جذاب‌ترین و پرکاربرد روش یادگیری ماشین صحبت کنم. یعنی شبکه‌های عصبی.

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

وقتی که تازه با این شبکه‌های عصبی آشنا میشیم، این اتصالات و این نرون‌های گرافیگی چیزیه که تو همه کتابها و مقاله‌ها و ویدیو‌های آموزشی می‌بینیم. اما این نمایش گرافیکی علیرغم قابل فهم بودن و قشنگ بودن، یه حقیقت مهمی رو از چشم ما مخفی میکنه. اون حقیقت اینه که این نرون‌ها واقعی نیستند و در واقع شبکه عصبی هیچ چیزی نیست جز یه تابع پیچیده و به شدت غیر خطی که ما سعی میکنم پارامتر‌هاش رو با استفاده از رفتاری که از تابع توقع داریم انجام بده (دیتا) تخمین می‌زنیم. یک شبکه‌ی feedforward ساده رو در نظر بگیرید. اگر این شبکه سه لایه باشه در واقع این شبکه چیزی نیست جز رگرسیون غیر خطی با هایپرتز y=g(W’f(WX+b)+b’) که W وزنهای لایه اول، Wپریم وزن‌های لایه دوم، تابع f تابع فعالسازی لایه پنهان و g تابع فعال‌سازی تابع خروجیه. هدف ما از آموزش این شبکه عصبی صرفا یادگیری پارامترهای این تابعه و تمام feedforwardها و back propagateها برای همینه.

اما چیزی که بالا گفتم یه جنبه از شبکه‌های عصبی بود. این شبکه‌ها رو جور دیگه‌ای هم میشه نگاه کرد. نگاه دوم که نگاه مورد علاقه منه نگاه آماریه. وقتی که این تابع پارامتر‌های خودش رو یاد میگیره، در واقع داره یاد میگیره که وزن‌های این شبکه عصبی رو چطوری تنظیم کنه که بتونی با ورودی، خروجی رو بسازه. وقتی که پارامتر‌های تعیین شدند، برای هر ورودی یک یا چند نمایش (representaion)‌ به دست می‌آره که نشون دهنده اطلاعات آماری پنهان توی اون ورودی‌اند! برای مثال سه شبکه سه لایه‌‌ای که پاراگراف قبل توضیح دادم، وقتی شبکه آموزش داده شد، شبکه به ازای هر ورودی یه بردار f میسازه که خروجی نرون‌های لایه دومه. این بردار بعد از اینکه تو ماتریس Wپریم ضرب شه خروجی رو میسازه، پس این بردار نمایشی از ورودیه و بسته به اینکه ورودی و خروجی این شبکه عصبی چی هستند این نمایش میتونه ویژگی‌های منحصر به فردی داشته باشه. مثلا اگه ورودی پیکسل‌های خام عکس باشه و خروجی این باشه که این عکس هات داگه یا نه (سریال سیلیکون ولی رو دیدید؟)، این بردار f یا همون خروجی نرون‌های لایه پنهان ویژگی‌های استخراج شده‌ای از عکس هستند که طبق آمار موجود در دیتای آموزش، میتونن به تشخیص هات داگ بودن یا نبودن عکس کمک کنند. ویژگی‌های مثل رنگ و فرم و چیزهای دیگه 🙂 . البته که میدونیم یه شبکه عصبی سه لایه اونقدری قدرت یادگیری نداره که بتونه همچین مسئله سنگینی رو یاد بگیره و برای حل این مسئله نیاز به شبکه‌هایی با لایه‌های بیشتر داریم و بعضا معماری متفاوت داریم. یک شبکه با لایه‌های بیشتر در واقع چیزی نیست جز یه تابع که بیشتر غیرخطیه و میتونه انعطاف‌پذیری بیشتر از خودش تو فضای با ابعاد خیلی زیاد نشون بده.

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

 

یک نظر

فیلم Wild

اعتراف می‌کنم که سرما خوردن رو دوست دارم. از بدن درد و گلودرد و سختی‌هاش که بگذریم، سرماخوردگی باعث میشه دو سه روز بدون هیچ عذاب وجدانی روی تخت دراز بکشم. می‌تونم تو این مدت همونطوری که دراز کشیدم فیلم‌هایی که تو لیست دیدن دارم رو ببینم یا کتاب بخونم. این چند روز هم دو تا فیلم خوب دیدم و دو تا سریال شروع کردم. ضمن اینکه تونستم صد صفحه از کتاب آخری که خریدم رو بخونم.

فیلمهایی که دیدم The Shape Of Water و Wild بودن. هرچند که اولی رو خیلی دوست داشتم اما در موردش حرفی نمی‌زنم. این فیلم اسکار گرفته و احتمالا ازش به اندازه کافی حرف زده میشه. اما دلم میخواد دومی رو کمی معرفی کنم.

فیلم Wild داستان زندگی زنی به نام شریله که بعد از خیانت به همسرش و در نتیجه طلاق، از زندگی مهملی که داشته خسته می‌شه و برای رسیدن به یک معنی مهمتر و برای خودشناسی، تصمیم می‌گیره که مسیر pacific crest trail رو پیاده طی کنه. این یک مسیر چهارهزار و دویست کیلومتری تو غرب آمریکاست که از مرز کانادا تا مرز مکزیک کشیده شده و کسایی که دنبال طبیعت گردی طولانی هستند این مسیر رو تو چند ماه طی می‌کنند. فیلم نمایشی از طی کردن این مسیر توسط شریل به همراه فلش ‌بک‌هایی از زندگی گذشته‌اش که باعث شده در نهایت سر از اینجا در بیاره است. این فیلم سال ۲۰۱۴ ساخته شده و همون موقع نامزد دوتا جایزه اسکار شده که خب هیچ‌کدومش رو نمی‌بره. خلاصه اینکه دیدن این فیلم رو توصیه می‌کنم و اگر به سفر و طبیعت‌گردی و کمپینگ علاقمند باشید می‌تونید با دیدن این فیلم لذت دوچندان ببرید.

کتابی که شروع کردم و دارم میخونم زندگی‌نامه ایلان ماسکه که Ashlee Vance سال ۲۰۱۵ منتشر کرده. من این کتاب رو از ایران نخریدم و خبر ندارم که ترجمه فارسیش هست یا نه. اما بعد از خوندنش سعی می‌کنم نظرم رو به همراه خلاصه‌ای ازش بنویسم.

 

۲ نظر

نحوه دریافت مجوز خروج از کشور برای دانشجویان

پارسال زمستون وقتی که می‌خواستم برای اولین بار مجوز خروج از کشور بگیرم، تقریبا هیچ جایی و هیچ کسی نبود که بتونه برام پروسه‌ای که برای دریافت مجوز باید طی کنم رو توضیح بده. حتی آموزش دانشگاه و پلیس +۱۰ هم خیلی دقیق از کل روند خبر نداشتند. یکی می‌گفت باید بری میدون سپاه، یکی می‌گفت باید از فلان جا کاغذ بگیری بدی به بهمان جا. و نکته جالب اینکه همشون اشتباه می‌کردند. برای همین امشب تصمیم گرفتم این روند رو کامل و از اول تا آخر توضیح بدم تا شما مثل من اذیت نشید.

ماجرا اینه که پسر هستید و مثل من سربازی نرفته باشید و دانشجو باشید، برای هر بار خروج از کشور باید مجوز خروج بگیرید. این مجوز رو سازمان نظام وظیفه با همکاری دانشگاه محل تحصیل صادر می‌کنه و برای گرفتنش باید ۱۵میلیون تومن پول نقد وثیقه بذارید. خبر خوب اینکه تمام پروسه اینترنتی انجام میشه و شما حتی لازم نیست از پشت لپتاپ بلند شید.

ادامه این نوشته

۷۹ نظر

ریکامندر سیستم‌ها چطوری کار می‌کنند؟ (قسمت دوم)

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

در تجزیه ماتریسی کاری که می‌کنیم اینه که از ماتریس امتیازها ویژگی‌های کاربر و محصول‌ها رو استخراج می‌کنیم. پس برای به دست آوردن ویژگی‌های قابل اتکا، به شدت وابسته به این هستیم که در ماتریس امتیازها، امتیازهای بیشتری وجود داشته باشد. این به این معناست که برای مثال، هر چه کاربرها فیلم‌های بیشتری را امتیاز داده باشند، ما هم ویژگی‌های بامعنی‌تری برای آن کاربرها و آن فیلم‌ها استخراج می‌کنیم.

اما وقتی یک فیلم جدید ساخته می‌شه چطور؟ هنوز هیچ کاربری به این قیلم رای نداده، پس هیچ اطلاعاتی در مورد این فیلم نداریم و نمی‌تونیم بردار ویژگی‌های این فیلم رو بسازیم. واضحه که در این صورت نمیشه از تجزیه ماتریسی و به طور کلی پالایش مشارکتی استفاده کرد.

ادامه این نوشته

نظر بدید

ریکامندرسیستم‌ها چطوری کار میکنند؟ (قسمت اول)

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

ریکامندرسیستم

در سال‌های اخیر تعداد محصولات و کالاهایی که فروشنده‌ها و سرویس‌دهنده‌های اینترنتی ارائه می‌کنند حسابی افزایش یافته. شرکت‌ها محصولات بیشتری تولید می‌کنند تا نیازهای بیشتری از مشتری‌ها رو برطرف کنند. این اتفاق از طرفی باعث می‌شه حق انتخاب کاربر بالا بره و از طرفی حق انتخاب رو برای کاربر خیلی سخت می‌کنه.

ریکامندر سیستم‌ها یا سیستم‌های توصیه‌گر، تکنولوژی‌های به سرعت رو به توسعه‌ای هستند که به کاربرها و مشتری‌ها کمک می‌کنند تا محصولاتی که براشون جالبه یا بهش نیاز دارند رو به راحتی پیدا کنند. این سیستم‌ها در فروشگاه‌های اینترنتی کاربرد زیادی دارند، چون این فروشگاه‌ها حق انتخاب زیادی به کاربر میدن و انتخاب رو براش سخت می‌کنند. در حقیقت این سیستم‌ها هم برای کاربر و هم برای فروشنده ارزش افزوده دارند؛ به کاربر کمک می‌کنند تا محصول مورد نیازش رو پیدا کنه و به فروشنده کمک می‌کنند تا تبلیغات بهتری داشته باشد و به طور هدفمندتر محصولش رو به مشتری‌ها توصیه کنه. معمولا یک سیستم‌ توصیه‌گر محصولات را به وسیله تخمین امتیاز یا ساخت لیست مرتب شده از محصولات برای هر کاربر توصیه می کند.

ادامه این نوشته

۵ نظر

مقدمه‌ای بر مدل‌سازی آماری زبان

مدل‌سازی زبان (Language Modeling) تقریبا در تمام کاربردهای پردازش زبان طبیعی استفاده می‌شه. در این مطلب هدفم اینه که کمی مدل‌سازی زبان رو توضیح بدم،‌ کاربرد‌هاش رو بگم و اشاره‌ای کوتاه (صرفا در حد گفتن اسم) به روش‌هایی که برای مدل کردن زبان استفاده میشه بکنم. برای همین این مطلب رو میشه در سه بخش دید:

  1. مسئله‌ی مدل‌سازی زبان
  2. مدل‌سازی آماری زبان
  3. انواع روش‌ها

۱. مسئله مدل‌سازی زبان

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

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

برای همین است که در مدل‌سازی زبان طبیعی، سعی میشه تا از مثال‌ها و جملات و به عبارت دیگه “دیتا” استفاده شه.

۲. مدلسازی‌ آماری زبان

مدل‌سازی آماری زبان به توسعه مدل‌های آماری‌ای گفته میشه که میتونن کلمه‌ی بعدی در یک توالی از کلمات تخمین بزنند. این مدل‌ها چند کلمه قبلی را به عنوان ورودی دریافت می‌کنند و حدس می‌زنند چه کلمه‌ای ممکنه کلمه بعدی باشه.

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

یک مدل زبان، احتمال وقوع کلمات را با توجه به مثال‌های متنی‌ای که می‌بیند تخمین می‌زند. مدل‌های ساده‌تر تنها به چند کلمه قبلی نگاه می‌کنند، اما مدل‌های پیچیده‌تر ممکن است به کل جمله یا حتی پاراگراف نگاه کنند.

یک مدل زبانی ذاتا احتمالاتی است. یک مدل زبانی در واقع یک تابع است که به کلمات یک جمله و یا به کل جمله یک احتمال تخصیص می‌دهد.

مسئله مدل‌سازی زبان یک مسئله اصلی است که در کاربردهای مختلف پردازش زبان طبیعی استفاده می‌شود.

مدل سازی زبان کامپوننت اصلی مسائل دنیای واقعی مثل ترجمه ماشین، تبدیل گفتار به متن و … است. به همین دلیل است که مدل‌سازی زبان نقش مهم و اساسی‌ای در پردازش زبان طبیعی، هوش مصنوعی، و یادگیری ماشین ایفا می‌کند.

یک مثال خوب تبدیل گفتار به متن است که در آن اطلاعات صوتی به عنوان ورودی مدل استفاده می‌شود و برای تولید خروجی، لازم است یک مدل زبانی بسازیم که سیگنال‌های ورودی را دریافت کند و در هنگام تشخیص کلمه بعدی در ورودی صوتی، از کلمات قبلی استفاده کند. به طور مشابه مدل‌سازی زبان در کاربرهای زیر استفاده می‌شوند:

  • تشخیص متن از روی عکس Optical Character Recognition
  • تشخیص دستخط Handwriting Recognition
  • ترجمه ماشین Machine Translation
  • نوشتن کپشن برای عکس Image Captioning
  • خلاصه‌سازی متن Text Summarization
  • و کاربردهای بسیار دیگر

۳. انواع روش‌ها

تا قبل از استفاده از شبکه‌های عصبی مصنوعی، استفاده از N-Gram رایج‌ترین روش براش ساخت مدل زبان بود. اما اخیرا استفاده از شبکه‌های عصبی مصنوعی در ساخت مدلهای آماری زبان اخیرا رایج شده است و می‌شه گفت بهترین روش‌ حال حاضر است چون این روش‌ها نتایج بهتری نسبت به روش های قدیمی‌تر گرفته‌اند. شاید بتوان گفت مهمترین ویژگی این روش‌ که باعث شده است از روش‌ها قبلی پیشی بگیرد قابلیت تعمیم آن باشد. قابلیت تعمیم بحث گسترده‌ایه که اگر بخوام ساده بگم میشه گفت به این معنیه که مدل از روی داده آموزشی طوری آموزش ببینه و ویژگی‌هایی رو یاد بگیره که بتونه روی داده‌ای که هنوز ندیده به درستی عمل کنه.

شبکه‌های عصبی معروفی که در این کار استفاده می‌شوند RNN و LSTM هستند. این شبکه‌ها تو دسته یادگیری عمیق قرار می‌گیرند و شاید در نوشته‌های بعدی بیشتر در موردشون حرف زدیم.

نظر بدید
android application Google I/O HomeBrew ImageMagick Material Design mobile PogressBar RecyclerView splash TEDxKish ux آموزش اندروید الوین تافلر اندروید اپلیکیشن برنامه نویسی برنامه نویسی اندروید برنامه‌نویسی برنامه‌نویسی اندروید تداکس کیش تعمیر تغییر سایز عکس با ترمینال خلاصه کتاب دانش داده دانشگاه دانشگاه ایده‌آل دزد دیتا ساینس رشته مهندسی کامپیوتر ریکامندرسیستم سیستم‌های توصیه‌گر فری‌لنس لپتاپ متریال دیزاین معرفی کتاب موج سوم نوار پیشرفت همایش هوش مصنوعی ُجزیره کیش کار کسب و کار یادگیری عمیق یادگیری ماشین