امین برجیان
امین برجیان
خواندن ۱۹ دقیقه·۲ سال پیش

شبکه واژه‌های مرتبط

چکیده

واژه‌های زیادی امروزه در اطراف ما و در محیط‌های مختلف مثل اینترنت، شبکه‌های اجتماعی، گروه‌ها و کتاب‌ها در حال تولید هستند. این در حالی است که نرخ تولید این واژگان در گذشته بسیار کم و محدود بوده است. یکی از مباحثی که در حوزه‌ی پردازش زبان‌ها مورد بررسی قرار می‌گیرد، مبحث تعبیه‌سازی واژه‌ها (word embedding) می‌باشد. تعبیه واژه معمولا به صورت تبدیل واژه به یک بردار صورت می‌گیرد به طوری که انتظار می‌رود کلماتی که در فضای برداری نزدیکتر هستند از نظر معنی یا کاربرد مشابه باشند. برای این منظور الگوریتم‌های هوش مصنوعی یا آماری مختلفی در طول زمان ایجاد یا پیشنهاد شده است. این در حالی است که در شبکه‌های پیچیده با ویژگی‌های خاص، همین اطلاعات به شکل دیگری نهفته است! احتمالا شما در توییت‌ها حول موضوعات مشخصی صحبت می‌کنید یا افرادی را دنبال می‌کنید که درباره‌ی موضوعات مرتبط با شما صحبت می‌کنند. احتمال لینک بین صفحات اینترنت نشان‌دهنده‌ی نوعی ارتباط موضوعی بین سایت‌ها می‌باشد. احتمالا در شبکه‌‌ی مقالات، ارتباط موضوعی بین مقاله‌ها مشاهده می‌شود و بسیاری موارد دیگر. آیا می‌توانیم به جای استفاده از الگوریتم‌های مشخص و از پیش آموزش‌دیده، از طریق شبکه‌های موجود واژه‌های مرتبط به یکدیگر را پیدا کنیم؟ بدون این که لازم باشد ابتدا واژگان را به بردارهایی تبدیل کنیم؟ هدف ایجاد پیوندی بین دنیای پردازش زبان و شبکه‌های پیچیده می‌باشد. با ایجاد روشی برای پاسخ‌دهی به این مسئله، می‌توانیم اطلاعاتی را استخراج کنیم که همچون خروجی‌های پردازش زبان طبیعی، برای نیازها یا توسعه‌های بعدی مورد استفاده قرارگیرند. همچنین این اطلاعات بر اساس رفتارهای شبکه ایجاد می‌شوند و تغییرات زمانی یا مکانی را در بر می‌گیرند. (مثلا ارتباط بین بایدن و انتخابات در برهه‌ی زمانی انتخابات) به عبارتی با اجرای مدوام این کار، می‌توانیم از تغییرات لحظه‌ای و پویای شبکه‌های پیچیده، برای کشف ارتباطات واژه‌ای که ایجاد شده یا از بین می‌روند استفاده کنیم.

مقدمه

شبکه‌ی اینترنت، شبکه‌ی بزرگی از صفحات اینترنت می‌باشد که هر کدام از این صفحات دارای یکسری مطالب و همچنین یکسری لینک (اصطلاحاً anchor) به صفحات دیگر هستند. اگر صفحات مختلف شبکه اینترنت را به صورت نودهای شبکه در نظر بگیریم، وجود این لینک‌ها به نوعی باعث ایجاد یکسری یال بین نودها می‌شود. اکنون هدف ما این است که از این شبکه‌ی بزرگ برای استخراج کلمات هم‌معنا یا مرتبط (related) استفاده کنیم. مبنای ارتباط کلمات، میزان تکرارشدن یک ارتباط در شبکه می‌باشد. وقتی یک سایت در مورد ورزش صحبت می‌کند، احتمالا کلمات مربوط به حوزه‌ی ورزش در این صفحه به خوبی مشاهده می‌شود. به همین دلیل خود کلمات یک صفحه ارتباطاتی را تشکیل می‌دهند (مثلا ارتباط بین کلمه فوتبال و توپ) در عین حال خود صفحات مختلف وب دارای لینک هستند و احتمالا یک صفحه‌ی ورزشی، به دیگر صفحات ورزشی لینک می‌دهد. پس اگر در صفحه‌ی اول کلمه «فوتبال» و صفحه‌ی دوم «بازیکن» را ببینیم، این کلمات نیز به یکدیگر مرتبط هستند. اکنون به نوعی شبکه‌ی اینترنت ما خود یک شبکه‌ای از شبکه‌ها (network of networks) می‌باشد چون خود کلمات یک صفحه نیز یک شبکه را تشکیل می‌دهند. اگر رخداد ارتباط کلمه‌ی «فوتبال» و «توپ» بعد از خزش (crawl) تعداد زیادی صفحات وب، زیاد باشد نشان می‌دهد که احتمالا بین این کلمات ارتباط خوبی برقرار است و از نظر معنایی مرتبط یا نزدیک هستند. اگر 1 میلیون بار بین کلمه‌ی «فوتبال» و «توپ» لینک برقرار شود در حالی که بین «درس» و «قالی» یک یال ایجاد شود، این نشان‌دهنده‌ی ارتباط معنایی بین «توپ» و «فوتبال» می‌باشد.

