نشریه دانشکده کامپیوتر دانشگاه صنعتی اصفهان
دستیاران صوتی و NLP
رادیو فرامتن - شماره یک - این قسمت: دستیاران صوتی و NLP
مقدمه
تا حالا به این فکر کردین که سیری، گوگل اسیستنت، الکسا و به طور کلی همه ی این دستیارهای صوتی دقیقا چطور کار میکنند؟ چطور از صدای ما مفاهیم رو درک میکنن و بعد متناسب با اون عملی رو انجام میدن؟ برنامهای رو به تقویممون اضافه میکنن، با کسی تماس میگیرن، یا حتی جواب معنیدار به ما میدن؟
زبان تا تعریف پردازش زبان طبیعی
شاید بهتره اول سوالهای سادهتر و اولیهتری رو از خودمون بپرسیم، مثلا اینکه ما چطوری زبان همدیگه رو میفهمیم و با هم ارتباط برقرار میکنیم؟
اهمیت جواب این سوال اینجاست که یه شهودی از پیچیدگی کار این دستیاران صوتی بهمون میده و همینطور بهمون کمک میکنه با تقلید از عملی که انسان انجام میده یک دستیار صوتی رو طراحی و پیادهسازی کنیم.
زبان به طور کلی مقوله پیچیدهایه، زبانشناسها همچنان تو پیچ و خم یه جادهاش موندن، مثلا بیاین به این فکر کنین که من وقتی میگم دو شما به چی فکر میکنین؟ آیا به ورزش دو فکر میکنین؟ به خود عدد دو فکر میکنین؟ اگه به عدد دو فکر میکنین، دقیقا به چه چیزی فکر میکنین؟ دو تا درخت؟ دو تا چی؟ آیا یک تصویر از عدد دو تو ذهنتون دارین؟ یا یک مفهوم؟ من میتونم با این کلمات که صرفا صوتهایی هستند که به مفاهیم نسبت دادیم بازی کنم و بگم دو یک عدد فرده! شما متوجه اشتباه من میشید! اما یک دستیار صوتی چی؟
زبان از اجزای متفاوت و زیادی تشکیل شده مثل حروف، کلمات، جملهها، علائم نگارشی و چیزهای دیگه! حتما داستان بخشش، لازم نیست اعدامش کنید! یا بخشش لازم نیست، اعدامش کنید! رو شنیدن، این یک مثال خوبه برای اینکه ثابت کنیم همه این اجزا اهمیت زیادی دارن و باعث میشن مفاهیم شکل بگیرن و یه ویرگول کوچیک میتونه باعث بشه یک جمله چندین مفهوم متفاوت و متضاد داشته باشه!
برگردیم به سوال اول خودمون، ما نهایتا از طریق زبان با کامپیوتر حرف میزنیم، بهش دستور میدیم تا عملی رو انجام بده و ازش میخوایم با فرمت مورد علاقه ما جواب رو برامون نمایش بده! خب حالا نکتش اینه که زبان برنامهنویسی تعداد انگشت شماری قاعده و کلمه خاص داره که باید حتما به صورت دقیق و بدون اشتباه به کامپیوتر گفته بشه، اما توی مکالمههای روزمره، ما خیلی وقتها اشتباهاتی از نظر دستور زبانی داریم یا حتی بعضی کلمهها رو برای سادگی به قرینه حذف میکنیم.
خب پس توانایی درک زبان توسط کامپیوترها هنوز خیلی پایینتر از اون چیزیه که توی یک مکالمه روزمره انسان اتفاق میافته! اینجاست که ما باید سعی کنیم به اونها فهمیدن زبان طبیعی یا همون زبان انسانی رو یاد بدیم، بر همین اساس بخشی از علوم کامپیوتر به اسم پردازش زبان طبیعی یا Natural Language Processing یا به صورت مخفف NLP متولد میشه!
پردازش زبان طبیعی به طور کلی به دو بخش اساسی تقسیم میشه، بخش اول روی فهمیدن زبان طبیعی تمرکز می کنه که بهش NLU میگن؛ دقیقا همون کاری که گوگل برای فهمیدن اسپم بودن یک ایمیل انجام میده! و بخش دوم هم روی تولید کردن زبان طبیعی تمرکز میکنه مثل وقتی که گوگل ترنسلیت تلاش میکنه متن شما رو ترجمه کنه و یا سیری جواب شما رو میده که بهش NLG میگن!
حال چطور میفهمد؟ شکافتن NLP
خب حالا میرسیم به اینکه کامپیوترها چطور مفاهیم رو از روی کلمات و جملاتی که ما بهشون میگیم درک میکنن!
بیاید به مثال انسانی خودمون برگردیم، یک بچه انسان تقریبا دو سال رو صرف مشاهده و شنیدن میکنه و بعد از این دوره، سکوتش رو میشکنه و اولین جملاتش رو بیان میکنه، زبانشناسها حتی توی مطالعه یادگیری زبان در انسانها هم چالشهای زیادی رو تجربه کردن، بعضیهاشون معتقدن بچه انسان یاد میگیره تقلید کنه و این دو سال رو صرف درک مفاهیمی که به کلمات و ساختارها گره خوردن میکنه، از سمت دیگه خیلی از زبانشناسها معتقدن زبان یه چیز ذاتی و درونیه و تقلیدی نیست بلکه بچه انسان خودش دست به خلق و تولید میزنه، مثلا وقتی یک بچه از شما میپرسه: غذا کی میپخه؟ شما میتونید با اطمینان بگید که فعل میپخه رو اون کاملا از خودش ابداع کرده! جالبه نه؟
نکته اساسی درNLP، فهمیدن مفاهیم کلماته، که این خودش کار سادهای نیست چون کلمات به خودی خود معنی ندارن، بلکه صرفا اصوات و سمبلهایی هستن که به مفاهیم ذهنی نسبت داده شدن و میتونن وابسته به متن تغییر معنا بدن!
قبل از اینکه وارد این بحث بشیم که چطور کامپیوترها کلمات رو میفهمن باید غول دیگهای رو رد کنیم و اون هم تبدیل صدا به کلمات نوشته شدست، درواقع همه این ابزارها در وهله اول صدای ما رو با همه گویشها و لهجهها و تنهای مختلف میشنون و بعد صوت شنیده شده رو به کلمات تبدیل میکنن! اما چطور این کار رو انجام میدن؟
هر صوتی توسط بخش خاصی از دهن و حنجره ما تولید میشه که فرکانس و شکل موج مربوط به خودش رو داره، نهایتا این موج یک طرحواره از خودش به جا میذاره که به کلمه مربوط به خودش متناظر شده، درنتیجه وقتی صحبت میکنیم یک ابزار فیزیکی این طرحهای صوتی ناشی از اثر موجها رو میبینه و کلمهای که طرحوارهاش بیشترین شباهت به طرح دیده شده داره رو پیدا میکنه و اینجوری صدا به متن تبدیل میشه!
جالبه بدونید اولین سیستم تشخیص گفتار در سال 1952 توی آزمایشگاههای بل ساخته شد. این سیستم که Audrey نامگذاری شده بود، قادر به تشخیص ده رقم اصلی انگلیسی بود و در نوع خودش نوآوری خوبی محسوب میشد!
حالا که تونستیم صوت رو به نوشته تبدیل کنیم وقتشه که این نوشته رو تحلیل کنیم و منظور اون رو بفهمیم؛ برای این کار روشهای مختلفی وجود داره:
اولین و سادهترین راه اینه که بیایم کل کلمات و جملات ممکن رو داخل یک دیکشنری خیلی بزرگ داشته باشیم و هر دفعه برای پردازش، داخل این دیکشنری جستجو کنیم. این راه نه از نظر حافظه و نه از نظر زمان بهینه نیست و پیادهسازیش عملا غیرممکنه.
مثلا اگه از دستیار صوتیمون بپرسیم که "آب و هوا امروز چطوره؟" برای فهمیدن این جمله ابتدا باید اجزای اصلی اون مثل نهاد، گزاره، فعل و فاعل رو تشخیص بده. بعد از روی این قسمتها یه درخت معنایی به نام درخت تجزیه بسازه و معنای هر قسمت توی ساختار مشخص رو بسنجه و در نهایت معنی جمله معلوم میشه؛ به این صورت که با نگاه کردن به آخر جمله متوجه میشه این جمله سوالی و از نوع "چطوره!" هست. بعد به نهاد دقت میکنه و میفهمه که در مورد آب و هوا داره صحبت میشه. در نهایت با توجه به قید "امروز" متوجه میشه که آب و هوای امروز مورد سواله! در نهایت کافیه یه سر به پایگاههای داده هواشناسی بزنه و بر اساس شهری که توش هستین، اطلاعات آب و هوای امروز رو به شما نشون بده.
حالا اگه فرد دیگه ای بپرسه "آیا امروز هوا بارونیه؟" باز هم عملی که یه دستیار صوتی انجام میده ثابته؛ چک کردن آب و هوا! پس میتونیم بفهمیم که بین بارون و آب و هوا رابطه معنایی وجود داره. استفاده از این رابطه میتونه به بهبود عملکرد و سرعت تشخیص زبان کمک بزرگی بکنه.
حالا چطوری رابطه معنایی بین کلمات رو بفهمیم؟ بعضی مواقع میتوانیم به حروفی که در کلمات مختلف مشترک است دقت کنیم، این زمانی خوب کار میکنه که یک کلمه مورفولوژی یا به عبارت دیگر ساختار واژهای داشته باشه، مثلا شناگر و شنا کردن رو در نظر بگیرید! درواقع ما کلمه شنا رو میفهمیم و وقتی کسی در حال انجام دادنش باشه به اون شخص شناگر و به فعلی که انجام میده شنا کردن میگیم! به این شکل فقط با دانستن کلمه شنا هم دو کلمه دیگر رو درک کردیم و هم توانایی تولید دو کلمه با معنی دیگر رو بدست آوردیم! البته این روش همیشه و همه جا جواب نمیده و کلماتی مانند آسیا و آسیب هیچ رابطه معنایی با هم ندارند.
یک راه دیگه برای درک هممعنی بودن کلمات مختلف استفاده از مفهوم Distributional Semantic هستش، در این روش ما به اینکه چه کلماتی با یکدیگر در جملات متعددی ظاهر شدند دقت میکنیم و در واقع معنی یک کلمه رو وابسته به همراهانش در جملهها درک میکنیم. اما این کار چطور انجام میشه؟ برای انجام این کار ما از Count Vector ها استفاده میکنیم، به این صورت که تعداد زیادی نوشته و مقاله رو برمیداریم که شامل کلمات مورد مطالعه ما هستند؛ سپس تعداد کلمات دیگهای که توی این نوشته ها ظاهر شدن رو میشماریم ، حال به ازای هر کلمه لیستی از کلمات دیگه و تعداد تکرارشون توی متنها رو داریم، در اینجا هر چقدر لیست هامون شبیه به همدیگه باشن نتیجه میگیریم که کلمات متناظر با این دو لیست معانی نزدیک به همی دارند!مثل کلمات پرنده و طوطی. البته این روش هم نقضها و کاستیهای خودش رو داره، مثلا باید متناظر با هر کلمه لیست طولانی و بلندی رو ذخیره کنیم و هر وقت میخواستیم شباهت این کلمه رو با کلمه دیگری بفهمیم لازم داریم این دو لیست طولانی رو با هم مقایسه کنیم! پس به حافظه و قدرت پردازش زیادی نیاز داریم!
استفاده از درخت تجزیه به همراه گراف معنایی باعث میشه تا حد خیلی خوبی از ابهام دور شیم؛ مثلا دو کلمه شیر و شیر توی فارسی دقیقاً یک جور هستن و یک جور تلفظ میشن، حالا دستیار صوتی بیچاره چجوری باید بفهمه منظور چیه؟ جمله "من یک شیر پاکتی خریدم" رو در نظر بگیرید، اینجا میتونیم با کمک شبکه معنایی و همنشینی کلمات پاکت و شیر این ابهام رو برطرف کنیم. از طرفی وقتی میگیم "شیر غرش کرد" اگه درخت تجزیه و ساختار جمله رو در نظر بگیریم با توجه به فعل متوجه میشیم که منظور حیوان شیره!
تا اینجا بخش اول NLP که فهمیدن زبان بود رو بررسی کردیم، حالا وقتشه ببینیم دستیارهای صوتی چجوری با استفاده از NLP جملات بامعنا تولید میکنن؟
فرض کنید یک تمرین پر کردن جای خالی داشته باشیم، مثلا:
من خیلی گشنمه، فکر کنم دلم یکم _____ شکلاتی میخواد!
توی این مثال احتمالا حدس میزنید که جای خالی باید یه چیزی شبیه کیک باشد و نه سیب زمینی، چرا که در هیچ متنی به سیب زمینی شکلاتی بر نخوردیم و احتمالا چنین چیزی وجود خارجی نداره! در اینجا نقشِ داده هایی که قبلا توسط مدل ما مطالعه شدن رو متوجه میشیم! دقت کنین که به طور کلی ما از اطلاعات آماری هم بهره میبریم، یعنی مثلا فرض کنید دو جواب ممکن برای جای خالی ما وجود داشته باشه، طبیعیه جوابی رو انتخاب کنیم که دفعات بیشتری در متونِ از پیش مطالعه شده ظاهر شدن، همین روش آماری برای تشخیص خطاها هم استفاده میشن ، در واقع اگر مدل ما جمله را شنید و متوجه شد کلمه ای در این جمله وجود داره که تا به حال آن را با این ترکیب از کلمات ندیده، حدس میزند اشتباهی رخ داده و به دنبال کلمه ای می گرده که با این ترکیب از کلمات بسیار دیده شده! و اینگونه خطاهای شنیداری خودش یا خطای انسانی گوینده را اصلاح میکنه!
حالا بیاین یکمی پیچیدهترش کنیم، فرض کنین این جمله رو داریم:
دوست من سارا که به شیمی خیلی علاقه داره، منو آخر هفته به تولدش دعوت کرده؛ پس باید به دنبال یه هدیه برای _____ باشم!
در مثال قبل ما به "شکلاتی" که نزدیکترین کلمه به جایخالی بود، دقت کردیم و به دنبال کلماتی گشتیم که با "شکلاتی" تشکیل یک ترکیب بامعنی رو میدادن، در اینجا جای خالی با او پر میشه و او ضمیری برای ساراست، کلمهای که با جایخالی فاصله زیادی داره! پس در اینجا ما باید کلمه سارا رو به خاطر داشته باشیم تا بتونیم تصمیم درستی برای جایخالی بگیریم! در واقع اون چه باید بهش توجه بشه دو نکتهست: 1) ضمیر مناسب برای سوم شخص مفرد و 2) خود کلمه سارا
حالا اگر جمله را به این صورت ادامه بدیم که:
دوست من سارا که به شیمی خیلی علاقه داره، منو آخر هفته به تولدش دعوت کرده؛ پس باید به دنبال یه هدیه برای او باشم که ربطی به _____ داشته باشه!
در اینجا مدل ما باید معنی دوست داشتن و شیمی رو به خاطر داشته باشه تا بتونه به این سوال هم جواب دقیقی بده، نهایتاً هر مدلی ظرفیتی داره و احتمالا نمیتونه همه مفاهیم جمله رو یادش بمونه، همینجاس که شاهد بعضی بیدقتیهای این دستیارهای صوتی هستیم!
برای انجام همه این کارها ما از سری الگوریتمهایی به اسم Neural Networks یا شبکه عصبی استفاده میکنیم، این ابزار با دادن یه بیان رندوم به کلمات شروع میکنه، بعدش با نگاه کردن به دادههایی که داره، بیانش رو مرحله به مرحله دقیقتر میکنه، به طور کلی روش کارشون مثل تمرین پر کردن جایخالی، در جمله ماست، مثل اینه که اونها با یه جملهی کاملاً خالی شروع کردن و یکییکی کلمات مناسب رو کنار هم قرار دادن تا به یک جمله کامل برسن. بعد جملهای که ساختن رو با دادههایی که از قبل دیدن مقایسه میکنن و بر اساس اون به این جمله یک امتیازی میدن و وابسته به این امتیاز قدرت حدس زدن خودشون رو تقویت میکنن.
آینده و پیشبینیها
تا به اینجا ما متوجه شدیم که پشت پردهی این دستیاران صوتی خوب و مهربون چی میگذره و طی چند تا مثال با نحوهی کارشون آشنا شدیم اما آیندهی این دستیاران صوتی چه خواهد بود؟
به طور کلی میشه دو آینده رو براشون تصور کرد:
- اول اینکه با توجه به ظهور تکنولوژیهای جدیدی مثل تراشهها و میکروچیپهایی که داخل مغز کار گذاشته میشن، دیگه لازم نیست دستوراتمون رو بگیم و فقط با فکر کردن به یه کار میتونه اون کار انجام بشه. پس ممکنه با اومدن این مدل تکنولوژیها دیگه غولهای بزرگ تکنولوژی خیلی به فکر ویس اسیستنتها نباشن و بیشتر به سمت تکنولوژی جدیدتر برن.
- آیندهی دومی که واقعیتر و دستیافتنیتر به نظر میاد اینه که شرکتها بیخیال کارهایی که تا امروز کردن نشن و سعی کنن علاوه بر دقت و دامنه لغات، به قدرت و توانایی دستیارهای صوتیشون اضافه کنن. به طوری که گوگل ادعا میکنه به زودی از قابلیتی به نام Google Duplex پردهبرداری میکنه که به شما این امکان رو میده کارهای روزمره خودتون بهش بسپرید و اون رو به عنوان یه منشی تماموقت که همهی کارهای شما رو به بهترین نحو ممکن انجام میده، استخدام کنید.
این بود داستان دستیارهای صوتی و NLP، دفعه بعدی که از این دستیارها استفاده میکنید میتونید بهتر درک کنید که چه الگوریتمهای پیشرفته و پیچیدهای باید توی پشت صحنه اجرا بشن تا صحبت شما فهمیده بشه و عمل متناظر با اون انجام بشه. شگفت انگیزه، مگه نه؟
به پایان اولین شماره از رادیو فرامتن رسیدیم؛ من فاطمه قدم زاده هستم و این پادکست توسط بچههای دانشکده کامپیوتر دانشگاه صنعتی اصفهان آمادهسازی و تدوین شده. تشکر میکنم از سپهر شیرانی، محمد مهدی برقی، دانیال خراسانی زاده و زینب صادقیان که زحمت جمعآوری دادههای این پادکست رو کشیدن؛ همچنین از سپهر گنجی و فاطمه قاسمی که به عنوان نویسنده کنارمون بودن. در نهایت ممنونیم از سنا محراببیگی، محمد جلالی و رسول بوسعیدی که به بهتر شدن متن و هماهنگیهای تیم کمک کردن.
رادیو فرامتن رو میتونید از کانالهای ما در تلگرام، ناملیک، کست باکس و شنوتو دنبال کنید. اگه این پادکست براتون مفید بود با معرفی ما به دوستاتون میتونید برای ادامه پادکست بهمون انرژی بدید.
منتظر شمارههای بعدی رادیوفرامتن باشید :)
مطلبی دیگر از این انتشارات
۲۵ نکته که زندگی من رو متحول کرد!
مطلبی دیگر از این انتشارات
حفره
مطلبی دیگر از این انتشارات
روش های توسعه اپ موبایل