# مقدمه‌ای بر پردازش زبان طبیعی این درس به تاریخچه‌ای کوتاه و مفاهیم مهم *پردازش زبان طبیعی*، یکی از زیرشاخه‌های *زبان‌شناسی محاسباتی* می‌پردازد. ## [آزمون پیش از درس](https://ff-quizzes.netlify.app/en/ml/) ## مقدمه پردازش زبان طبیعی، که به اختصار NLP نامیده می‌شود، یکی از شناخته‌شده‌ترین حوزه‌هایی است که یادگیری ماشین در آن به کار گرفته شده و در نرم‌افزارهای تولیدی استفاده شده است. ✅ آیا می‌توانید نرم‌افزاری را که هر روز استفاده می‌کنید و احتمالاً دارای پردازش زبان طبیعی است، نام ببرید؟ چه برنامه‌های پردازش متن یا اپلیکیشن‌های موبایلی که به طور مرتب استفاده می‌کنید؟ شما درباره موارد زیر یاد خواهید گرفت: - **ایده زبان‌ها**. چگونگی توسعه زبان‌ها و حوزه‌های اصلی مطالعه در این زمینه. - **تعاریف و مفاهیم**. همچنین درباره تعاریف و مفاهیمی که به چگونگی پردازش متن توسط کامپیوترها مربوط می‌شود، از جمله تجزیه، دستور زبان، و شناسایی اسم‌ها و فعل‌ها خواهید آموخت. در این درس چندین وظیفه کدنویسی وجود دارد و مفاهیم مهمی معرفی می‌شوند که در درس‌های بعدی یاد خواهید گرفت چگونه آن‌ها را کدنویسی کنید. ## زبان‌شناسی محاسباتی زبان‌شناسی محاسباتی حوزه‌ای از تحقیق و توسعه است که طی دهه‌ها به مطالعه چگونگی کار کردن کامپیوترها با زبان‌ها، و حتی فهمیدن، ترجمه و ارتباط برقرار کردن با آن‌ها می‌پردازد. پردازش زبان طبیعی (NLP) حوزه‌ای مرتبط است که بر چگونگی پردازش زبان‌های انسانی یا "طبیعی" توسط کامپیوترها تمرکز دارد. ### مثال - دیکته تلفنی اگر تاکنون به جای تایپ کردن، به تلفن خود دیکته کرده‌اید یا از یک دستیار مجازی سوالی پرسیده‌اید، گفتار شما به شکل متن تبدیل شده و سپس پردازش یا *تجزیه* شده است. کلمات کلیدی شناسایی شده سپس به فرمتی تبدیل شده‌اند که تلفن یا دستیار بتواند آن را بفهمد و بر اساس آن عمل کند. ![درک](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) > درک واقعی زبان‌شناسی دشوار است! تصویر از [Jen Looper](https://twitter.com/jenlooper) ### چگونه این فناوری ممکن شده است؟ این امکان به دلیل این است که کسی یک برنامه کامپیوتری برای انجام این کار نوشته است. چند دهه پیش، برخی نویسندگان علمی-تخیلی پیش‌بینی کردند که مردم بیشتر با کامپیوترهای خود صحبت خواهند کرد و کامپیوترها همیشه دقیقاً منظور آن‌ها را خواهند فهمید. متأسفانه، این مشکل سخت‌تر از آن چیزی بود که بسیاری تصور می‌کردند، و در حالی که امروز این مشکل بسیار بهتر درک شده است، چالش‌های قابل توجهی در دستیابی به پردازش زبان طبیعی "کامل" وجود دارد، به ویژه در فهمیدن معنای یک جمله. این مشکل به خصوص در فهمیدن طنز یا تشخیص احساساتی مانند طعنه در یک جمله دشوار است. در این مرحله، ممکن است به یاد کلاس‌های مدرسه بیفتید که معلم بخش‌های دستور زبان در یک جمله را پوشش می‌داد. در برخی کشورها، دانش‌آموزان دستور زبان و زبان‌شناسی را به عنوان یک موضوع اختصاصی آموزش می‌بینند، اما در بسیاری از کشورها، این موضوعات به عنوان بخشی از یادگیری یک زبان آموزش داده می‌شوند: یا زبان اول شما در مدرسه ابتدایی (یادگیری خواندن و نوشتن) و شاید یک زبان دوم در دوره متوسطه یا دبیرستان. نگران نباشید اگر در تشخیص اسم‌ها از فعل‌ها یا قیدها از صفت‌ها متخصص نیستید! اگر در تفاوت بین *حال ساده* و *حال استمراری* مشکل دارید، تنها نیستید. این موضوع برای بسیاری از افراد، حتی گویندگان بومی یک زبان، چالش‌برانگیز است. خبر خوب این است که کامپیوترها در اعمال قوانین رسمی بسیار خوب هستند، و شما یاد خواهید گرفت که کدی بنویسید که بتواند یک جمله را *تجزیه* کند، همانند یک انسان. چالش بزرگ‌تر که بعداً بررسی خواهید کرد، فهمیدن *معنا* و *احساس* یک جمله است. ## پیش‌نیازها برای این درس، پیش‌نیاز اصلی توانایی خواندن و فهمیدن زبان این درس است. هیچ مسئله ریاضی یا معادله‌ای برای حل وجود ندارد. در حالی که نویسنده اصلی این درس را به زبان انگلیسی نوشته است، این درس به زبان‌های دیگر نیز ترجمه شده است، بنابراین ممکن است شما در حال خواندن یک ترجمه باشید. در مثال‌ها، از چندین زبان مختلف استفاده شده است (برای مقایسه قوانین دستوری مختلف زبان‌ها). این زبان‌ها *ترجمه نشده‌اند*، اما متن توضیحی ترجمه شده است، بنابراین معنا باید واضح باشد. برای وظایف کدنویسی، شما از Python استفاده خواهید کرد و مثال‌ها با Python 3.8 نوشته شده‌اند. در این بخش، شما نیاز دارید و استفاده خواهید کرد: - **درک Python 3**. درک زبان برنامه‌نویسی Python 3، این درس از ورودی، حلقه‌ها، خواندن فایل، و آرایه‌ها استفاده می‌کند. - **Visual Studio Code + افزونه**. ما از Visual Studio Code و افزونه Python آن استفاده خواهیم کرد. شما همچنین می‌توانید از یک IDE Python دلخواه خود استفاده کنید. - **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) یک کتابخانه ساده برای پردازش متن در Python است. دستورالعمل‌های موجود در سایت TextBlob را دنبال کنید تا آن را روی سیستم خود نصب کنید (همچنین corpora را همانطور که در زیر نشان داده شده نصب کنید): ```bash pip install -U textblob python -m textblob.download_corpora ``` > 💡 نکته: شما می‌توانید Python را مستقیماً در محیط‌های VS Code اجرا کنید. برای اطلاعات بیشتر، [مستندات](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) را بررسی کنید. ## صحبت کردن با ماشین‌ها تاریخ تلاش برای فهمیدن زبان انسانی توسط کامپیوترها به دهه‌ها قبل بازمی‌گردد، و یکی از اولین دانشمندانی که پردازش زبان طبیعی را در نظر گرفت، *آلن تورینگ* بود. ### آزمون تورینگ وقتی تورینگ در دهه ۱۹۵۰ درباره *هوش مصنوعی* تحقیق می‌کرد، او در نظر گرفت که آیا می‌توان یک آزمون مکالمه‌ای به یک انسان و کامپیوتر (از طریق مکاتبه تایپی) داد که در آن انسان در مکالمه مطمئن نباشد که با یک انسان دیگر یا یک کامپیوتر مکالمه می‌کند. اگر پس از مدت مشخصی از مکالمه، انسان نتواند تعیین کند که پاسخ‌ها از یک کامپیوتر بوده یا نه، آیا می‌توان گفت که کامپیوتر *فکر می‌کند*؟ ### الهام - بازی تقلید ایده این آزمون از یک بازی مهمانی به نام *بازی تقلید* گرفته شده است که در آن یک بازجو در یک اتاق تنها است و وظیفه دارد تعیین کند کدام یک از دو نفر (در اتاق دیگر) به ترتیب مرد و زن هستند. بازجو می‌تواند یادداشت ارسال کند و باید سعی کند سوالاتی مطرح کند که پاسخ‌های نوشته شده جنسیت فرد ناشناس را آشکار کند. البته، بازیکنان در اتاق دیگر سعی می‌کنند بازجو را با پاسخ دادن به گونه‌ای که گمراه‌کننده یا گیج‌کننده باشد، فریب دهند، در حالی که ظاهر پاسخ دادن صادقانه را حفظ می‌کنند. ### توسعه الیزا در دهه ۱۹۶۰، یک دانشمند MIT به نام *جوزف ویزنبام* [*الیزا*](https://wikipedia.org/wiki/ELIZA) را توسعه داد، یک "روان‌درمانگر" کامپیوتری که از انسان سوال می‌پرسید و ظاهر فهمیدن پاسخ‌های آن‌ها را داشت. با این حال، در حالی که الیزا می‌توانست یک جمله را تجزیه کند و برخی ساختارهای دستوری و کلمات کلیدی را شناسایی کند تا پاسخی منطقی بدهد، نمی‌توان گفت که جمله را *فهمیده* است. اگر به الیزا جمله‌ای با فرمت "**من هستم** غمگین" ارائه می‌شد، ممکن بود کلمات جمله را بازآرایی کند و جایگزین کند تا پاسخ "چقدر **تو بوده‌ای** غمگین" را تشکیل دهد. این تصور را ایجاد می‌کرد که الیزا جمله را فهمیده و سوالی پیرو آن پرسیده است، در حالی که در واقع، فقط زمان فعل را تغییر داده و چند کلمه اضافه کرده بود. اگر الیزا نمی‌توانست کلمه کلیدی را که پاسخی برای آن داشت شناسایی کند، به جای آن پاسخی تصادفی می‌داد که ممکن بود برای بسیاری از جملات مختلف قابل استفاده باشد. الیزا به راحتی قابل فریب بود، برای مثال اگر کاربر می‌نوشت "**تو هستی** یک دوچرخه" ممکن بود پاسخ دهد "چقدر **من بوده‌ام** یک دوچرخه؟"، به جای پاسخی منطقی‌تر. [![گفتگو با الیزا](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "گفتگو با الیزا") > 🎥 روی تصویر بالا کلیک کنید تا ویدئویی درباره برنامه اصلی ELIZA ببینید > توجه: شما می‌توانید توضیحات اصلی [الیزا](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) که در سال ۱۹۶۶ منتشر شده است را بخوانید اگر حساب ACM دارید. به طور جایگزین، درباره الیزا در [ویکی‌پدیا](https://wikipedia.org/wiki/ELIZA) مطالعه کنید. ## تمرین - کدنویسی یک ربات مکالمه‌ای ساده یک ربات مکالمه‌ای، مانند الیزا، برنامه‌ای است که ورودی کاربر را دریافت می‌کند و به نظر می‌رسد که به طور هوشمندانه پاسخ می‌دهد. برخلاف الیزا، ربات ما قوانین متعددی برای ایجاد ظاهر یک مکالمه هوشمندانه نخواهد داشت. در عوض، ربات ما فقط یک توانایی خواهد داشت: ادامه دادن مکالمه با پاسخ‌های تصادفی که ممکن است در تقریباً هر مکالمه سطحی کار کنند. ### برنامه مراحل شما هنگام ساخت یک ربات مکالمه‌ای: 1. چاپ دستورالعمل‌هایی که به کاربر نحوه تعامل با ربات را توضیح می‌دهد 2. شروع یک حلقه 1. دریافت ورودی کاربر 2. اگر کاربر درخواست خروج داد، خارج شوید 3. پردازش ورودی کاربر و تعیین پاسخ (در این مورد، پاسخ یک انتخاب تصادفی از لیستی از پاسخ‌های عمومی ممکن است) 4. چاپ پاسخ 3. بازگشت به مرحله ۲ ### ساخت ربات بیایید ربات را بسازیم. ابتدا برخی عبارات را تعریف می‌کنیم. 1. این ربات را خودتان در Python با پاسخ‌های تصادفی زیر ایجاد کنید: ```python random_responses = ["That is quite interesting, please tell me more.", "I see. Do go on.", "Why do you say that?", "Funny weather we've been having, isn't it?", "Let's change the subject.", "Did you catch the game last night?"] ``` در اینجا نمونه‌ای از خروجی برای راهنمایی شما آورده شده است (ورودی کاربر در خطوطی که با `>` شروع می‌شوند): ```output Hello, I am Marvin, the simple robot. You can end this conversation at any time by typing 'bye' After typing each answer, press 'enter' How are you today? > I am good thanks That is quite interesting, please tell me more. > today I went for a walk Did you catch the game last night? > I did, but my team lost Funny weather we've been having, isn't it? > yes but I hope next week is better Let's change the subject. > ok, lets talk about music Why do you say that? > because I like music! Why do you say that? > bye It was nice talking to you, goodbye! ``` یک راه‌حل ممکن برای این وظیفه [اینجا](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) است. ✅ توقف و بررسی 1. آیا فکر می‌کنید پاسخ‌های تصادفی می‌توانند کسی را فریب دهند که فکر کند ربات واقعاً آن‌ها را فهمیده است؟ 2. ربات برای مؤثرتر بودن به چه ویژگی‌هایی نیاز دارد؟ 3. اگر یک ربات واقعاً بتواند معنای یک جمله را "فهمیده" باشد، آیا نیاز دارد معنای جملات قبلی در یک مکالمه را نیز "به خاطر بسپارد"؟ --- ## 🚀چالش یکی از عناصر "توقف و بررسی" بالا را انتخاب کنید و یا سعی کنید آن را در کد پیاده‌سازی کنید یا یک راه‌حل روی کاغذ با استفاده از شبه‌کد بنویسید. در درس بعدی، شما درباره تعدادی از رویکردهای دیگر برای تجزیه زبان طبیعی و یادگیری ماشین خواهید آموخت. ## [آزمون پس از درس](https://ff-quizzes.netlify.app/en/ml/) ## مرور و مطالعه شخصی به منابع زیر به عنوان فرصت‌های مطالعه بیشتر نگاهی بیندازید. ### منابع 1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . 2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. ## تکلیف [جستجو برای یک ربات](assignment.md) --- **سلب مسئولیت**: این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.