هدف اصلی خزش صفحات وب می‌باشد برای این که گراف بزرگی از کلمات مرتبط استخراج شود. با این حال این شبکه خیلی بزرگ می‌باشد و ارتباط کلمات داخل یک صفحه دلیل محکمی بر ارتباط میان کلمات نیست و از طرفی تعداد کلمات یک صفحه متغیر (حداقل 200 کلمه) است که حجم زیادی از آن‌ها کلمات غیرکاربردی مثل فعل‌ها یا حروف اضافه هستند. به همین دلیل خوب است در حین تشکیل این گراف، یکسری عملیات برای کاهش حجم گراف و در عین حال بالابردن دقت گراف شبکه انجام دهیم. (چون در نظر گرفتن تمامی کلمات یک صفحه و ارتباطات آن‌ها بیهوده و تنها باعث افزایش حجم گراف نهایی می‌شود) در ادامه پایه‌های اصلی انجام این کار را مورد بررسی قرار می‌دهیم و بعد از آن، معماری و شیوه‌ی پیاده‌سازی صورت‌گرفته را بیان می‌کنیم. در نهایت خروجی کار و ارزیابی آن بر اساس پیاده‌سازی صورت‌گرفته ارائه می‌شود.

ادبیات موضوع

خزش اینترنت

خزش وب یا اینترنت، برنامه ماشینی خودکاری است که محتوای موجود در اینترنت را جستجو و ذخیره‌سازی می‌کند تا در ادامه برای نیازهای مختلف مورد استفاده قرار بگیرد. اساسا، خزنده‌های وب وظیفه درک مطالب موجود در یک صفحه وب را دارند تا بتوانند از طریق آن به صورت خودکار و بدون مداخلت انسان، لینک و صفحات جدید را پیدا کنند. برای این کار، این ربات‌ها با واکشی چند صفحه وب آغازین (اصطلاحاً seed) شروع به کار می‌کند و سپس لینک‌های موجود در آن صفحات وب را برای یافتن صفحات بعدی و تکرار فرآیند دنبال می‌کند.

اگر چه در ظاهر انجام خزش ساده می‌باشد اما لازم است نکاتی در نظر گرفته‌شود و پیاده‌سازی آن به سادگی بیان‌شده نیست. از جمله نکاتی که باید در این مورد در نظر گرفته شود، می‌توان موارد زیر را نام برد:

  • عدم گیرافتادن در تور بسته عنکبوت: گاهی یکسری از صفحات به صورت مدوام به یکدیگر لینک داشته به صورتی که حلقه‌ای از اتصالات برگشتی به یکدیگر را شکل می‌دهند. به عنوان مثال در ساده‌ترین حالت، صفحه‌ی A به صفحه‌ی B لینک دارد و صفحه B نیز به صفحه‌ی A لینک دارد. در این حالت خزش‌کننده بعد از خزش صفحه‌ی A به صفحه‌ی B می‌رود و دوباره بر می‌گردد، در نتیجه در حلقه‌ی نامتناهی گیر می‌کند و نمی‌تواند کار خود را ادامه دهد. برای خودداری از این مشکل، خزش‌کننده‌ها از حافظه‌ی جداگانه‌ای استفاده می‌کنند تا از خزش دوباره یک صفحه خودداری کنند و در نتیجه چنین مشکلی به وجود نخواهد آمد.
  • رعایت ادب: وقتی یک دامنه‌ی خاص مثل صفحه‌ی ویکی‌پدیا را نظر می‌گیریم، اگر خزش‌کننده بخواهد هر ثاینه صفحه‌ی جدیدی را از این دامنه درخواست دهد، بلافاصله توسط دامنه ویکی‌پدیا دسترسی به صفحه‌ی موردنظر برای درخواست‌دهنده بسته می‌شود. علت این است که ویکی‌پدیا فکر می‌کند که شما قصد حمله به سایت آن را دارید و به همین دلیل تلاش بر واردکردن فشار دائمی به سایت او دارید. حتی برخی سایت‌ها به شما اجازه‌ی دسترسی به تمامی صفحات خود را نمی‌دهند. در این موارد ربات‌های خزشگر باید اصلاحا ادب را در ارسال درخواست‌ها رعایت کنند و بلافاصله و پشت سر هم از یک دامنه مشخص درخواست یک صفحه را ندهند. نرخ درخواست گاهی توسط خود سایت‌ها ارائه می‌شود و گاهی نیز به صورت حداقلی یک دقیقه در نظر گرفته می‌شود.


