با اپلیکیشن [اسنپفود](https://snappfood.ir) به راحتی میتوانید با چند کلیک ساده، رستورانها، کافهها و شیرینیفروشیهای نزدیک خودتان را جستوجو و از تجربه سفارش آسان اسنپفود لذت ببرید. 😋
![توضیح تصویر](QMedia Not Supported)
فروشندگان میتوانند اقلام خوراکی خود را در اسنپفود قرار دهند تا کاربران با بررسی قیمت و عکس خوراکیها و نظرات کاربران دیگر، خوراکی مورد نظر خود را انتخاب کنند.
**شما** به عنوان یک سفارشدهنده غذا، میتوانید از نظرات دیگر مشتریان راجع به کیفیت یک رستوران آگاه شوید. بهعنوان مثال، میتوانید میزان لذیذ و خوشمزه بودن قرمهسبزی یک یا چند رستوران را با توجه به نظرات ثبتشده سفارشدهندگان پیشین بسنجید.
![توضیح تصویر](https://quera.ir/qbox/view/7ntgrJd6di/comments.png)
سپس، خودتان نیز میتوانید تجربهتان راجع به سفارش را با دیگران به اشتراک بگذارید. پس از دیدگاه سفارشدهنده، نظرات بسیار پراهمیت هستند.
از دیدگاه اسنپفود نیز نظرات بسیار مهم هستند زیرا میتواند عملکرد همکاران (رستورانها، تولیدکنندگان غذا و پیک) را از طریق آن رصد کند تا بتواند میزان رضایت مشتریان را افزایش دهد. 😎
در این سوال میخواهیم به اسنپفود در تحلیل احساس موجود در نظرات، کمک کنیم. 🤗
# دادگان
دادگان این مسئله را میتوانید از [این لینک](/problemset/assignments/4367/download_problem_initial_project/125361/) دانلود کنید. هنگامی که این فایل را از حالت فشرده خارج کنید. پوشه `comments` را میبینید. در صورتی که وارد این پوشه شوید، فایل آموزش (`train.csv`) و آزمایش (`test.csv`) را مشاهده میکنید. فایل آموزش، دارای ساختار زیر (با دو ستون) اس:
| نام ستون | توضیحات ستون |
|:----------|:------------------:|
| comment | نظر یک مشتری راجع به یک سفارش |
| date | زمان ثبت نظر |
عمده نظرات موجود در ستون `comment` به زبان فارسی هستند؛ اما تعداد محدودی از نظرات وجود دارند که به زبان انگلیسی ثبت شدهاند. مدیریت این چالش بخشی از فرایند حل مسئله است.
همچنین تنها تفاوت دادگان آموزش با آزمایش در این است که دادگان آزمایش، ستون `date` ندارند.
<details class="yellow">
<summary>
**نداشتن برچسب**
</summary>
دادگان آموزش و آزمایش هیچگونه برچسبی ندارند. همانطور که در بخش بعدی (صورت مسئله) خواهید دید، شما خودتان باید برچسب هر نظر را مشخص کنید.
</details>
<details class="blue">
<summary>
**محرمانگی**
</summary>
به دلیل رعایت محرمانگی دادگان، از انتشار نام فرد نظردهنده، شناسه سفارش و اطلاعات رستوران/کافه/شیرینیفروشی مربوطه، معذوریم! 😉
</details>
<details class="yellow">
<summary>
**توجه**
</summary>
به علت فارسی بودن متن نظرات، **ممکن** است نرمافزار اکسل در نمایش آن با مشکل مواجه شود. بر فرض اینکه از زبان پایتون استفاده میکنید، کتابخانه پانداس در بارگذاری متون فارسی به شما میتواند کمک کند.
</details>
# صورت مسئله
اسنپفود از شما میخواهد `positive` یا `negative` بودن نظرات را مشخص کنید. دسته `positive` نظراتی را نشان میدهد که ثبتکننده نظر، از سفارش خود راضی بوده و **احساس مثبتی** از تعامل با اسنپفود و همکارانش بهدست آوردهاست. در مقابل، دسته `negative` نظراتی را نشان میدهد که ثبتکننده آن احساس خوبی از سفارش خود نداشتهاست.
**شما** بایستی که با استفاده از دادگان آموزش، بتوانید مُدلی بسازید که **احتمال** `positive` بودن احساس نظرات موجود در دادگان آزمایش (`test.csv`) را شناسایی کند.
<details class="pink">
<summary>
**راهنمایی**
</summary>
**شاید** یکی از روشهای زیر، بتواند به شما در حل این مسئله کمک بکند:
+ ابتدا با استفاده از یادگیری بدوننظارت (`unsupervised`)، نظرات فایل `train.csv` را به دو دسته `positive` و `negative` گروهبندی کنید، سپس با روشهای یادگیری نظارتشده (`supervised`)، مدلی را آموزش دهید که بتواند **احتمال** `positive` بودن یک نظر را تخمین بزند.
+ خودتان و یا با استفاده از روشهای قانونمند (`rule-based`) مانند `weak supervision` اقدام به برچسبزدن همه یا قسمتی از دادگان آموزش بکنید، سپس با روشهای یادگیری نظارتشده (`supervised`)، مدلی را آموزش دهید که بتواند **احتمال** `positive` بودن یک نظر را تخمین بزند.
+ یا استفاده از هر روش دیگر که مرتبط با تحلیل داده/متن، یادگیری ماشین و عمیق است.
</details>
# ارزیابی
امتیاز نهایی مُدل شما تابعی از سطح زیر ناحیه نمودار `ROC` است. برای مطالعه بیشتر در مورد این نمودار میتوانید [ویکیپدیا](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) یا [راهنمای کوتاه نکات و ترفندهای یادگیری ماشین](https://stanford.edu/~shervine/l/fa/teaching/cs-229/cheatsheet-machine-learning-tips-and-tricks) را مطالعه کنید.
امتیاز نهایی مدل شما، طبق فرمول زیر محاسبه میشود:
$$ score = ((AUCROC\times100)-50) \times4$$
<details class="green">
<summary>
**توضیحات**
</summary>
علت استفاده از این فرمول برای امتیازدهی، این است که اگر به صورت تصادفی برای نظرات عددی پیشبینی کنید، `auc_roc` مدل شما ۰.۵ خواهد بود. بنابراین تنها مدلهایی پذیرفته میشوند که دارای `auc_roc` بیشتر از ۰.۵ باشند. توجه داشته باشید که بیشترین امتیاز ممکن از این سوال ۲۰۰ و کمترین امتیاز ممکن، صفر است.
</details>
# خروجی
پیشبینیهای مدل خود بر روی دادگان آزمایش (`test.csv`) را در فایلی با نام `output.csv` قرار دهید. این فایل باید دارای یک ستون به اسم `prediction` باشد که ردیف i ام ستون `prediction`، پیشبینی شما (**احتمال **`positive` بودن نظر - عددی بین صفر و یک) برای نظر ردیف i ام از فایل `test.csv` باشد (دقت کنید که ستون باید حتما دارای `header` باشد). بعد از آمادهسازی فایل `output.csv`، آن را برای ما بارگذاری کنید.
## نمونه خروجی فایل `output.csv` (فقط سه خط اول به همراه نام ستون)
```
prediction
0.723
0.516
0.281
```
<details class="yellow">
<summary>
**توجه**
</summary>
حتما فایل `output.csv` باید دارای ۱۴,۰۰۰ سطر (بدون در نظر گرفتن `header`) و یک ستون باشد.
همچنین نام ستون بایستی بدون `space` در قبل و بعد از نام آن، باشند. در غیر این صورت، سیستم داوری نمرهای به شما نخواهد داد.
</details>
<details class="red">
<summary>
**هشدار 😱**
</summary>
فراموش نکنید که **قبل از پایان زمان مسابقه**، **بایستی** تمامی کدهای این مسابقه را از قسمت **بارگذاری کُد** برای ما ارسال کنید. در غیر این صورت، شما از این مسابقه، امتیازی کسب نمی کنید.
توجه داشته باشید که اگر از `jupter notebook` استفاده می کنید بایستی همانند توضیحات قسمت **بارگذاری کُد**، خروجی `.py` را دریافت و برای ارسال در نظر بگیرید. ارسال فایلهای `jupyter` همانند `.ipynb` مورد قبول واقع نخواهند شد.
</details>