سعید چوبانی
سعید چوبانی
خواندن ۱۱ دقیقه·۵ سال پیش

نگاهی به شبکه کاربران ویرگول (و سوال‌های بیشتری که می‌توان پرسید!)

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

من در این نوشته‌ی کوتاه، (از روی کنجکاوی) نگاهی گذرا به شبکه‌ی کاربران ویرگول انداخته‌ام.

جمع آوری مجموعه داده

هر کاربر در ویرگول تعدادی کاربر را دنبال می‌کند و توسط تعدادی دیگر دنبال می‌شود. پس برای شکل دادن این شبکه به نام‌کاربری کاربران بعنوان راس‌ (node) و اطلاعات ارتباطات‌ آن‌ها، بعنوان یال‌ها (Edges) نیاز دارم. شبکه‌ی نهایی یک شبکه‌ی Directed خواهد بود. برای جمع‌آوری داده‌ی کاربران ویرگول از کتابخانه‌ی مشهور beautifulsoup4 در پایتون استفاده می‌کنم. (اسکریپت پایتون برای جمع‌آوری مجموعه داده‌ از کاربران ویرگول را می‌توانید روی گیت‌هاب ببینید.) علاوه بر کتابخانه‌ی استفاده شده، شیوه‌ی جمع‌آوری داده نیز حائز اهمیت است. در اینجا از یک کاربر مبدا به فاصله‌ی ۴ پرش، این داده را جمع‌آوری کرده‌ام و از ذخیره‌ی لینک‌ها در یک دیکشنری برای کنترل عدم تکرار لینک‌ها استفاده می‌کنم.

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

شبکه‌ی کاربران ویرگول
شبکه‌ی کاربران ویرگول


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

شبکه‌ی ما دارای ۳۱۲۹۰ راس و ۱۵۰۲۷۷ یال است و مانند هر شبکه‌ی دیگری در دنیای واقعی، توزیع درجه‌ی راس‌ها، یک Power Distribution است. همانطور که در تصویر زیر می‌بینید تعداد زیادی هستند که کاربرهای کمی را دنبال می‌کنند و از طرف دیگر تعداد کمی کاربر هستند که افراد زیادی را دنبال می‌کنند. (اگر بصورت تصادفی یک کاربر را انتخاب کنیم، احتمال اینکه ۱۰ نفر را دنبال کند چیزی حدود ۰.۰۱ است.)

توزیع درجه‌ی رئوس در شبکه کاربران ویرگول
توزیع درجه‌ی رئوس در شبکه کاربران ویرگول


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

برای اینکه همه چیز کمی هیجان‌انگیزتر! شود، رئوس گراف را به کاربرانی محدود می‌کنم که در توضیحات حساب کاربری خود، رشته‌ی خود را مرتبط با فناوری معرفی کرده‌اند. (برای این‌کار قبلا یک لیست دستی از حدود ۱۰۰ واژه‌‌ی پر کاربرد در این زمینه درست کردم، واژگانی مانند نرم‌افزار، استارتاپ، داده و ... ). گراف نهایی ۷۲۲۸ راس و ۶۰۱۸۴ یال دارد و چگالی آن ۰.۰۰۱۱۳۶ است. هر کاربر بصورت میانگین ۸.۲۵ کاربر دیگر را دنبال می‌کند.

مهم نیست چند نفر را دنبال می‌کنید، مهم این است چه کسی را دنبال می‌کنید

برای چند تحلیل‌ ساده‌ از کتابخانه‌ NetworkX در پایتون استفاده می‌کنم. جدول زیر لیست رئوس با میزان Betweenness Centrality و درجه‌ی هر راس را نشان می‌دهد. در واقع BC مشخص می‌کند از هر یک راس چه تعداد مسیر عبور می‌کند. برای مثال در گراف زیر، آلیس BC بالاتری نسبت به بقیه دارد. یعنی Mark برای رسیدن به Doug، Bridget، Charles و Michael باید از Alice عبور کند. یعنی BC برای Alice معادل ۴ است. این عدد برای Charles معادل ۲ است. چرا که Alice و Mark برای رسیدن به Michael باید از Charles عبور کنند.


