واژههای زیادی امروزه در اطراف ما و در محیطهای مختلف مثل اینترنت، شبکههای اجتماعی، گروهها و کتابها در حال تولید هستند. این در حالی است که نرخ تولید این واژگان در گذشته بسیار کم و محدود بوده است. یکی از مباحثی که در حوزهی پردازش زبانها مورد بررسی قرار میگیرد، مبحث تعبیهسازی واژهها (word embedding) میباشد. تعبیه واژه معمولا به صورت تبدیل واژه به یک بردار صورت میگیرد به طوری که انتظار میرود کلماتی که در فضای برداری نزدیکتر هستند از نظر معنی یا کاربرد مشابه باشند. برای این منظور الگوریتمهای هوش مصنوعی یا آماری مختلفی در طول زمان ایجاد یا پیشنهاد شده است. این در حالی است که در شبکههای پیچیده با ویژگیهای خاص، همین اطلاعات به شکل دیگری نهفته است! احتمالا شما در توییتها حول موضوعات مشخصی صحبت میکنید یا افرادی را دنبال میکنید که دربارهی موضوعات مرتبط با شما صحبت میکنند. احتمال لینک بین صفحات اینترنت نشاندهندهی نوعی ارتباط موضوعی بین سایتها میباشد. احتمالا در شبکهی مقالات، ارتباط موضوعی بین مقالهها مشاهده میشود و بسیاری موارد دیگر. آیا میتوانیم به جای استفاده از الگوریتمهای مشخص و از پیش آموزشدیده، از طریق شبکههای موجود واژههای مرتبط به یکدیگر را پیدا کنیم؟ بدون این که لازم باشد ابتدا واژگان را به بردارهایی تبدیل کنیم؟ هدف ایجاد پیوندی بین دنیای پردازش زبان و شبکههای پیچیده میباشد. با ایجاد روشی برای پاسخدهی به این مسئله، میتوانیم اطلاعاتی را استخراج کنیم که همچون خروجیهای پردازش زبان طبیعی، برای نیازها یا توسعههای بعدی مورد استفاده قرارگیرند. همچنین این اطلاعات بر اساس رفتارهای شبکه ایجاد میشوند و تغییرات زمانی یا مکانی را در بر میگیرند. (مثلا ارتباط بین بایدن و انتخابات در برههی زمانی انتخابات) به عبارتی با اجرای مدوام این کار، میتوانیم از تغییرات لحظهای و پویای شبکههای پیچیده، برای کشف ارتباطات واژهای که ایجاد شده یا از بین میروند استفاده کنیم.
شبکهی اینترنت، شبکهی بزرگی از صفحات اینترنت میباشد که هر کدام از این صفحات دارای یکسری مطالب و همچنین یکسری لینک (اصطلاحاً anchor) به صفحات دیگر هستند. اگر صفحات مختلف شبکه اینترنت را به صورت نودهای شبکه در نظر بگیریم، وجود این لینکها به نوعی باعث ایجاد یکسری یال بین نودها میشود. اکنون هدف ما این است که از این شبکهی بزرگ برای استخراج کلمات هممعنا یا مرتبط (related) استفاده کنیم. مبنای ارتباط کلمات، میزان تکرارشدن یک ارتباط در شبکه میباشد. وقتی یک سایت در مورد ورزش صحبت میکند، احتمالا کلمات مربوط به حوزهی ورزش در این صفحه به خوبی مشاهده میشود. به همین دلیل خود کلمات یک صفحه ارتباطاتی را تشکیل میدهند (مثلا ارتباط بین کلمه فوتبال و توپ) در عین حال خود صفحات مختلف وب دارای لینک هستند و احتمالا یک صفحهی ورزشی، به دیگر صفحات ورزشی لینک میدهد. پس اگر در صفحهی اول کلمه «فوتبال» و صفحهی دوم «بازیکن» را ببینیم، این کلمات نیز به یکدیگر مرتبط هستند. اکنون به نوعی شبکهی اینترنت ما خود یک شبکهای از شبکهها (network of networks) میباشد چون خود کلمات یک صفحه نیز یک شبکه را تشکیل میدهند. اگر رخداد ارتباط کلمهی «فوتبال» و «توپ» بعد از خزش (crawl) تعداد زیادی صفحات وب، زیاد باشد نشان میدهد که احتمالا بین این کلمات ارتباط خوبی برقرار است و از نظر معنایی مرتبط یا نزدیک هستند. اگر 1 میلیون بار بین کلمهی «فوتبال» و «توپ» لینک برقرار شود در حالی که بین «درس» و «قالی» یک یال ایجاد شود، این نشاندهندهی ارتباط معنایی بین «توپ» و «فوتبال» میباشد.
هدف اصلی خزش صفحات وب میباشد برای این که گراف بزرگی از کلمات مرتبط استخراج شود. با این حال این شبکه خیلی بزرگ میباشد و ارتباط کلمات داخل یک صفحه دلیل محکمی بر ارتباط میان کلمات نیست و از طرفی تعداد کلمات یک صفحه متغیر (حداقل 200 کلمه) است که حجم زیادی از آنها کلمات غیرکاربردی مثل فعلها یا حروف اضافه هستند. به همین دلیل خوب است در حین تشکیل این گراف، یکسری عملیات برای کاهش حجم گراف و در عین حال بالابردن دقت گراف شبکه انجام دهیم. (چون در نظر گرفتن تمامی کلمات یک صفحه و ارتباطات آنها بیهوده و تنها باعث افزایش حجم گراف نهایی میشود) در ادامه پایههای اصلی انجام این کار را مورد بررسی قرار میدهیم و بعد از آن، معماری و شیوهی پیادهسازی صورتگرفته را بیان میکنیم. در نهایت خروجی کار و ارزیابی آن بر اساس پیادهسازی صورتگرفته ارائه میشود.
خزش وب یا اینترنت، برنامه ماشینی خودکاری است که محتوای موجود در اینترنت را جستجو و ذخیرهسازی میکند تا در ادامه برای نیازهای مختلف مورد استفاده قرار بگیرد. اساسا، خزندههای وب وظیفه درک مطالب موجود در یک صفحه وب را دارند تا بتوانند از طریق آن به صورت خودکار و بدون مداخلت انسان، لینک و صفحات جدید را پیدا کنند. برای این کار، این رباتها با واکشی چند صفحه وب آغازین (اصطلاحاً seed) شروع به کار میکند و سپس لینکهای موجود در آن صفحات وب را برای یافتن صفحات بعدی و تکرار فرآیند دنبال میکند.
اگر چه در ظاهر انجام خزش ساده میباشد اما لازم است نکاتی در نظر گرفتهشود و پیادهسازی آن به سادگی بیانشده نیست. از جمله نکاتی که باید در این مورد در نظر گرفته شود، میتوان موارد زیر را نام برد:
به منظور استخراج کلمات مهم یک صفحهی وب، به دنبال الگوریتمهایی برای استخراج کلمات مهم هستیم. هدف از استخراج کلمات مهم کاهش حجم اطلاعاتی است که ذخیره میکنیم زیرا ذخیرهسازی تمام کلمات از جمله حروف و حرفهای اضافه صرفاً حجم نگهداری داده را افزایش میدهد. این در حالی است که نگهداری تمامی این کلمات فایدهای ندارد. این الگوریتمها تحت عنوان word extraction شناخته میشوند. معمولا مهمترین و معروفترین الگوریتم که افراد مختلف در این حوزه پیشنهاد میدهند، الگوریتم TF-IDF میباشد. با این حال این الگوریتم و موارد مشابه آن به دلایل مختلف برای هدف این پیادهسازی مناسب نیستند:
همچنین روشهای مبتنی بر یادگیری نیز برای هدف پروژه مفید نیستند. این روشها وابسته به دادهی یادگیری هستند و قابلیت تعمیم کمی را در فضای اینترنت با صفحات مختلف و متنهای مختلف دارند. همچنین هزینهی یادگیری در این روشها نیز افزوده میشود و مشابه با روش TF-IDF، نیاز به حجم خوبی از کل داده دارند (برای یادگیری و سپس استخراج) و به همین دلیل معایب روش TF-IDF را نیز شامل میشوند. این روشها همچنین از مشکلات جدیدتری مثل وابستهشدن زیاد به ورودی تمرین یا دقت کم رنج میبرند و اگر متن کاملا جدیدی متفاوت از دادههای تمرین دریافت کنند، احتمالا به خوبی عمل نخواهند کرد.
به همین دلیل با توجه به محدودیتهای روشهای بیانشده و حجم دادهی ما، استفاده از روشهای با ویژگیهای زیر برای ما مفید نیستند:
در نتیجه ما در این پیادهسازی به دنبال روشهایی هستیم که بدون مشاوره و مستقلاً برای هر صفحه، کلمات مهم را استخراج کنند. در این میان روشهای مختلفی بررسی شدند که با توجه به محدودیت مقاله، زمان توضیح بررسی هر کدام از موارد نیست. در ادامه نام برخی از الگوریتمهای مهم بررسیشده، سال انتشار و خلاصهای از رویکرد آن را مشاهده میکنیم.
روشهای دیگری هم نیز بررسی شدند اما مهمترین آنها در این قسمت ذکر شدند. هر کدام از روشها و منطق پیادهسازی آنها بررسی شد. تلاش شد تا حد امکان پیادهسازیهای آنها یافت شده یا ایجاد شود و بر روی متون مختلف عملکرد آنها بررسی شود. در نهایت بر اساس بررسیها و مطالعات مختلفی که رخ داد، الگوریتم YAKE با بهترین نتایج به عنوان پایه و اساس برای ادامهی کار انتخاب شد.
در ادامه با توجه به حجم عظیمی از داده که ایجاد میشود لازم داریم که تا ابزارهایی مناسب در جهت موارد زیر را استفاده کنیم:
البته شاید با توجه به مدت زمان محدودی که برای پیادهسازی و سپس اجرای برنامه وجود دارد، حجم زیادی داده جمعآوری نشود اما پیادهسازی بر اساس فرض حجم زیاد داده انجام میشود تا برنامهی پیادهسازی برای استفاده دیگران در مقیاس حجم زیاد کاربردی باشد. بررسیهای مختلفی روی ابزارهای مختلف صورت گرفت تا از میان ابزارهای موجود و پیشرفتهای اخیر، بهترین تکنولوژی برای این موضوع انتخاب شود. معروفترین ابزارهای یافتشده در حوزه پردازش شبکههای بزرگ و پیچیده موارد زیر بودند:
این ابزارها، معروفترین موارد بودند. با این حال رویکرد هر کدام و محبوبیت هر کدام بررسی شد و تلاش شد بر اساس میزان بروزبودن، محبوبیت، قابلیتها و مقایسههای موجود در اینترنت (benchmarkها) ابزاری را برای پیشبرد پروژه انتخاب کنم. بر این اساس تصمیم گرفتم تا بر اساس ابزار Apache Spark ادامهی کار را پیش ببرم. این ابزار هم نسبت به دیگر ابزارهای جدید بروز بود و همچنین از محبوبیت بسیاری برخوردار بود.
در کنار انتخاب ابزارها، پیادهسازی صورتگرفته تا حد امکان به صورت ماژولار انجام میگیرد. هدف از پیادهسازی ماژولار این است که تا حد امکان به معماری میکروسرویس نزدیک باشیم و امکان اجرای هر کدام از بخشها به صورت مستقل قابل انجام باشد. معماری برنامه بر اساس این توضیحات در نهایت به صورت زیر میباشد:
کلیه برنامههایی که در تصویر مشاهده میکنید، در کنار یکدیگر هدف نهایی این پیادهسازی یعنی ساخت گراف کلمات مرتبط را انجام میدهند. در این راستا از یکسری سرویسهای زیرساختی آماده نیز استفاده شده است که فهرست آنها را در پایین تصویر مشاهده میکنید و محل استفاده هر کدام را نیز در بخش ماژولهای پیادهسازیشده مشاهده میکنید. همچنین در پیادهسازی برنامههای موردنیاز، ارتباطات میان تمام برنامهها از طریق زیرساختهای مستقل فراهم شده است. برای این منظور از ساختار صف توزیعشده (Kafka) و فایلسیستم توزیعشده (HDFS) استفاده شده است. این نحوهی معماری این امکان را میدهد تا هر کدام از از برنامهها به صورت مستقل اجرا شوند چون ورودی آنها و خروجی آنها مستقیماً به دیگر برنامهها فرستاده نمیشود و در محلهای میانی ذخیره میشود. در ادامه به صورت خلاصه کارکرد هر کدام از برنامهها را مورد بررسی قرار میدهیم.
برای پیادهسازی هر کدام از این مولفهها نیز از یکسری سرویسهای زیرساختی استفاده شده است که در ادامه توضیح خلاصهای را در مورد هر کدام از آنها بیان میکنیم:
بر اساس پیادهسازی صورتگرفته، سایتهای اولیه برای اجرا و تولید گراف نهایی مشخص شدند. فهرست سایتهای اولیه که برای خزش انتخاب شدند، موارد زیر بودند که همگی جزو سایتهای معروف هستند:
همچنین برای رعایت ادب در هنگام خزش، مدت زمان یک دقیقه فاصله بین درخواستها به یک دامنه یکسان فاصله انداخته شد. مدت زمان محدودی به دلیل پیادهسازی خود مولفهها، بخش خزشکننده در حال اجرا بود و همچنین به دلیل مصرف اینترنت بالای مولفه، صرفا در ساعت خاصی از روز که اینترنت رایگان داشتم، اجرا شد. (که البته در این ساعت نیز سرعت اینترنت حداقل مقدار بود) در نهایت تعداد 150 هزار صفحه یافت شد که از میان آنها 10 هزار صفحه، محتوا و لینکهایشان به صورت کامل استخراج شد. به ازای هر صفحه تنها صد کلمهی کلیدی استخراج گردید و مبتنی بر همین مشخصات، گراف خروجی ساخته شد. در ادامه پیش از نتیجهگیری، چند نمونه از شکار صحنههای زیبا را برای گراف خروجی را مشاهده میکنیم.
همانطور که در تصویر بالا مشاهده میکنید، ما توانستیم تمامی ماههای میلادی را با ارتباطات زیاد در یک گروه و دستهبندی تقریبا متصل داشته باشیم و این در حالی هست که ما هیچگونه دانشی در این سامانه در مورد ماههای سال قرار نداده بودیم و خود سامانه توانسته بود این رابطه را بر اساس لینکها و محتوای موجود در اینترنت، استخراج کند.
همانطور که در این تصویر مشاهده میکنید، بین «حریم شخصی» با سه مفهوم «سیاست»، «داده» و «اطلاعات» ارتباطاتی تشخیص داده شده است که تا حدود زیادی مفاهیم مرتبط به یکدیگر میباشند.
در تصویر بالا کلیهی خدماتی که توسط شرکت مایکروسافت ارائه میشوند را میتوانیم مشاهده کنیم. به عنوان مثال «سیستمعامل ویندوز»، تبلت پیشرفتهی «surface» آن، دستگاه «Xbox»، زیرساخت ابری «Azure» و حوزههای کاری مثل «آموزش»، «بازی»، «توسعهدهنده» و «کسب و کار» را مشاهده میکنیم.
در تصویر بالا دو گروه تشخیص داده شده دیگر را مشاهده میکنید. در سمت چپ مشاهده میکنید که بین مفاهیم «سلامتی» و «دولت» و «سرمایهگذاری» ارتباطی تشخیص داده شده است که میتواند حاکی از این باشد که به دلیل بیماری کرونا در شرایط کنونی، دولت قصد دارد در حوزهی سلامت سرمایهگذاری کند. در سمت راست تصویر، ارتباط خودکار تشخیص داده شده بین تمامی مرورگرهای معروف را مشاهده میکنیم که دوباره بدون دانش قبلی و توسط سامانه کشف شده است.
در تصویر بالا نیز مشاهده میکنیم که مفاهیم موجود در حوزهی توسعهی وب مشاهده میشوند از جمله تکنولوژیهای پایه که برای پیادهسازی آن استفاده میشوند.
همانطور که در تمامی مثالهای بالا مشاهده کردیم، روابط مختلفی از دیدگاههای مختلف به صورت خودکار تشخیص داده شده بودند و این در حالی که بود که هنوز کل گراف نشان داده نشده بود و همچنین هر مقدار تعداد لینکهای بیشتری خزش شوند، کیفیت خروجی بهبود پیدا میکند. همچنین بسته به این که لینکهای اولیه بهتر و بیشتری استفاده میشود، میتوان به خروجی خیلی بهتر و کاملتری رسید. با این حال با همین مقدار خروجی میتوان مشاهده کرد که خودکار بودن این ابزار و امکان استخراج یکسری مجموعه از کلمات مرتبط (مثلا از طریق communityها) میتواند برای ساخت پایگاه دادهای از کلمات مرتبط مفید باشد. این پایگاه داده میتواند در مراحل بعدی توسط ابزارهای پیشنهاددهنده و جستجوگرها، تحلیلگرهای مبتنی بر پردازش زبان طبیعی و ... مورداستفاده قرار بگیرد. پیادهسازی این پروژه را در این لینک میتوانید مشاهده کنید.
این مطلب، پروژه درس شبکههای پیچیده در دانشگاه شهیدبهشتی است.