Skip to content

Commit

Permalink
SE-beta: update phases
Browse files Browse the repository at this point in the history
  • Loading branch information
Sajad Soltanian committed Jun 27, 2024
1 parent 90849ac commit 0b556fd
Show file tree
Hide file tree
Showing 17 changed files with 473 additions and 0 deletions.
8 changes: 8 additions & 0 deletions docs/software-engineering-quick/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"label": "مهندسی نرم‌افزار-بتا",
"position": 4,
"link": {
"type": "generated-index",
"slug": "software-engineering"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
104 changes: 104 additions & 0 deletions docs/software-engineering-quick/phase01-simple-project.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
---
title: Full-Text Search
description: ''
deadline: '2 days'
---

![](./images/phase01-search.jpeg)

## مقدمه
احتمالا برایتان پیش آمده است که بخواهید بین تعداد زیادی محتوای متنی، یک عبارت یا یک واژه خاص را پیدا کنید. یا به طور دقیق‌تر، همه فایل‌هایی که شامل آن عبارت می‌شوند را بیابید.
به این نوع جست‌وجو، full-text search یا همان جستجوی متنی گفته می‌شود. اگر کمی دقت کنیم، هر بار که وارد گوگل می‌شویم و عبارتی را جست‌وجو می‌کنیم، در واقع داریم در بین تمام وبسایت‌های موجود، یک جست‌وجوی متنی انجام می‌دهیم و انتظار داریم، سایت‌هایی که شامل عبارت مورد نظر ما هستند به ما برگردانده شود.

* آیا تا به حال فکر کرده‌اید که گوگل چطور این کار را انجام می‌دهد؟
* یا به طور دقیق‌تر، چطور تا این حد سریع، این کار را انجام می‌دهد؟

در این فاز، نه تنها پاسخ این سوالات را میابیم، بلکه سرویس جست‌وجوی خودمان را نیز پیاده‌سازی می‌کنیم؛ با این تفاوت که به جای سایت‌ها به سراغ کتاب‌ها می‌رویم و این جست‌وجو را در بین انبوهی از کتاب‌ها انجام می‌دهیم.


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

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

* مرتبه زمانی روش پیشنهادی شما چقدر است؟! آیا می‌توان این کار را در مرتبه یک یا همان O1 انجام داد؟
* نکته: لطفا حتما پیش از ادامه مطالعه مطالب، روی سوالات بالا به خوبی فکر کنید و پاسخ خود را بنویسید.

یکی از داده‌ساختار‌های مورد استفاده به این منظور، Inverted Index می‌باشد. برای آشنایی با این داده ساختار [Inverted Index - GeeksforGeeks](https://www.geeksforgeeks.org/inverted-index/)
را مطالعه کنید؛  سپس برای فهم بهتر
ویدئوی [The Inverted Index](https://www.dideo.ir/v/yt/bnP6TsqyF30/18-3-the-inverted-index-stanford-nlp-professor-dan-jurafsky-%26-chris-manning-youtube)
را مشاهده نمایید.

## موتور جستجو

با توجه به دانشی که درباره جست‌وجوی متنی و داده‌ساختار inverted index بدست آوردیم، می‌خواهیم یک موتور جست‌وجو برای کتاب‌ها بسازیم تا با گرفتن تعدادی سند متنی (شامل خلاصه کتاب‌ها)، امکان جست‌وجوی سریع روی آن‌ها را فراهم کند.

پیش از ادامه اما لازم است با مفهوم برنامه‌نویسی دونفره یا [Pair Programming](https://martinfowler.com/articles/on-pair-programming.html) آشنا شویم. از آنجا که باید تمام پروژه‌های فاز‌های آموزشی را به صورت pair و در قالب تیم‌های دو‌نفره انجام دهیم خوب است پیش از ادامه کار، درباره این سبک برنامه‌نویسی مطالعه کنیم.

### تعریف پروژه
برنامه‌ای به زبان Java بنویسید که سند متنی (Document) را بخواند و از روی آن‌ها یک Inverted Index بسازد؛ سپس در Console از کاربر یک کلمه به عنوان ورودی بگیرد و نام یا شماره Documentهایی که شامل آن کلمه هستند را چاپ کند. 

:::note
در این پروژه، از [خلاصه‌‌ کتاب‌های مهندسی نرم‌افزار](../../static/datasets/SoftwareBooksDataset.zip) به عنوان document استفاده خواهیم کرد. توجه کنید که می‌توانید از نام فایل‌ها به عنوان نام کتاب استفاده کنید.  (فایل‌های مربوط به این کتاب‌ها را می‌توانید از [اینجا](../../static/datasets/SoftwareBooksDataset.zip) دانلود کنید)
:::

:::info
در طراحی پروژه، به تفاوت دو واژه `software` و `Software` توجه کنید!به طور مثال، می‌توانید همه کلمات را uppercase کنیم تا برنامه، به بزرگی و کوچکی حروف حساس نباشد. به این کار به اصطلاح، [normalization](https://en.wikipedia.org/wiki/Text_normalization) می‌گویند.
:::

چه روش‌های دیگری برای بالا بردن دقت جستجو به ذهنتان می‌رسد؟ (پاسخ را در ایشو بنویسید)


در ادامه برنامه خود را تست کنید و درستی خروجی را بررسی کنید. در اینجا نمونه‌ای از ورودی و خروجی مورد انتظار برنامه آورده شده است:

<details>
  <summary>مثال</summary>

ورودی

```
query
```

خروجی

```
Result1, Result2, Result3, ...
```

برای بررسی صحت خروجی خود می‌توانید وجود کوئری را در فایل‌های خروجی بررسی کنید.
</details>

## موتور جستجوی پلاس!

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

1. کلماتی که حتما باید در نتیجه وجود داشته باشند. (این کلمات پیشوندی ندارند)
1. کلماتی که حداقل یکی از آن‌ها باید در نتیجه وجود داشته باشند. (این کلمات با پیشوند `+` مشخص می‌شوند)
1. کلماتی که نباید در نتیجه وجود داشته باشند. (این کلمات با پیشوند `-` مشخص می‌شوند)

_ورودی نوع اول مانند And، نوع دوم مانند Or و نوع سوم مانند Not می‌باش د._

<details>
  <summary>مثال</summary>

```
get help +illness +disease -cough
```

با استفاده از Query بالا می‌توانیم کتاب‌هایی را پیدا کنیم که حتماً شامل عبارات `get` و `help` و همچنین حداقل یکی از عبارات `illness` و `disease` باشند و شامل عبارت `cough` نباشند.
</details>

## جمع‌بندی و مطالعه بیشتر

![](./images/phase01-google.gif)

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

برای آشنایی بیشتر با نحوۀ کار موتور‌های جستجو دیدن ویدیو [How Google searches one document among Billions of documents quickly](https://www.dideo.ir/v/yt/CeGtqouT8eA/how-google-searches-one-document-among-billions-of-documents-quickly%3F)
توصیه می‌شود.


<!-- ## جالب است بدانید:
آنچه که آموختیم، زیربنای ایجاد یکی از مهم‌ترین سرویس‌های جست‌وجو به نام ElasticSearch می‌باشد. این سرویس، حاصل یک پروژه متن‌باز است که امکانات مختلف ذخیره و بازیابی اطلاعات را فراهم می‌کند. در ادامه و در یکی از فاز‌های امتیازی آینده به طور دقیق‌تر به آشنایی و کار با این سرویس خواهیم پرداخت، اما چنانچه علاقه‌مند باشید، می‌توانید با پرس‌و‌جو از منتور خود و یا جست‌وجوی اینترنتی، با امکانات بیشتری این سرویس آشنا شوید و از ایده‌هایش در برنامه خود استفاده کنید. -->
Loading

0 comments on commit 0b556fd

Please sign in to comment.