استخراج کلمات

به منظور استخراج کلمات مهم یک صفحه‌ی وب، به دنبال الگوریتم‌هایی برای استخراج کلمات مهم هستیم. هدف از استخراج کلمات مهم کاهش حجم اطلاعاتی است که ذخیره می‌کنیم زیرا ذخیره‌سازی تمام کلمات از جمله حروف و حرف‌های اضافه صرفاً حجم نگهداری داده را افزایش می‌دهد. این در حالی است که نگهداری تمامی این کلمات فایده‌ای ندارد. این الگوریتم‌ها تحت عنوان word extraction شناخته می‌شوند. معمولا مهم‌ترین و معروف‌ترین الگوریتم که افراد مختلف در این حوزه پیشنهاد می‌دهند، الگوریتم TF-IDF می‌باشد. با این حال این الگوریتم و موارد مشابه آن به دلایل مختلف برای هدف این پیاده‌سازی مناسب نیستند:

  1. این الگوریتم نیاز به کلیه‌ی اسناد (صفحات) برای استخراج کلمات مهم یک صفحه دارد و به همین دلیل، کار پیدا کردن کلمات مهم یک صفحه نمی‌تواند در حین خزش اتفاق بیافتد و باید در انتهای کار و بعد از این که مطمئن شدیم دیگر قصد خزش بیش‌تر نداریم انجام شود. این باعث می‌شود هزینه‌ی آن در طول زمان نیز پخش نشود، اما بدی این روش این است که در صورت ادامه‌دادن خزش لازم است دوباره از کل شبکه استفاده و این الگوریتم اجرا شده و کلمات استخراج شود.
  2. به دلیل این که نیاز به کل صفحات می‌باشد، باید کلیه‌ی صفحات و محتوای آن‌ها نگه داشته شود (حجم زیادی داده) تا در انتها کلمات مهم و اساسی استخراج شوند. در صورتی که اگر در طول زمان کلمات را استخراج می‌کردیم، هم هزینه‌ی کمتری از نظر اجرا در ادامه و همچنین فضای دیسک می‌پرداختیم.
  3. این الگوریتم‌ها معمولا نسبت به اسناد جمع‌شده حساس هستند و بر اساس آن خروجی می‌دهند، در صورتی که شاید دید مستقل به هر سند نسبت به دیگر اسناد و استخراج کلمات، دقت بیش‌تری را خروجی دهد. به عبارتی این الگوریتم کلیه صفحات استخراج‌شده را نگاه می‌کند و بر اساس کلمات آن‌ها، کلمات مهم را استخراج می‌کند و تا حد خوبی وابسته به محتوای کلیه صفحات استخراج‌شده می‌باشد. در حالی که اگر هر صفحه را مستقلا نگاه می‌کردیم و کلمات مهم را استخراج می‌کردیم، وابستگی کمتری به نوع صفحات خزش‌شده می‌داشتیم.

همچنین روش‌های مبتنی بر یادگیری نیز برای هدف پروژه مفید نیستند. این روش‌ها وابسته به داده‌ی یادگیری هستند و قابلیت تعمیم کمی را در فضای اینترنت با صفحات مختلف و متن‌های مختلف دارند. همچنین هزینه‌ی یادگیری در این روش‌ها نیز افزوده می‌شود و مشابه با روش TF-IDF، نیاز به حجم خوبی از کل داده دارند (برای یادگیری و سپس استخراج) و به همین دلیل معایب روش TF-IDF را نیز شامل می‌شوند. این روش‌ها همچنین از مشکلات جدیدتری مثل وابسته‌شدن زیاد به ورودی تمرین یا دقت کم رنج می‌برند و اگر متن کاملا جدیدی متفاوت از داده‌های تمرین دریافت کنند، احتمالا به خوبی عمل نخواهند کرد.

