Mohammad Abdollahi
Mohammad Abdollahi
خواندن ۱۵ دقیقه·۱ سال پیش

گزارش پروژه درس شبکه های پیچیده و پویا - تحلیلی بر شبکه Stackoverflow از دیدگاه علم شبکه های پیچیده و پویا

نکاتی که قبل از خواندن این گزارش باید مورد توجه قرار دهید :

1- این گزارش نشاندهنده نتایجی است که حاصل تحلیل و پیاده سازی بنده بوده است و دنبال راه علمی برای بررسی صحت آن نرفته ام. طبیعی است که ممکن است جایی برداشت بنده از موضوع نادرست یا عجولانه و یا حتی تک بعدی باشد و توجه به سایر جنبه ها را فراموش کرده باشم.

2- تحلیل هایی مانند یافتن گره های مرکزی (با محوریت نزدیکی، بینابینی و یا مهم بودن) جزء تحلیل های ساده علم شبکه محسوب میشوند. اما من سعی کرده ام از همین تحلیل ساده یک تحلیل کاربردی و معنادار در دنیای برنامه نویسی ارائه کنم.

3- با توجه به اینکه این گزارش بر بستر ویرگول منتشر شده ترجیح داده ام از رسمیت آن بکاهم و متن کمی حالت غیررسمی به خود گرفته است.

4- با توجه به اینکه نوع کار بنده عملی بوده بنابراین گزارش آن خیلی تطابقی با ساختار گزارش تحقیقاتی و علمی ندارد و بیشتر روی نشان دادن نتایج عملی تمرکز شده است.

5- با توجه به اینکه برای این گزارش محدودیت حجم در نظر گرفته شده بود فقط نجوه آماده سازی سکس از دیتاست ها شرح داده شده است و از شرح نحوه آماده سازی سایر دیتاست ها خودداری کرده ام (روند همه آنها تقریبا مشابه است).
6- برای این پروژه اهداف بیشتری در نظر گرفته شده بود ولی متاسفانه برخی از آنها به خاطر پیچیدگی بیان صورت مسئله آنها با کتابخانه networkx به نتیجه ای نرسید.

7-یکی از چالش های مهم در این تحقیق این بود که مدت زیادی صرف خلق ایده میشد. مثلا پیش می آمد که دو سه روز فکر کنم که روی این دیتاست چه عملی انجام دهم ولی کل عملیات کدنویسی برای آن ایده و رسیدن به نتیجه کلا 4 یا 5 ساعت میشد که خروجی آن نهایتا 7 یا 8 خط کد بود. در حقیقت چون در پروژه رویکرد عملی داشتم بخش زیادی از زمان هم صرف جستجو برای روش بیان منظورم به زبان پایتون و کتابخانه networkx میشد.




1. مقدمه

بنده رویکرد عملی و پیاده سازی را برای پروژه این درس در نظر گرفته ام و موضوع پروژه، تحلیلی بر تگ های سایت stackoverflow بوده است. لذا سعی میشود بر روی دیتاست این سایت تحلیل های مختلفی که به ذهنم میرسد را با استفاده از روش های شبکه های پیچیده و پویا انجام دهم. سعی شده که تحلیل های انجام شده با تحلیل ها و مفاهیم درس که در تمرین ها نیز تکرار شده مشابه نباشد و بیشتر به رویکردهای عملی و کاربردی نزدیک شود.

2. تعیین اهداف پروژه

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

1- یافتن کاربرانی از این سایت که دارای تخصص T شکل هستند.

2- یافتن تکنولوژی هایی که جزء داغترین مباحث بوده و بیشتر مورد توجه افراد متخصص قرار گرفته و دارای جوابهای درست و تائید شده هستند.

3- دسته بندی تگها و تکنولوژی ها و به نوعی ارائه گروه یا دسته از آنها