همانطوری که در جدول پایین می‌بینید اهمیت مرکزیت فرد در شبکه لزوما وابسته به تعداد کاربرانی که دنبال می‌کند نیست، بلکه به کسانی که دنبال می‌کند وابسته است. برای مثال، ali را در نظر بگیرید. با وجود اینکه فقط ۵۲ نفر را دنبال می‌کند ولی رتبه‌ی دهم در شبکه‌ دارد. (حواستان باشد که ali در حالت عادی ۱۰۳ نفر را دنبال می‌کند ولی من فقط دیتای ۵۲ نفرشان را در شبکه دخیل کرده‌ام.) یا islamizad که با ۱۴ لینک خروجی در رتبه‌ی ۲۰ است.

علی به نسبت افراد کمی را دنبال ولی BC بالایی در شبکه دارد.
علی به نسبت افراد کمی را دنبال ولی BC بالایی در شبکه دارد.


به حساب کاربری pooriavakili09، niloofar.majdii یا naderabdi نگاهی بیاندازید. اینها کاربرانی هستند که هزاران نفر را دنبال می‌کنند و طبیعی است که تعدادی از این کاربران از اعضای اکوسیستم باشند. برای مثال نادر عبدی ۱۱۶۴۴ نفر را دنبال می‌کند که ۹۰۸ راس در شبکه‌ی ما هستند.

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

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

نمونه‌ی شماتیک از یک گراف ضعیف. دسترسی به راس A به هیچ طریقی ممکن نیست.
نمونه‌ی شماتیک از یک گراف ضعیف. دسترسی به راس A به هیچ طریقی ممکن نیست.


پس من با استفاده از دستور زیر، فقط رئوسی را نگه می‌دارم که از همه جا قابل دسترسی هستند و یک شبکه‌ی قوی ایجاد می‌کنم:

nx.strongly_connected_components

بزرگ‌ترین کامپوننت شبکه‌ی قوی، شبیه تصویر زیر است و همانطوری که انتظار داریم بسیار کوچک‌تر از شبکه اولیه است و در آن ۹۲۵ کاربر با ۱۳۳۱۱ یال به یک دیگر به صورت قوی وصل شده‌اند. چگالی این گراف ۱۴.۳۹ است. (حواسمان باشد که این با یک گراف کامل متفاوت است. در گراف کامل همه‌ی اعضا به یک دیگر متصل هستند و همدیگر را دنبال می‌کنند. اگر قرار بود شبکه‌ی جهت دار فعلی کامل باشد n در n-1 یال، یعنی ۸۵۴۷۰۰ یال داشتیم.)

تصویر یک گراف قوی از کاربران ویرگول که واژگان مرتبط با فناوری در توضیحات بیوی خود دارند.
تصویر یک گراف قوی از کاربران ویرگول که واژگان مرتبط با فناوری در توضیحات بیوی خود دارند.


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

برای مثال کاربری مانند mahdi با پروفایل پایین به صدر جدول می‌آید. این نشان می‌دهد که مهدی در انتخاب افرادی که دنبال می‌کند (حداقل در مجموعه داده‌ای که من جمع‌ کرده‌ام) دقیق‌تر از کاربر دیگری مانند toopmarket عمل می‌کند که در لیست اولیه وجود داشته ولی در لیست دوم حذف شده است.

البته بحث دقت کاملا نسبی است و بستگی به حیطه کاری دارد. منطقی به نظر می‌رسد که توپ مارکت به خاطر اینکه مخاطبانش، اغلب مادران هستند از صدر شبکه‌ی ما حذف شود.

در نمودار زیر فاصله‌ی هر راس از دورترین راس را در این شبکه‌ی قوی می‌بینید. همانطور که واضح است، پدیده‌ی جهان کوچک (که قبلا درباره آن صحبت کردیم) اینجا نیز مشاهده می‌شود. هر قدر تعداد رئوس بیشتری در شبکه‌ی خود داشته باشیم، نمودار زیر بیشتر و بیشتر شبیه یک توزیع نرمال خواهد شد. یعنی افراد کمی هستند که به همه نزدیکند و افراد کمی هستند که از همه دورند. میانگین فاصله هر راس از دورترین نقطه ۵.۲۱۲ با انحراف معیار ۰.۷۳۳ است. (توجه داشته باشیم که فاصله‌ی نقاط از یکدیگر را در NetworkX فقط زمانی می‌توانیم محاسبه کنیم که یک گراف غیرجهت‌دار و یا یک گراف جهت‌دار کامل داشته باشیم.)