به همین دلیل با توجه به محدودیت‌های روش‌های بیان‌شده و حجم داده‌ی ما، استفاده از روش‌های با ویژگی‌های زیر برای ما مفید نیستند:

  • نیازمند کل مجموعه صفحات برای استخراج کلمات
  • نیازمند دریافت اطلاعات وابسته به زبان (مثل کلمات stop word و ...)
  • روش‌های مبتنی بر یادگیری

در نتیجه ما در این پیاده‌سازی به دنبال روش‌هایی هستیم که بدون مشاوره و مستقلاً برای هر صفحه، کلمات مهم را استخراج کنند. در این میان روش‌های مختلفی بررسی شدند که با توجه به محدودیت مقاله، زمان توضیح بررسی هر کدام از موارد نیست. در ادامه نام برخی از الگوریتم‌های مهم بررسی‌شده، سال انتشار و خلاصه‌ای از رویکرد آن را مشاهده می‌کنیم.

  1. روش TextRank (سال 2014): پایه و اساس روش‌های دیگر که با تشکیل گرافی از کلمات صفحه (بر اساس روش صفحه‌ی متحرک) و اعمال الگوریتم‌های PageRank، کلمات مهم را استخراج می‌کند.
  2. روش PositionRank (سال 2017): مشابه روش TextRank با این تفاوت که موقعیت کلمات در صفحه را در نظر می‌گیرد. (کلمات ابتدایی صفحه احتمالا مهم‌تر از کلمات انتهایی صفحه هستند)
  3. روش RAKE یا Rapid Automatic Keyword Extraction (سال 2010): روشی مبتنی بر گراف که بر اساس کلمات stop word، جملات را جدا کرده و سپس بر حسب هم‌نشینی کلمات داخل یک جمله و بین جمله‌ها، گراف را تشکیل می‌دهد. سپس بر اساس معیارهای درجه و ... گراف، کلمات مهم را استخراج می‌کند.
  4. روش Multi-word Keyword Scoring Strategy (سال 2017): این روش بر اساس روش‌های دیگر موجود استخراج کلمه عمل می‌کند و در نهایت خروجی آن‌ها را ویرایش و کلمات مهم‌تر را استخراج و تشخیص می‌دهد به نحوی که دقت الگوریتم استفاده‌شده را افزایش می‌دهد.
  5. روش Word Attraction Rank (سال 2015): در این روش گرافی روی کلمات صفحه ایجاد می‌شود و در ادامه بر اساس مفاهیمی مثل کشش و دافعه (مفاهیم فیزیکی) و اعمال آن‌ها به صورت ریاضی روی گراف، کلمات مهم را استخراج می‌کند.
  6. روش YAKE یا Yet Another Keyword Extractor (سال 2020): در این روش ابتدا صفحه بررسی شده، کلمات مهم و کاندید استخراج می‌شوند، سپس کلمات بر اساس ویژگی‌های مختلف آماری یک بردار ویژگی دریافت می‌کنند (مثل موقعیت کلمه، تکرار کلمه، ارتباط به حوزه و ...)، سپس بر اساس بردار ویژگی امتیازی دریافت می‌کنند، در ادامه از روش‌هایی معروف برای حذف کلمات تکراری استفاده می‌شود و در نهایت خروجی ارائه می‌شود.

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

پیاده‌سازی

در ادامه با توجه به حجم عظیمی از داده که ایجاد می‌شود لازم داریم که تا ابزارهایی مناسب در جهت موارد زیر را استفاده کنیم:

  1. ذخیره‌سازی داده با فرمت مناسب برای پردازش‌های بعدی
  2. ابزاری برای پردازش صفحات خزش‌شده و ساخت گراف و استخراج کلمات

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

  • ابزار Apache Mahout
  • ابزار Apache Giraph
  • ابزار Apache Spark