4- نشان دادن یک تکنولوژی در تمام دسته بندی های ممکن برای پلتفرم های گوناگون (مثلا فریمورک CodeIgniter که یک فریمورک php هست هم برای برنامه نویسی pure به زبان php استفاده میشود و هم در توسعه سیستم مدیریت محتوای wordpress بنابراین می تواند در دسته بندی های متفاوت در کنار سایر تکنولوژی ها قرار گیرد. بنده میخواهم تمام این دسته بندی ها را نشان دهم. همچنین راهکاری برای یافتن دسته های یک تکنولوژی خاص ارائه خواهم داد به نحوی که فقط با ارائه نام تکنولوژی تمام دسته بندی های ممکن از آن نشان داده شود. منظور از دسته بندی در اینجا این است که یک تگ یا تکنولوژی در کنار کدام تگ ها یا تکنولوژی های دیگر به کار رفته است؟)

5- ارائه راهکاری که بتوان با ارائه تعدادی تگ توسط کاربر، ارتباط آن تگها با هم در قالب گرافیکی نشان داده شود.

6-•نشان دادن نزدیکترین تکنولوژی ها به یک تکنولوژی خاص (شبکه ego)

7- استخراج RoadMap یادگیری در stackoverflow به تفکیک نوع تکنولوژی (یعنی برای اینکه یه نفر به حدی برسد که مثلا تگی مثل networkx را در سئوالات خود درج کند چه مسیری را طی کرده و طی آن مدت چه تگ های دیگری را پرسیده است)و یا یک کاربر خاص (یعنی مثلا فلان کاربر متخصص که هم اکنون مثلا متخصص هوش تجاری است چه مسیری را طی کرده و چه جیزهایی را پرسیده است که هم اکنون در هوش تجاری دارای تخصص است) . (البته این تحلیل ممکن است به نتایج نامرتبط هم برسد [مثلا یک نفر هم همزمان برای انجام امورات شغلی دنبال یادگیری هوش تجاری است و هم برای انجام پروژه های دانشجویی دنبال یادگیری networkx است. طبیعی است که نمی توان networkx و هوش تجاری را به هم مرتبط دانست یا آنها را لازم و ملزوم هم پنداشت و از آنها یک RoadMap استخراج کرد.])

8- رتبه بندی تگ ها از سه منظر مرتبط بودن با هم، اثرگذاری بر روی هم، و اهمیت استفاده


3. شروع به پیاده سازی

پیاده سازی با استفاده از ابزارهای زیر صورت گرفته است :

استفاده از Anaconda بعنوان یک container برای پایتون و Jupiter

استفاده از Jupiter Notebookبعنوان ویرایشگر و اجرا کننده کد

استفاده از پایتون بعنوان زبان برنامه نویسی

استفاده از کتابخانه NetworkX برای تحلیل شبکه

استفاده از کتابخانه Pandas برای خواندن اطلاعات حجیم از فایل csv

استفاده از کتابخانه matplotlib جهت رسم نمودارهای گرافیکی

با توجه به اینکه اهداف محتلفی توسط پروژه دنبال میشود با یک دیتاست واحد نمی توان به نتیجه رسید لذا برای اهداف متفاوت دیتاست های متفاوت با ساختار متفاوت و با شرط های مختلف از کل دیتاست stackoverflow استخراج شد(یا خواهد شد.) مثلا دیتاست لازم برای رسیدن به هدف شماره 1 و 2 یعنی یافتن افرادی با تخصص های T شکل و نیز داغترین مباحث به شکل زیر است. برای تهیه این دیتاست ابتدا به لینک Query Stack Overflow - Stack Exchange Data Explorer مراجعه نموده و سپس Query زیر را اجرا نمودم.

هدف بنده از اجرای این Query این بوده که کاربرانی را پیدا نمایم که در 5 سال اخیر پاسخ هایی به سئوالات داده اند، که پاسخ آنها از نظر فرد سئوال کننده درست و به دردبخور بوده و در حقیقت پذیرفته شده است (با توجه به فیلد AcceptedAnswerId). علت تعیین محدودت تاریخ (5 سال پیش تا کنون) این است که میخواهم خروجی این برنامه استفاده عملی و واقعی داشته باشد. مثلا بتوان آنرا در اختیار منابع انسانی شرکت ها قرار داد. با توجه به اینکه در دنیای کامپیوتر، مدام تخصص های جدیدی در حال خلق شدن است اصولا همین بازه 5 ساله نیز زیاد است. در کنار شناسه این کاربران، نام تگ هایی که در سئوال مربوطه درج شده اند نیز استحراج شده است. بنابراین خروجی یک جدول با دو ستون است. شناسه کاربری و تگی که آن کاربر در آن سررشته دارد. نمایی از خروجی در شکل زیر نشان داده شده است.