۱۱۶ نفر از اعضای‌ شبکه قوی ما در مرکز گراف قرار دارند. یعنی فاصله‌ی آن‌ها با دورترین نقطه (Eccentricity) حداقل و به میزان شعاع گراف (‌Radius) است. یعنی برای مثال با نهایت ۴ حرکت از کاربری مانند amir.habibzadeh که در مرکز گراف قرار دارد، می‌توانیم به همه‌ اعضای گراف دست پیدا کنیم.




یک نگاه پایین به بالا و سوالات بیشتری که می‌توان پرسید

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

۱- چه جامعه‌هایی داخل گراف من هستند؟

اینکه چه جوامعی داخل گراف هستند، موضوع جالب و پر اهمیتی است. این جامعه‌ها اگر به درستی تشخیص داده شوند، می‌توانند در ارسال پیشنهاد‌های مختلف از طریق سرویس ویرگول موثر باشند. الگوریتم‌های پیدا کردن جوامع کوچک‌تر داخل شبکه‌های بزرگ بسیار زیادند. برای مثال من روی داده‌ی اولیه (با حدود ۳۱۰۰۰ کاربر) الگوریتم ledien را پیاده سازی کردم. (طبیعتا بدون اینکه متن بیو را در نظر بگیرم.) این الگوریتم نسخه‌ی بهبود یافته‌ی الگوریتم Louvain است که از معیار Modularity برای یافتن جامعه‌ها استفاده می‌کند. (در حالت کلی هر راس را به یک جامعه اختصاص می‌دهد و معیار Modularity را اندازه‌گیری می‌کند. این معیار فاصله‌ی بین دو جفت جامعه را محاسبه می‌کند و هرقدر این فاصله افزایش پیدا کند یعنی الگوریتم ما بهتر عمل کرده است و جوامع صحیح‌تری را انتخاب کرده است. البته معیارهای مختلفی برای پیش‌بینی صحت جوامع بدست آمده وجود دارد.)

این کار نتیجه جالب و تا حدودی قابل پیش‌بینی داشت. الگوریتم leiden در هر بار اجرا ۱۰ جامعه پیدا می‌کرد. در برخی از این جامعه‌ها که ۵ تا ۶ هزار راس داشتند، کمتر از ۱ درصد کسانی بودند در بیویِ خود از واژگان تکنولوژیک استفاده کرده باشند.

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

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

https://arxiv.org/pdf/1810.08473.pdf - منبع تصویر: وایت پیپر الگوریتم لایدن
https://arxiv.org/pdf/1810.08473.pdf - منبع تصویر: وایت پیپر الگوریتم لایدن


۲- چه کاربرانی جایگاه مهمی در شبکه من دارند؟

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

۳- چه کاربرانی قرار است یکدیگر را در آینده دنبال کنند؟

پیش‌بینی شکل‌‌گیری لینک‌های جدید هم یکی دیگر از رویکردهای مهم و جالب در این شبکه می‌تواند باشد.


و...


آستین‌ها را بالا بزنید!

تحلیل شبکه‌های اجتماعی بحث جذابی است و با هر مجموعه داده‌ی جدید، الگوهای جالبی را می‌توان کشف کرد. ویرگول، بنا به هر سیاستی که دارد، فعلا جمع‌آوری داده از سرویس خود را آزاد گذاشته است و این فرصت خوبی برای جمع‌آوری و تحلیل رفتار کاربرهای ایرانی در یک شبکه‌ اجتماعی حرفه‌ای است. برای شروع می‌توانید نگاهی به اسکریپتی که روی گیتهاب گذاشته‌ام بیاندازید و ایراداتش را برطرف کنید :) اگر هم ایده‌‌ای دارید یا متوجه اشتباهی در تحلیل من شده‌اید، همینجا بنویسید یا با آدرس saeed.choobani روی جیمیل، ارتباط بگیرید.


تحلیل شبکهداده کاویویرگولدیتا ساینستحلیل شبکه اجتماعی
NLP Enthusiast | Privacy Fan
شاید از این پست‌ها خوشتان بیاید