این ابزارها، معروف‌ترین موارد بودند. با این حال رویکرد هر کدام و محبوبیت هر کدام بررسی شد و تلاش شد بر اساس میزان بروزبودن، محبوبیت، قابلیت‌ها و مقایسه‌های موجود در اینترنت (benchmarkها) ابزاری را برای پیشبرد پروژه انتخاب کنم. بر این اساس تصمیم گرفتم تا بر اساس ابزار Apache Spark ادامه‌ی کار را پیش ببرم. این ابزار هم نسبت به دیگر ابزارهای جدید بروز بود و همچنین از محبوبیت بسیاری برخوردار بود.

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

کلیه برنامه‌هایی که در تصویر مشاهده می‌کنید، در کنار یکدیگر هدف نهایی این پیاده‌سازی یعنی ساخت گراف کلمات مرتبط را انجام می‌دهند. در این راستا از یکسری سرویس‌های زیرساختی آماده نیز استفاده شده است که فهرست آن‌ها را در پایین تصویر مشاهده می‌کنید و محل استفاده هر کدام را نیز در بخش ماژول‌های پیاده‌سازی‌شده مشاهده می‌کنید. همچنین در پیاده‌سازی برنامه‌های موردنیاز، ارتباطات میان تمام برنامه‌ها از طریق زیرساخت‌های مستقل فراهم شده است. برای این منظور از ساختار صف توزیع‌شده (Kafka) و فایل‌سیستم توزیع‌شده (HDFS) استفاده شده است. این نحوه‌ی معماری این امکان را می‌دهد تا هر کدام از از برنامه‌ها به صورت مستقل اجرا شوند چون ورودی آن‌ها و خروجی آن‌ها مستقیماً به دیگر برنامه‌ها فرستاده نمی‌شود و در محل‌های میانی ذخیره می‌شود. در ادامه به صورت خلاصه کارکرد هر کدام از برنامه‌ها را مورد بررسی قرار می‌دهیم.

  • خزشگر (crawler): اولین و شروع‌کننده برنامه، بخش خزشگر می‌باشد. این بخش در روز صفر، فهرستی از صفحات اولیه را دریافت می‌کند و شروع می‌کند به خزش محتوای صفحات آن‌ها و استخراج لینک‌های موجود در آن‌ها تا این فرایند را دوباره تکرار و ادامه دهد. فهرست لینک‌های اولیه در یک صف کافکا قرار داد و لینک‌های جدیدی که یافت می‌شوند، به این صف دوباره اضافه می‌شوند. همچنین صفحاتی که با موفقیت خزش می‌شوند، محتوای آن‌ها و لینک‌های صفحه در صفی به نام pages قرار می‌گیرند تا در ادامه توسط مولفه‌های بعدی مورد استفاده قرار بگیرند. دقت شود که محتوای صفحه سرشار از تگ‌های HTML می‌باشد ولی تنها محتوای صفحات بدون تگ ذخیره می‌شوند. (البته در آینده می‌توان این را بهبود داد تا بین تگ‌های header و لیست و ... تفاوت بگذارد اما در پیاده‌سازی کنونی صرف از نظر نوع تگ، صرفا محتوای درون تمامی تگ‌ها در نظر گرفته شده است) همچنین این مولفه باید از خزش دوباره صفحات خودداری کند. برای این منظور از پایگاه داده mongodb برای نگهداری لینک صفحات خزش‌شده استفاده می‌کند. همچنین در نگهداری لینک‌ها تا حد امکان آن‌ها را فشرده ذخیره‌سازی می‌کند.
  • استخراج‌کننده کلمات کلیدی (keyword-extractor): این بخش صفحاتی که در صف pages قرار گرفته‌اند را می‌خواند و سپس به ازای هر صفحه، به صورت مستقل و مبتنی بر روش YAKE، کلمات کلیدی را استخراج کند. سپس کلمات کلیدی استخرج‌شده را در صف دیگری به نام keywords قرار می‌دهد تا توسط مولفه‌ی بعدی استفاده شود.
  • استخراج‌کننده لینک‌ها (anchor-extractor): این بخش صفحاتی که در صف pages قرار گرفته‌اند را می‌خواند و سپس به ازای هر لینک موجود در صفحه، بین صفحه‌ی مبدا و مقصد یک لینک (X -> Y) ایجاد می‌کند و آن را در صف دیگری به نام links قرار می‌دهد تا توسط مولفه‌ی بعدی استفاده شود. علت تصمیم‌گیری این نوع ساختار استفاده‌شده، پیاده‌سازی راحت‌تر بخش ساخت گراف در مراحل بعدی می‌باشد.
  • ذخیره‌کننده کلمات کلیدی (keyword-persister): این بخش کلمات کلیدی استخراج‌شده برای هر صفحه را از صف keywords می‌خواند و به صورت دسته‌هایی با اندازه و حجم مشخص، در قالب یکسری فایل بر روی فایل‌سیستم توزیع‌شده HDFS می‌نویسد. علت این مولفه میانی این است که اولا منطق آن از منطق استخراج کلمات جدا شود و همچنین فایل سیستم HDFS برای فایل‌های بزرگ مناسب است (نه فایل‌های کوچک) به همین دلیل از طریق این روش می‌توان نحوه‌ی نوشتن لینک‌ها بر روی HDFS را کنترل کرد. خروجی نوشته‌شده در این قسمت در ادامه توسط مولفه‌ی بعدی مورد استفاده قرار می‌گیرد.
  • ذخیره‌کننده لینک‌ها (keyword-persister): این بخش مشابه بخش ذخیره‌کننده کلمات کلیدی، لینک‌های استخراج‌شده را از صف links می‌خواند و به صورت دسته‌هایی با اندازه و حجم مشخص، در قالب یکسری فایل بر روی فایل‌سیستم توزیع‌شده HDFS می‌نویسد. علت این مولفه میانی این است که اولا منطق آن از منطق استخراج لینک جدا شود و همچنین خروجی‌های مناسب برای فایل سیستم HDFS تولید شود. خروجی نوشته‌شده در این قسمت در ادامه توسط مولفه‌ی بعدی مورد استفاده قرار می‌گیرد.
  • بخش تولید گراف (graph-producer): این بخش هر دو خروجی ذخیره‌شده در مولفه‌های قبلی شامل کلمات کلیدی و لینک‌ها را دریافت می‌کند و با کنار هم قراردادن این دو مورد، گرافی میان کلمات یک صفحه و صفحات دیگر ایجاد می‌کند. در این گراف هر گره یک صفحه با فهرستی از کلمات است و لینک‌ها نشان‌دهنده‌ی وجود ارتباط بین دوصفحه است. سپس این گراف را به گراف دیگری تبدیل می‌شود که در آن هر کلمه از یک گره به کلمه دیگری از یک گره لینک پیدا می‌کند اگر بین دو گره، یالی باشد. همچنین بین کلمات یک صفحه نیز لینک ایجاد می‌شود. در ادامه این گراف جدید مبتنی بر فرمت جدید در سیستم‌فایل HDFS ذخیره می‌شود که همان گراف کلمات مرتبط شامل کلیه جزییات (از کوچکترین ارتباطات تا بزرگترین آن‌ها) می‌باشد.این خروجی در ادامه توسط مولفه بعدی استفاده می‌شود.
  • رسم‌کننده گراف (graph-drawer): این بخش خروجی گراف قبلی را از فایل‌سیستم می‌خواند و در صفحه‌ی HTML ارائه می‌دهد. در هنگام رسم یکسری فیلترها توسط این مولفه می‌تواند بر روی خروجی انجام شود تا کیفیت خروجی بهبود پیدا کند. در حال حاضر ساده‌ترین فیلتر که انتخاب صرفا 100 کلمه دارای لینک با وزن زیاد می‌باشد، پیاده‌سازی شده است.