در نهاین این خروجی در قالب یک فایل csv استخراج شد و با نام users-tags.csv در پروژه به کاربرده شد. این فایل در بین تحویل دادنی های پروژه نیز ارائه شده است.

برای سایر اهداف بعدا و در فازهای بعدی دیتاست های لازم بدست خواهد آمد.

4. شروع به پیاده سازی و دست یابی به اهداف پروژه

در این قسمت کد لازم برای نیل به اهداف شماره 1 و 2 را مشاهده میکنید و نتیجه لازم را بدست آوردم. نتیجه بدست آمده با سایت stackoverflow نیز مطابقت داده شد و به صورت شهودی صحت نتایج تائید شد.

برای نوشتن این برنامه ابتدا برنامه anaconda را نصب نموده و سپس از Jupiter notebook که بر روی anaconda قرار دارد، برای نوشتن کدها استفاده شد. در زیر مراحل کار را شرح داده ام.

4.1. نحوه نیل به هدف شماره 1 – یافتن افراد با تخصص T شکل

ابتدا کتابخانه های لازم import شد:

سپس فایل csv به برنامه معرفی شد:

بعد از آن یک گراف جهت دار ایجاد شد. در این گراف رأس ها نشناسه کاربران و نام تگ ها هستند. چنانچه کاربری در تخصصی اظهارنظری نموده باشد که این اظهار نظر accept شده باشد یال از کاربر به آن تخصص رسم میشود:

همانگونه که در شکل پیداست جمع کاربران فعالی که در 5 سال اخیر در تگی پاسخ پذیرفته شده داشته اند بعلاوه تگهای مورد بحث آنها جمعا منجر به ایجاد 8131 گره شده است. و همانطور که در تصویر زیر هویداست تعداد یالهای بین این گره ها 19561 است.

یعنی این کاربران در سئوالاتی که جمعا 19561تگ مختلف داشته اند، دارای پاسخ accept شده بوده اند. همانطور هم که در تصویر زیر مشخص است میانگین درجه این گراف 4.8 است. یعنی هر کاربر به طور میانگین در حدود 5 تگ (تکنولوژی) مختلف اطلاعات دارد و اظهار نظر کرده است.

و اما قسمت اصلی کار، اگر ما گره های گراف را براساس درجه خروجی آنها مرتب سازی نزولی کنیم، 5 گره اول کاربرانی هستند که در تعداد تگهای بیشتری اظهار نظر کرده اند( گره متناظر آنها، درجه خروجی بیشتری دارد). بنابراین:

یعنی کاربری با شناسه 549372 در 574 تگ مختلف سررشته دارد. و کاربری با شناسه 560648 که در 454 تگ مختلف اظهارنظر کرده است در رتبه بعدی قرار دارد. (این شناسه های کاربری را در سایت stackoverflow بررسی کرده ام و با توجه به میزان reach شدن پروفایل آنها و آماری که سایت در پروفایل آنها گذاشته به نظر میرسد این نتایج درست باشند.) بعنوان نمونه پروفایل نمونه دوم یعنی کاربری با شناسه 560648 که جزء خروجی های فوق است به شرح ذیل است :

توجه : بار دیگر تاکید میشود علت پایین بودن آمار این است که فقط بازه 5 سال اخیر بررسی شده و فقط کاربرانی استخراج شده اند که پاسخ آنها به همراه تیک سبزرنگ (علامت accept شدن) نمایش داده میشود.

همچنین داغترین مباحث و تکنولوژی ها را با مرتب سازی نزولی گره ها بر اساس درجه ورودی بدست آورده ام:

یعنی تکنولوژی های javascript، python، c#، java و html جزء داغترین مباحث هستند که با توجه به تجربه و شنیده های اغلب ما، درست به نظر میرسد.

4.2- نشان دادن یک تکنولوژی در تمام دسته بندی های ممکن برای پلتفرم های گوناگون

در این حالت تگ ها و تکنولوژی های مرتبط با هم که به خاطر اهداف مختلف با هم در یک گروه استفاده میشوند نشان داده میشود.