برای پیاده‌سازی هر کدام از این مولفه‌ها نیز از یکسری سرویس‌های زیرساختی استفاده شده است که در ادامه توضیح خلاصه‌ای را در مورد هر کدام از آن‌ها بیان می‌کنیم:

  • ابزار Apache HDFS: کارکرد اصلی ابزار نگهداری داده است. این ابزار مجموعه‌ای از نرم‌افزارهای منبع باز است که استفاده از شبکه‌ای از رایانه‌های زیادی را برای حل مشکلات مربوط به حجم عظیم داده و محاسبات تسهیل می‌کند. بخش HDFS این ابزار یک چارچوب نرم‌افزاری برای ذخیره‌سازی توزیع شده فراهم می‌کند. HDFS می‌تواند انواع داده‌ها را شامل ساختاریافته، نیمه ساختاریافته یا بدون ساختار ذخیره کند. این ابزار برای ذخیره‌سازی لینک‌ها و کلمات کلیدی استخراج‌شده مورد استفاده قرار گرفته است.
  • ابزار Spark: کارکرد اصلی ابزار پردازش داده می‌باشد. Apache Spark یک چارچوب محاسباتی خوشه‌ای منبع‌باز و توزیع‌شده برای پردازش بلادرنگ (real-time) محسوب می‌شود. اسپارک سازگاری روان با Hadoop را فراهم می‌کند. اسپارک به منظور تعامل با خوشه، APIهای سطح بالایی را در جاوا، اسکالا، پایتون و R ارائه می‌دهد. کد اسپارک را می‌توان به هر یک از این چهار زبان نوشت. از این ابزار برای تحلیل داده‌های خروجی و ایجاد گراف نهایی استفاده شده است.
  • ابزار Zookeeper: یک سرویس متمرکز برای حفظ اطلاعات پیکربندی، نامگذاری، ارائه همگام‌سازی توزیع شده و ارائه خدمات گروهی است. همه این نوع خدمات به شکلی توسط برنامه‌های کاربردی توزیع شده استفاده می‌شوند. به عنوان مثال هادوپ و کافکا از این سرویس استفاده می‌کنند. علت آن این است که به دلیل دشواری پیاده‌سازی این نوع خدمات، برنامه‌های کاربردی معمولاً به ابزارهای خارجی وابسته می‌شوند. حتی زمانی که به درستی انجام شود، پیاده‌سازی های مختلف این خدمات منجر به پیچیدگی مدیریت در هنگام استقرار برنامه‌ها می‌شود.
  • ابزار Kafka: کافکا یک سرویس رویداد توزیع شده و بستر پردازش جریان است که متشکل از سرورها و کلاینت‌هایی است که از طریق یک پروتکل شبکه TCP با کارایی بالا ارتباط برقرار می‌کنند. این به کاربران امکان می‌دهد داده‌ها را به هر تعداد سیستم یا برنامه های بلادرنگ منتشر (publish) کنند و سرویس‌های دیگر برای دریافت داده خود را ثبت (subscribe) کنند. این ابزار معمولا به عنوان یک صف توزیع‌شده نیز شناخته می‌شود و از ویژگی‌های آن برای جداسازی برنامه‌های کاربردی مختلف در پیاده‌سازی جاری استفاده شده است.
  • ابزار MongoDb: یک پایگاه داده سند گرا است و به عنوان پایگاه داده NoSQL طبقه‌بندی می‌شود زیرا اسناد JSON مانند با طرح‌های اختیاری را ذخیره می‌کند. این پایگاه داده قابلیت‌های متنوعی از جمله پرس‌وجوهای در لحظه، ایندکس‌کردن داده، تکرار داده (برای خودداری از بین رفتن داده)، تقسیم بار، جمع‌آوری و تحلیل را فراهم می‌کند. به علت ساده‌بودن این ابزار و سرعت خوب در تست‌های صورت‌گرفته، به عنوان یک persisntent cache در پیاده‌سازی کنونی استفاده شد.

خروجی و ارزیابی

بر اساس پیاده‌سازی صورت‌گرفته، سایت‌های اولیه برای اجرا و تولید گراف نهایی مشخص شدند. فهرست سایت‌های اولیه که برای خزش انتخاب شدند، موارد زیر بودند که همگی جزو سایت‌های معروف هستند:

  • http://google.com
  • http://wikipedia.org
  • http://instagram.com
  • http://yahoo.com
  • http://whatsapp.com
  • http://amazon.com
  • http://live.com
  • http://netflix.com
  • http://reddit.com
  • http://office.com
  • http://linkedin.com
  • http://zoom.us
  • http://discord.com
  • http://twitch.tv
  • http://bing.com
  • http://roblox.com
  • http://microsoftonline.com
  • http://duckduckgo.com
  • http://pinterest.com
  • http://msn.com
  • http://microsoft.com
  • http://ebay.com
  • http://accuweather.com
  • http://fandom.com
  • http://weather.com
  • http://paypal.com
  • http://walmart.com

همچنین برای رعایت ادب در هنگام خزش، مدت زمان یک دقیقه فاصله بین درخواست‌ها به یک دامنه یکسان فاصله انداخته شد. مدت زمان محدودی به دلیل پیاده‌سازی خود مولفه‌ها، بخش خزش‌کننده در حال اجرا بود و همچنین به دلیل مصرف اینترنت بالای مولفه، صرفا در ساعت خاصی از روز که اینترنت رایگان داشتم، اجرا شد. (که البته در این ساعت نیز سرعت اینترنت حداقل مقدار بود) در نهایت تعداد 150 هزار صفحه یافت شد که از میان آن‌ها 10 هزار صفحه، محتوا و لینک‌هایشان به صورت کامل استخراج شد. به ازای هر صفحه تنها صد کلمه‌ی کلیدی استخراج گردید و مبتنی بر همین مشخصات، گراف خروجی ساخته شد. در ادامه پیش از نتیجه‌گیری، چند نمونه از شکار صحنه‌های زیبا را برای گراف خروجی را مشاهده می‌کنیم.