کلا در صنعت نرم افزار و به خصوص در بخش خصوصی مبحثی بنام Co-Occurring Technologies وجود دارد که ترجمه آن در ادبیات stackoverflow میشود Co-Occurring Tags. اهمیت این بحث از این جهت است که مثلا در انتخاب یک DBMS برای برنامه نویسی Back-End خیلی مهم است که بتوانید منطبق ترین DBMS ممکن با تکنولوژی توسعه Back-End خود را انتخاب کنید. مثلا mysql هم با php، هم با جاوا و هم با دات نت و هم با پایتون می تواند کار نماید. اما اکثر برنامه نویسان دنیا mysql را با کدام زبان به کار میبرند ؟

یا مثلا میخواهیم ببینیم اکثر متخصصان کدام فریمورک front-end را برای زبان جاوااسکریپت استفاده می کنند؟ در این حالت اگر Co-Occurring Tags را برای جاوا اسکریپت بدست آوریم و آنها را بررسی کنیم می توانیم متوجه شویم که پر استفاده ترین موارد همزمان با جاوااسکریپت چه مواردی هستند. تصاویر و تحلیل قبلی که ملاحظه نمودید دقیقا به همین منظور می تواند به کار رود.

برای جاوا اسکریپت نتایج بدست آمده را روی یک نمودار پای پیاده کرده ام.

1 : html , 2 : jQuery, 3 : reactjs , 4 : node.js, 5 : css, 6 : arrays, 7 : angular, 8 : php,9 : typescript, 10 : other tags

در تصویر زیر کدی برای یافتن این مجموعه نوشته شده را مشاهده میکنید و می توانید نتیجه بدست آمده را با تصویر فوق مطابقت دهید (به این نکته توجه داشته باشید که تصویر زیر فقط بخشی از خروجی است و فقط روی بخشی از دیتا ست اعمال شده است (به خاطر سرعت اجرا) ولی تصویر فوق چون آمار و ارقام ارائه میداد دقیق تر و از روش دیگری محاسبه شده است):

4.3- یافتن نزدیک ترین تکنولوژی ها به یک تکنولوژی خاص

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

دقیقا مواردی که در شبکه ego برای پایتون بدست آورده ایم در شکل فوق نمایان است.

4.4 دسته بندی تگها و نکنولوژی ها و به نوعی ارائه گروه یا دسته از آنها به منظور اهداف خاص (با انجمن معمولی فرق دارد)

بعنوان مثال تمام دسته بندی های python برای اهداف مختلف در شکل زیر نمایان است. مثلا گروه اول برای توسعه وب استفاده میشود و گروه سوم برای مباحث یادگیری ماشین و هوش مصنوعی.

یا بعنوان یک مثال دیگر در شکل زیر تمام دسته بندی های PHP قابل مشاهده است.

در شکل فوق گروه اول برای توسعه مستقل برنامه بر مبنای زبان php و فریمورک codeigniter است و گروه دوم برای توسعه back-end وردپرس و گروه سوم برای توسعه Front-end وردپرس.

و یا در شکل زیر تمام دسته بندی های زبان ++c قابل مشاهده است.

4.5 نمایش گرافیکی ارتباط بین تکنولوژی ها برای فهم بهتر نقش آنها

گاهی اسامی تکنولوژی و زبانهای مختلف آنچنان در هم آمیخته میشود که تفکیک آنها از هم کار سختی اسن و فهم ارتباط آنها با هم بسیار دشوار است. گاهی یک نمایش گرافیکی از تعداد معدودی تکنولوژی خاص بر حسب نیاز کاربر می تواند به درک بهتر این قضیه کمک کند. بنابراین یکی از کارهایی که در تحلیل شبکه stack over flow انجام شد همین امر بود.

بعنوان مثال در تصویر زیر سعی شده پر ارجاع ترین تکنولوژی ها به همراه ارتباطات درونی شان و نقطه های اتصالشان به هم نشاه داده شود.

در این تصویر کل شبکه که بسیار شلوغ است نشان داده نشده. بلکه یک زیربخش از شبکه به صورت واضح و روشن بیان شده و ارتباطات دو تکنولوژی PHP و Dot Net با هم مشخص شده است. در حقیقت نقطه اشتراک این دو می تواند استفاده از کتابخانه jQuery در فریمورک دات نت است.