همان‌طور که در تصویر بالا مشاهده می‌کنید، ما توانستیم تمامی ماه‌های میلادی را با ارتباطات زیاد در یک گروه و دسته‌بندی تقریبا متصل داشته باشیم و این در حالی هست که ما هیچ‌گونه دانشی در این سامانه در مورد ماه‌های سال قرار نداده بودیم و خود سامانه توانسته بود این رابطه را بر اساس لینک‌ها و محتوای موجود در اینترنت، استخراج کند.

همان‌طور که در این تصویر مشاهده می‌کنید، بین «حریم شخصی» با سه مفهوم «سیاست»، «داده» و «اطلاعات» ارتباطاتی تشخیص داده شده است که تا حدود زیادی مفاهیم مرتبط به یکدیگر می‌باشند.

در تصویر بالا کلیه‌ی خدماتی که توسط شرکت مایکروسافت ارائه می‌شوند را می‌توانیم مشاهده کنیم. به عنوان مثال «سیستم‌عامل ویندوز»، تبلت پیشرفته‌ی «surface» آن، دستگاه «Xbox»، زیرساخت ابری «Azure» و حوزه‌های کاری مثل «آموزش»، «بازی»، «توسعه‌دهنده‌» و «کسب و کار» را مشاهده می‌کنیم.

در تصویر بالا دو گروه تشخیص داده شده دیگر را مشاهده می‌کنید. در سمت چپ مشاهده می‌کنید که بین مفاهیم «سلامتی» و «دولت» و «سرمایه‌گذاری» ارتباطی تشخیص داده شده است که می‌تواند حاکی از این باشد که به دلیل بیماری کرونا در شرایط کنونی، دولت قصد دارد در حوزه‌ی سلامت سرمایه‌گذاری کند. در سمت راست تصویر، ارتباط خودکار تشخیص داده شده بین تمامی مرورگرهای معروف را مشاهده می‌کنیم که دوباره بدون دانش قبلی و توسط سامانه کشف شده است.

در تصویر بالا نیز مشاهده می‌کنیم که مفاهیم موجود در حوزه‌ی توسعه‌ی وب مشاهده می‌شوند از جمله تکنولوژی‌های پایه که برای پیاده‌سازی آن استفاده می‌شوند.

همان‌طور که در تمامی مثال‌های بالا مشاهده کردیم، روابط مختلفی از دیدگاه‌های مختلف به صورت خودکار تشخیص داده شده بودند و این در حالی که بود که هنوز کل گراف نشان داده نشده بود و همچنین هر مقدار تعداد لینک‌های بیش‌تری خزش شوند، کیفیت خروجی بهبود پیدا می‌کند. همچنین بسته به این که لینک‌های اولیه بهتر و بیش‌تری استفاده می‌شود، می‌توان به خروجی خیلی بهتر و کامل‌تری رسید. با این حال با همین مقدار خروجی می‌توان مشاهده کرد که خودکار بودن این ابزار و امکان استخراج یکسری مجموعه از کلمات مرتبط (مثلا از طریق communityها) می‌تواند برای ساخت پایگاه داده‌ای از کلمات مرتبط مفید باشد. این پایگاه داده می‌تواند در مراحل بعدی توسط ابزارهای پیشنهاددهنده‌ و جستجوگرها، تحلیل‌گرهای مبتنی بر پردازش زبان طبیعی و ... مورداستفاده قرار بگیرد. پیاده‌سازی این پروژه را در این لینک می‌توانید مشاهده کنید.

این مطلب، پروژه درس شبکه‌های پیچیده در دانشگاه شهیدبهشتی است.


پردازش زبان طبیعیشبکه‌های پیچیده
شاید از این پست‌ها خوشتان بیاید