4.6 رتبه بندی تکنولوژی ها (تگ ها) از منظر استفاده با سایر تکنولوژی ها (یا اثرگذاری تکنولوژی ها در مقایسه با یکدیگر)

هنگامی که میخواهیم ببینیم یک تکنولوژی (تگ) چقدر روی سایر تکنولوژی (تگ) ها اثر میگذارد می توانیم از چند جنبه آنرا بررسی کنیم.

4.6.1 چقدر یک تکنولوژی(تگ) با سایر تکنولوژی (تگ) ها مرتبط است :

برای تحلیل این مسئله از طریق دنیای شبکه های پیچیده و پویا با استفاده از دیتاستی که برای همین منظور از stackoverflow واکشی شد، Closeness Centrality بین تگ ها محاسبه شد و آنها را برا اساس این معیار مرتب سازی کردیم.

بر اساس رتبه بندی فوق mysql مرتبط ترین تکنولوژی در مقایسه با سایر تکنولوژی هاست به این معنا که mysql به اکثر تکنولوژی های دیگر ارتباط دارد و می تواند با آنها استفاده شود. مثلا پایتون با جاوا استفاده نمی شود (یا جاوا استفاده میشود یا پایتون) ولی mysql با هر دوی آنها قابل استفاده است. علاوه بر این mysql میتواند با php، سی شارپ، node.js نیز استفاده شود. همچنین تگ mysql با تگ هایی همچون database و xml و json که هر سه مربوط به داده ها هستند زیاد آمده است. پس می توان صحت این لیست را به صورت شهودی تایید نمود.


4.6.2 چقدر یک تکنولوژی (تگ) پیوند دهنده و واسطی برای جمع کردن سایر تکنولوژی هاست (یعنی چقدر استفاده از یک تکنولوژی می تواند باعث شود به سراغ سایر تکنولوژی های دیگر نیز برویم):

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

همانطور که انتظار میرفت نتیجه محاسبه Betweenness Centrality خیلی شبیه Closeness Centrality شده است. یعنی خیلی تفاوت زیادی به خصوص در ردیف های بالای این دو لیست وجود ندارد و تفاوت در پایین این دو لیست هم طبیعی است. زیرا ممکن است در حاشیه شبکه برخی تکنولوژی های حاشیه ای توجه سایر تکنولوژی ها را به خود جلب کرده باشند ولی عملا از سایر بخش های شبکه به دور باشند. مثل تگ های r و pandas که کاربردهای خاصی دارند.


4.6.3 چقدر یک تکنولوژی اثرگذارتر و مهم تر از تکنولوژی های دیگر است:

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

این لیست نیز مشابهت بسیاری به دو لیست قبلی دارد. یکی از نکاتی که در مقایسه این سه لیست قابل مشاهده است این است که تگی مثل node.js که تقریبا در میانه دو رنکینگ اول بود به یکباره به رتبه دوم در لیست تگ های مهم رسیده است. این نکته نشاندهنده این حقیقت است که اگرچه node.js مانند تگی مثل mysql در وسط شبکه و در میانه تگ ها نیست ولی در جایی از شبکه (کمی دورتر از مرکزیت شبکه) برای خود انجمن قابل توجهی را به راه انداخته است. اگر دقت کنیم تگ های دیگری که چنین خاصیتی دارند (نه به این شدت) باز هم قابل مشاهده هستند.


در این پروژه اهداف دیگری نیز داشتم. مثلا خیلی تلاش کردم RoadMap طی شده توسط یک متخصص برای یادگیری یک تکنولوژی را بیابم (هدف شماره 7 ). تا حدی راه را نیز پیدا نموده ام اما بعلت اینکه پیاده ساز ی این راه با Networkx کمی سخت بود علیرغم تلاش های زیاد نتوانستم به شکل عملی آنرا پیاده سازی کنم. هرچند نوع تفسیر دیتاست هم خیلی اثر گذار بود و خیلی ریسکی بود و با برداشت اشتباه می توانست به نتایج اشتباه برسد. برای همین بعنوان اولویت آخر در پروژه روی آن کار کردم که متأسفانه به نتیجه ای نرسید.



پروژهStack Overflowبرنامه نویسیزبان phpمنابع انسانی
شاید از این پست‌ها خوشتان بیاید