Gephi এবং Sigma.js সহ একটি নেটওয়ার্ক ভিজ্যুয়ালাইজেশন টিউটোরিয়াল
আমরা আজকে কী তৈরি করব তার একটি পূর্বরূপ এখানে রয়েছে:প্রোগ্রামিং ভাষাগুলি গ্রাফকে প্রভাবিত করে। অতীত এবং বর্তমান 250 টিরও বেশি প্রোগ্রামিং ভাষার মধ্যে "নকশা প্রভাব" সম্পর্কগুলি অন্বেষণ করতে লিঙ্কটি দেখুন!
আপনার পালা!
আজকের হাইপার-সংযুক্ত বিশ্বে, নেটওয়ার্ক আধুনিক জীবনের একটি সর্বব্যাপী দিক।
এখন পর্যন্ত আমার দিনের শুরুটা নিন — আমি লন্ডনের ট্রান্সপোর্ট নেটওয়ার্ক ব্যবহার করেছি শহরে ভ্রমণ করতে। তারপর আমি একটি শাখায় গেলাম আমার প্রিয় কফি শপ থেকে এবং তাদের Wi-Fi নেটওয়ার্ক এর সাথে সংযোগ করতে আমার Chromebook ব্যবহার করেছি৷ . এরপর, আমি বিভিন্ন সোশ্যাল নেটওয়ার্কিং-এ লগ ইন করেছি সাইটগুলো আমি প্রায়ই দেখি।
এটা কোন গোপন বিষয় নয় যে বিগত কয়েক দশকের কিছু প্রভাবশালী কোম্পানি তাদের সাফল্যের জন্য নেটওয়ার্কের শক্তির জন্য দায়ী।
Facebook, Twitter, Instagram, LinkedIn এবং অন্যান্য সোশ্যাল মিডিয়া প্ল্যাটফর্মগুলি সামাজিক নেটওয়ার্কগুলির ছোট-বিশ্ব বৈশিষ্ট্যের উপর নির্ভর করে৷ এটি তাদের ব্যবহারকারীদের একে অপরের সাথে (এবং বিজ্ঞাপনদাতাদের) কার্যকরভাবে সংযুক্ত করতে দেয়৷
সার্চ ইঞ্জিন বাজারে তাদের প্রারম্ভিক আধিপত্যের জন্য Google-এর বর্তমান সাফল্যের অনেকটাই ঋণী - এটি তাদের পেজ র্যাঙ্ক নেটওয়ার্ক অ্যালগরিদমের সাহায্যে প্রাসঙ্গিক ফলাফল ফেরত দেওয়ার ক্ষমতার মাধ্যমে।
Amazon-এর দক্ষ ডিস্ট্রিবিউশন নেটওয়ার্ক তাদের কিছু বড় শহরে একই দিনের ডেলিভারি অফার করতে দেয়।
কৃত্রিম বুদ্ধিমত্তা এবং মেশিন লার্নিংয়ের মতো ক্ষেত্রেও নেটওয়ার্কগুলি অত্যন্ত গুরুত্বপূর্ণ। নিউরাল নেটওয়ার্ক গবেষণার একটি খুব সক্রিয় ক্ষেত্র। অনেক বৈশিষ্ট্য সনাক্তকরণ অ্যালগরিদম, কম্পিউটার ভিশনে অপরিহার্য, ছবির বিভিন্ন অংশের মডেল করার জন্য নেটওয়ার্ক ব্যবহার করার উপর অনেক বেশি নির্ভর করে৷
নেটওয়ার্ক মডেলের পরিপ্রেক্ষিতে বিস্তৃত বৈজ্ঞানিক ঘটনাও বোঝা যায়। এর মধ্যে রয়েছে কোয়ান্টাম মেকানিক্স, জৈব রাসায়নিক পথ, এবং পরিবেশগত এবং আর্থ-সামাজিক ব্যবস্থা।
তাদের অনস্বীকার্য গুরুত্ব দেওয়া হলে, আমরা কীভাবে নেটওয়ার্ক এবং তাদের বৈশিষ্ট্যগুলিকে আরও ভালভাবে বুঝতে পারি?
নেটওয়ার্কগুলির গাণিতিক অধ্যয়ন "গ্রাফ তত্ত্ব" নামে পরিচিত, এবং এটি গণিতের আরও অ্যাক্সেসযোগ্য শাখাগুলির মধ্যে একটি। এই নিবন্ধটির লক্ষ্য একটি ভূমিকা প্রদান করা, সামান্য পূর্ব জ্ঞান বা অভিজ্ঞতা অনুমান করে।
আমরা Python 3.x এবং Gephi নামক কিছু দুর্দান্ত ওপেন-সোর্স সফ্টওয়্যার ব্যবহার করব কীভাবে অতীত এবং বর্তমান প্রোগ্রামিং ভাষার একটি পরিসর প্রভাবের দ্বারা লিঙ্ক করা হয়েছে তার নেটওয়ার্ক ভিজ্যুয়ালাইজেশন একত্রিত করতে।
কিন্তু প্রথম…
একটি নেটওয়ার্ক আসলে কি?
উপরে বর্ণিত উদাহরণ আমাদের কিছু সূত্র দেয়। পরিবহন নেটওয়ার্কগুলি গন্তব্যস্থল নিয়ে গঠিত রুট দ্বারা সংযুক্ত . সামাজিক নেটওয়ার্কগুলি ব্যক্তিদের দ্বারা গঠিত , তাদের সম্পর্কের মাধ্যমে সংযুক্ত এক অন্য. Google-এর সার্চ ইঞ্জিন অ্যালগরিদমগুলি বিভিন্ন ওয়েবপৃষ্ঠাগুলির "র্যাঙ্ক" মূল্যায়ন করে কোন পৃষ্ঠাগুলি লিঙ্ক দেখে অন্যদের কাছে।
আরও সাধারণভাবে, নেটওয়ার্ক হল যে কোনও সিস্টেম যাকে নোড এর পরিপ্রেক্ষিতে বর্ণনা করা যেতে পারে এবং কিনারা , অথবা কথ্য ভাষায়, "বিন্দু এবং রেখা"।
কিছু সিস্টেম এই পদ্ধতিতে সহজেই বিমূর্ত করা হয়। সামাজিক নেটওয়ার্কগুলি সম্ভবত সবচেয়ে সুস্পষ্ট উদাহরণ। কম্পিউটার ফাইলসিস্টেম হল আরেকটি — ফোল্ডার এবং ফাইলগুলি তাদের "পিতামাতা" এবং "সন্তান" সম্পর্ক দ্বারা লিঙ্ক করা হয়।
কিন্তু নেটওয়ার্কের আসল শক্তি এই সত্য থেকে আসে যে অনেকগুলি, অনেকগুলি সিস্টেমকে নেটওয়ার্ক পরিভাষায় বিমূর্ত এবং মডেল করা যেতে পারে, যদিও প্রথমে এটি কীভাবে তা স্পষ্ট না হয়৷
নেটওয়ার্ক প্রতিনিধিত্ব করা
নেটওয়ার্কগুলিকে গাণিতিকভাবে বিশ্লেষণ এবং বর্ণনা করতে আমাদের পেন-এবং-কাগজের স্কেচের বাইরে যেতে হবে। কিভাবে আমরা বিন্দু এবং লাইনের ছবিকে সংখ্যায় পরিণত করতে পারি যা আমরা ক্রাঞ্চ করতে পারি?
একটি সমাধান হল একটি সংলগ্ন ম্যাট্রিক্স আঁকা আমাদের নেটওয়ার্ক প্রতিনিধিত্ব করতে।
ম্যাট্রিস সেই ধারণাগুলির মধ্যে একটি যা আপনি যদি তাদের সাথে পরিচিত না হন তবে কিছুটা ভয় দেখাতে পারে তবে ভয় পাবেন না। এগুলিকে সংখ্যার গ্রিড হিসাবে ভাবুন যা একসাথে অনেকগুলি গণনা করতে ব্যবহার করা যেতে পারে। এখানে একটি উদাহরণ নিচে দেওয়া হল:
Python Java Scala C#
Python 0 1 0 0
Java 0 0 0 1
Scala 0 1 0 0
C# 0 1 0 0
এই ম্যাট্রিক্সে, প্রতিটি সারি এবং কলামের ছেদ হয় 0 বা 1, সংশ্লিষ্ট ভাষাগুলি সংযুক্ত কিনা তার উপর নির্ভর করে। আপনি উপরের চিত্রের বিপরীতে এটি পরীক্ষা করতে পারেন!
বেশিরভাগ উদ্দেশ্যে, সংলগ্ন ম্যাট্রিক্স একটি নেটওয়ার্ক গাণিতিকভাবে প্রতিনিধিত্ব করার একটি ভাল উপায়। একটি গণনাগত দৃষ্টিকোণ থেকে, যাইহোক, এটি কখনও কখনও কিছুটা কষ্টকর হতে পারে৷
উদাহরণস্বরূপ, নোডের একটি অপেক্ষাকৃত পরিমিত সংখ্যার সাথে (বলুন 1000), ম্যাট্রিক্সে অনেক বেশি সংখ্যক উপাদান থাকবে (যেমন, 1000² =1,000,000)।
অনেক বাস্তব-বিশ্বের সিস্টেম স্পার্স নেটওয়ার্ক প্রদান করে . এই নেটওয়ার্কগুলিতে, বেশিরভাগ নোডগুলি শুধুমাত্র অন্য সমস্তগুলির একটি ছোট অনুপাতের সাথে সংযোগ করে৷
যদি আমরা একটি সংলগ্ন ম্যাট্রিক্স হিসাবে কম্পিউটার মেমরিতে একটি 1000-নোড স্পার্স নেটওয়ার্ক উপস্থাপন করি, তাহলে আমাদের RAM-এ 1,000,000 বাইট ডেটা সংরক্ষিত থাকবে। বেশিরভাগই শূন্য হবে। এটি সম্পর্কে যাওয়ার আরও কার্যকর উপায় থাকতে হবে।
একটি বিকল্প পদ্ধতি হল এজ তালিকা নিয়ে কাজ করা পরিবর্তে. এগুলি তারা যা বলে তা ঠিক। এগুলি কেবল একটি তালিকা যা নোড জোড়া একে অপরের সাথে লিঙ্ক করে৷
উদাহরণস্বরূপ, উপরের প্রোগ্রামিং ল্যাঙ্গুয়েজ নেটওয়ার্ককে নিম্নরূপ উপস্থাপন করা যেতে পারে:
Java, Python
Java, Scala
Java, C#
C#, Java
বৃহত্তর নেটওয়ার্কগুলির জন্য, এটি তাদের প্রতিনিধিত্ব করার একটি অনেক বেশি গণনাগতভাবে দক্ষ উপায়। একটি প্রান্ত তালিকা (এবং তদ্বিপরীত) থেকে একটি সংলগ্ন ম্যাট্রিক্স তৈরি করা অবশ্যই সম্ভব। এটি এমন নয় যে আমাদের একটি বা অন্যটি বেছে নিতে হবে।
নেটওয়ার্কের প্রতিনিধিত্ব করার আরেকটি উপায় হল সংলগ্ন তালিকা। এটি প্রতিটি নোডকে তালিকাভুক্ত করে যার সাথে এটি লিঙ্ক করে। যেমন:
Java: Python, Scala, C#
C#: Java
ডেটা সংগ্রহ করা, সংযোগ করা
যেকোন নেটওয়ার্ক মডেল এবং ভিজ্যুয়ালাইজেশন শুধুমাত্র ততটা ভালো হবে যতটা ডেটা এটি তৈরি করতে ব্যবহৃত হয়। এর মানে, ডেটা সঠিক এবং সম্পূর্ণ উভয়ই নিশ্চিত করার পাশাপাশি, আমাদের নোডগুলির মধ্যে প্রান্তগুলি অনুমান করার একটি উপায়কে সমর্থন করতে হবে৷
অনেক ক্ষেত্রে, এটি হল the সমালোচনামূলক পদক্ষেপ। নেটওয়ার্ক সম্পর্কে পরবর্তী যে কোনো বিশ্লেষণ এবং অনুমান নির্ভর করে "সংযোগের মানদণ্ড" ন্যায্যতা প্রমাণ করতে সক্ষম হওয়ার উপর।
উদাহরণস্বরূপ, সোশ্যাল নেটওয়ার্ক বিশ্লেষণে, আপনি লোকেদের সামাজিক মিডিয়াতে একে অপরকে অনুসরণ করেন কিনা তার উপর ভিত্তি করে লিঙ্ক করতে পারেন। আণবিক জীববিজ্ঞানে, আপনি তাদের সহ-অভিব্যক্তির উপর ভিত্তি করে জিনকে লিঙ্ক করতে পারেন।
প্রায়শই, নোডগুলি লিঙ্ক করার জন্য ব্যবহৃত পদ্ধতিটি ওজন করার অনুমতি দেয় প্রান্তে বরাদ্দ করা, একটি পরিমাপ প্রদান করে "শক্তি"।
উদাহরণ স্বরূপ, অনলাইন খুচরা বিক্রেতার পরিপ্রেক্ষিতে, আপনি কত ঘন ঘন তারা একসাথে কেনা হয় তার উপর ভিত্তি করে পণ্যগুলিকে লিঙ্ক করতে পারেন। যে পণ্যগুলি প্রায়শই একসাথে কেনা হয় সেগুলি একটি উচ্চতর ওজনযুক্ত প্রান্ত দ্বারা লিঙ্ক করা হবে শুধুমাত্র কখনও কখনও একসঙ্গে কেনা হয় যে পণ্যের চেয়ে. যে পণ্যগুলি একত্রে কেনা হয় তার চেয়ে বেশি ঘন ঘন আশা করা যায় না সেগুলিকে সংযুক্ত করা হবে না৷
আপনি যেমন কল্পনা করতে পারেন, নোডগুলিকে একে অপরের সাথে লিঙ্ক করার পদ্ধতিগুলি আপনার পছন্দ মতো পরিশীলিত হতে পারে৷
যাইহোক, এই টিউটোরিয়ালের জন্য আমরা প্রোগ্রামিং ভাষাগুলিকে সংযুক্ত করার একটি সহজ উপায় ব্যবহার করব। আমরা উইকিপিডিয়ার নির্ভুলতার উপর নির্ভর করব।
আমাদের উদ্দেশ্যে, এটি ঠিক হওয়া উচিত। উইকিপিডিয়ার সাফল্য প্রমাণ করে যে এটি অবশ্যই সঠিক কিছু করছে। ওপেন-সোর্স, সহযোগিতামূলক পদ্ধতি যার মাধ্যমে নিবন্ধগুলি লেখা হয় তা কিছু মাত্রার বস্তুনিষ্ঠতা নিশ্চিত করতে হবে।
এছাড়াও, এর তুলনামূলকভাবে সামঞ্জস্যপূর্ণ পৃষ্ঠার কাঠামো এটিকে ওয়েব-স্ক্র্যাপিং কৌশলগুলি চেষ্টা করার জন্য একটি সুবিধাজনক খেলার মাঠ করে তোলে।
আরেকটি বোনাস হল ব্যাপক, সু-নথিভুক্ত উইকিপিডিয়া এপিআই, যা তথ্য পুনরুদ্ধারকে এখনও সহজ করে তোলে। চলুন শুরু করা যাক।
ধাপ 1 — গেফি ইনস্টল করা হচ্ছে
লিনাক্স, ম্যাক এবং উইন্ডোজে গেফি উপলব্ধ। আপনি এটি এখানে ডাউনলোড করতে পারেন।
এই প্রকল্পের জন্য, আমি লুবুন্টু ব্যবহার করছিলাম। আপনি যদি উবুন্টু/ডেবিয়ানে থাকেন, তাহলে আপনি গেফিকে চালু করতে এবং চালানোর জন্য নীচের পদক্ষেপগুলি অনুসরণ করতে পারেন। অন্যথায়, ইনস্টলেশন প্রক্রিয়াটি সম্ভবত আপনি যা কিছু জানেন তার মতোই হবে।
আপনার সিস্টেমের জন্য গেফির সর্বশেষ সংস্করণটি ডাউনলোড করুন (লেখার সময় এটি ছিল v.0.9.1)। এটি প্রস্তুত হলে, আপনাকে ফাইলগুলি বের করতে হবে।
cd Downloads
tar -xvzf gephi-0.9.1-linux.tar.gz
cd gephi-0.9.1/bin./gephi
আপনার জাভা JRE এর সংস্করণটি পরীক্ষা করতে হতে পারে। গেফির একটি সাম্প্রতিক সংস্করণ প্রয়োজন। আমার Lubuntu এর তুলনামূলকভাবে নতুন ইনস্টলে, আমি কেবল ডিফল্ট-jre ইনস্টল করেছি এবং সেখান থেকে সবকিছু কাজ করেছে।
apt install default-jre
./gephi
আপনি শুরু করার জন্য প্রস্তুত হওয়ার আগে আরও একটি ধাপ আছে। ওয়েবে গ্রাফ রপ্তানি করার জন্য, আপনি Gephi-এর জন্য Sigma.js প্লাগইন ব্যবহার করতে পারেন।
গেফির মেনু বার থেকে, "সরঞ্জাম" বিকল্পটি নির্বাচন করুন এবং "প্লাগইনস" নির্বাচন করুন৷
"উপলব্ধ প্লাগইনস" ট্যাবে ক্লিক করুন এবং "সিগমা এক্সপোর্টার" নির্বাচন করুন (আমি JSON এক্সপোর্টারও ইনস্টল করেছি, কারণ এটি কাছাকাছি থাকা আরেকটি দরকারী প্লাগইন)।
"ইনস্টল" বোতামটি টিপুন এবং আপনাকে প্রক্রিয়াটির মধ্য দিয়ে যেতে হবে। আপনার কাজ শেষ হয়ে গেলে আপনাকে গেফি রিস্টার্ট করতে হবে।
ধাপ 2 — পাইথন স্ক্রিপ্ট লেখা
এই টিউটোরিয়ালটি Python 3.x এবং জীবনকে সহজ করার জন্য কয়েকটি মডিউল ব্যবহার করবে। পিপ মডিউল ইনস্টলার ব্যবহার করে, নিম্নলিখিত কমান্ডটি চালান:
pip3 install wikipedia
এখন, একটি নতুন ডিরেক্টরিতে, script.py
নামে একটি ফাইল তৈরি করুন , এবং আপনার প্রিয় কোড এডিটর/IDE-এ এটি খুলুন। নীচে মূল যুক্তির একটি রূপরেখা দেওয়া হল:
- প্রথমে, আপনাকে অন্তর্ভুক্ত করার জন্য প্রোগ্রামিং ভাষার একটি তালিকা প্রয়োজন।
- এরপর, সেই তালিকার মধ্য দিয়ে যান এবং প্রাসঙ্গিক উইকিপিডিয়া নিবন্ধের HTML পুনরুদ্ধার করুন।
- এটি থেকে, প্রতিটি ভাষা প্রভাবিত করেছে এমন প্রোগ্রামিং ভাষার একটি তালিকা বের করুন। এটি একটি মোটামুটি এবং প্রস্তুত সংযোগের মানদণ্ড হবে৷ ৷
- যখন আপনি এটিতে থাকবেন, প্রতিটি ভাষা সম্পর্কে কিছু মেটাডেটা ধরতে পারলে ভালো লাগবে৷
- অবশেষে, আপনি একটি .csv ফাইলে আপনার সংগ্রহ করা সমস্ত ডেটা লিখতে চাইবেন
সম্পূর্ণ স্ক্রিপ্ট এই সারাংশে পাওয়া যাবে।
কিছু মডিউল আমদানি করুন
script.py
-এ , কিছু মডিউল আমদানি করে শুরু করুন যা জিনিসগুলিকে সহজ করে তুলবে:
import csv
import wikipedia
import urllib.request
from bs4 import BeautifulSoup as BS
import re
ঠিক আছে - অন্তর্ভুক্ত করার জন্য নোডগুলির একটি তালিকা তৈরি করে শুরু করুন। এখানেই উইকিপিডিয়া মডিউলটি কাজে আসে। এটি উইকিপিডিয়া এপিআই অ্যাক্সেস করা খুব সহজ করে তোলে।
নিম্নলিখিত কোড যোগ করুন:
pageTitle = "List of programming languages"
nodes = list(wikipedia.page(pageTitle).links)
print(nodes)
আপনি যদি এই স্ক্রিপ্টটি সংরক্ষণ করেন এবং চালান, আপনি দেখতে পাবেন এটি "প্রোগ্রামিং ভাষার তালিকা" উইকিপিডিয়া নিবন্ধ থেকে সমস্ত লিঙ্ক প্রিন্ট করে। চমৎকার!
যাইহোক, যেকোনো স্বয়ংক্রিয়ভাবে সংগৃহীত ডেটা ম্যানুয়ালি পরিদর্শন করা সবসময়ই বুদ্ধিমান। একটি দ্রুত নজরে দেখা যাবে যে, অনেকগুলি প্রকৃত প্রোগ্রামিং ভাষার পাশাপাশি, স্ক্রিপ্টটি কয়েকটি অতিরিক্ত লিঙ্কও তুলেছে৷
উদাহরণস্বরূপ, আপনি সেখানে "মার্কআপ ভাষার তালিকা", "প্রোগ্রামিং ভাষার তুলনা" এবং অন্যান্য দেখতে পারেন।
যদিও গেফি আপনাকে নোডগুলিকে অপসারণ করতে দেয় যা আপনি অন্তর্ভুক্ত করতে চান না, এটি এগিয়ে যাওয়ার আগে ডেটা "পরিষ্কার" করতে ক্ষতি করবে না। যদি কিছু হয় তবে এটি পরে সময় বাঁচাবে।
removeList = [
"List of",
"Lists of",
"Timeline",
"Comparison of",
"History of",
"Esoteric programming language"
]
nodes = [i for i in nodes if not any(r in i for r in removeList)]
এই লাইনগুলি ডেটা থেকে সরানো সাবস্ট্রিংগুলির একটি তালিকা সংজ্ঞায়িত করে। তারপরে স্ক্রিপ্টটি ডেটার মধ্য দিয়ে যায়, যেকোন উপাদানগুলিকে সরিয়ে দেয় যাতে যেকোনও অবাঞ্ছিত সাবস্ট্রিং থাকে৷
পাইথনে, এর জন্য কোডের একটি মাত্র লাইন প্রয়োজন!
কিছু সহায়ক ফাংশন
এখন আপনি একটি প্রান্ত তালিকা তৈরি করতে উইকিপিডিয়া স্ক্র্যাপ করা শুরু করতে পারেন (এবং যেকোনো মেটাডেটা সংগ্রহ করুন)। এটি সহজ করার জন্য, প্রথমে কয়েকটি ফাংশন সংজ্ঞায়িত করুন।
এইচটিএমএল দখল
৷প্রথম ফাংশনটি প্রতিটি ভাষার উইকিপিডিয়া পৃষ্ঠার জন্য HTML ধরে রাখতে BeautifulSoup মডিউল ব্যবহার করে৷
base = "https://en.wikipedia.org/wiki/"
def getSoup(n):
try:
with urllib.request.urlopen(base+n) as response:
soup = BS(response.read(),'html.parser')
table = soup.find_all("table",class_="infobox vevent")[0] return table
except:
pass
এই ফাংশনটি “https://en.wikipedia.org/wiki/” + “programming language”
-এ পৃষ্ঠার জন্য HTML ধরে রাখতে urllib.request মডিউল ব্যবহার করে .
এটি তারপর বিউটিফুলসুপে পাঠানো হয়, যা HTML-কে এমন একটি বস্তুতে পার্স করে যা আমরা তথ্য অনুসন্ধান করতে ব্যবহার করতে পারি।
এরপর, find_all()
ব্যবহার করুন আপনার আগ্রহের HTML উপাদান বের করার পদ্ধতি।
এখানে, এটি প্রতিটি প্রোগ্রামিং ভাষা নিবন্ধের শীর্ষে সারাংশ টেবিল হবে। এগুলো কিভাবে শনাক্ত করা যায়?
সবচেয়ে সহজ উপায় হল প্রোগ্রামিং ল্যাঙ্গুয়েজ পেজগুলির একটিতে যাওয়া। এখানে, আপনি আগ্রহের উপাদানগুলি পরিদর্শন করতে ব্রাউজারের বিকাশকারী সরঞ্জামগুলি ব্যবহার করতে পারেন৷
৷
সারাংশ টেবিলে HTML ট্যাগ <tab
আছে le> এবং CSS classes "in
fobox" and "v
ইভেন্ট", তাই আপনি এইচটিএমএল-এ টেবিল সনাক্ত করতে এগুলি ব্যবহার করতে পারেন।
আর্গুমেন্টের সাথে এটি নির্দিষ্ট করুন:
"table"
এবংclass_="infobox vevent"
find_all()
মানদণ্ডের সাথে মেলে এমন সমস্ত উপাদানের একটি তালিকা প্রদান করে। আপনি যে উপাদানটিতে আগ্রহী তা আসলে নির্দিষ্ট করতে, সূচী যোগ করুন [0]
. ফাংশন সফল হলে, এটি table
ফেরত দেয় বস্তু অন্যথায়, এটি None
প্রদান করে .
যেকোনো স্বয়ংক্রিয় ডেটা সংগ্রহ পদ্ধতির সাথে, ব্যতিক্রমগুলি পুঙ্খানুপুঙ্খভাবে পরিচালনা করা সর্বদা গুরুত্বপূর্ণ। যদি তা না হয়, তাহলে সবচেয়ে ভালো পরিস্থিতিতে স্ক্রিপ্টটি ক্র্যাশ হয়ে যায় এবং আপনাকে আবার শুরু করতে হবে।
সবচেয়ে খারাপ ক্ষেত্রে, আপনি অসঙ্গতি এবং ত্রুটির সাথে ধাঁধাঁযুক্ত একটি ডেটা সেট দিয়ে শেষ করবেন। এটি লাইনের সাথে কাজ করা একটি দুঃস্বপ্ন করে তুলবে।
মেটাডেটা পুনরুদ্ধার করুন
পরবর্তী ফাংশন table
ব্যবহার করে কিছু মেটাডেটা খুঁজতে আপত্তি. এখানে, এটি যে বছর ভাষা প্রথম প্রকাশিত হয়েছিল তার জন্য টেবিলটি অনুসন্ধান করে৷
def getYear(t):
try:
t = t.get_text()
year = t[t.find("appear"):t.find("appear")+30]
year = re.match(r'.*([1-3][0-9]{3})',year).group(1)
return int(year)
except:
return "Could not determine"
এই সংক্ষিপ্ত ফাংশনটি table
নেয় অবজেক্ট এর আর্গুমেন্ট হিসেবে, এবং BeautifulSoup এর get_text()
ব্যবহার করে একটি স্ট্রিং তৈরি করতে ফাংশন৷
পরবর্তী ধাপ হল year
নামে একটি সাবস্ট্রিং তৈরি করা . "appear"
শব্দের প্রথম উপস্থিতির পরে এটি 30টি অক্ষর নেয় . এই স্ট্রিংটিতে ভাষাটি প্রথম যে বছরটি প্রকাশিত হয়েছিল তা থাকা উচিত৷
শুধু বছর বের করতে, একটি রেগুলার এক্সপ্রেশন ব্যবহার করুন (re
এর সৌজন্যে মডিউল) 1 এবং 3 এর মধ্যে একটি অঙ্ক দিয়ে শুরু হওয়া এবং তিনটি সংখ্যা দ্বারা অনুসরণ করা যেকোন অক্ষরগুলিকে মেলানোর জন্য৷
re.match(r'.*([1-3][0-9]{3})',year)
এটি সফল হলে, ফাংশনটি year
প্রদান করে একটি পূর্ণসংখ্যা হিসাবে। অন্যথায়, এটি একটি দুঃখজনক চেহারা "নির্ধারণ করতে পারেনি" প্রদান করে। আপনি আরও মেটাডেটা স্ক্র্যাপ করতে চাইতে পারেন — যেমন প্যারাডাইম, ডিজাইনার বা টাইপিং ডিসিপ্লিন।
লিঙ্ক সংগ্রহ করা
আপনার জন্য আরও একটি ফাংশন — এইবার, আপনি table
এ ফিড করবেন একটি প্রদত্ত ভাষার জন্য বস্তু, এবং আশা করি অন্যান্য প্রোগ্রামিং ভাষার একটি তালিকা পাবেন।
def getLinks(t):
try:
table_rows = t.find_all("tr")
for i in range(0,len(table_rows)-1):
try:
if table_rows[i].get_text() == "\nInfluenced\n":
out = []
for j in table_rows[i+1].find_all("a"):
try:
out.append(j['title'])
except:
continue
return out
except:
continue
return
except:
return
ওহ, সেই সব বাসা দেখো... তাহলে এখানে আসলে কী হচ্ছে?
এই ফাংশনটি এই সত্যটি ব্যবহার করে যে table
বস্তুর একটি সামঞ্জস্যপূর্ণ গঠন আছে। সারণীতে তথ্য সারিতে সংরক্ষণ করা হয় (প্রাসঙ্গিক HTML ট্যাগ হল <
tr>)। এই সারির একটিতে `টেক্সট "\nInfluenced\n"
থাকবে . ফাংশনের প্রথম অংশটি খুঁজে বের করে যে এটি কোন সারি।
একবার এই সারিটি পাওয়া গেলে, আপনি পরবর্তী সম্পর্কে নিশ্চিত হতে পারেন৷ সারিতে বর্তমানের দ্বারা প্রভাবিত প্রতিটি প্রোগ্রামিং ভাষার লিঙ্ক রয়েছে। find_all("a")
ব্যবহার করে এই লিঙ্কগুলি খুঁজুন — যেখানে যুক্তি "a"
HTML ট্যাগের সাথে মিলে যায় <a>
.
প্রতিটি লিঙ্কের জন্য j
, এর ["title"]
যোগ করুন out
নামের একটি তালিকার বৈশিষ্ট্য . ["title"]
-এ আগ্রহী হওয়ার কারণ বৈশিষ্ট্য কারণ এটি ঠিকভাবে মিলবে ভাষার নাম nodes
-এ সংরক্ষিত .
উদাহরণস্বরূপ, জাভা nodes
এ সংরক্ষণ করা হয় "Java (programming language)"
হিসাবে , তাই আপনাকে পুরো ডেটা সেট জুড়ে এই সঠিক নামটি ব্যবহার করতে হবে।
সফল হলে, getLinks()
প্রোগ্রামিং ভাষার একটি তালিকা প্রদান করে। বাকি ফাংশন ব্যতিক্রম হ্যান্ডলিং নিয়ে কাজ করে, যদি কোনো পর্যায়ে কিছু ভুল হয়ে যায়।
ডেটা সংগ্রহ করা
শেষ পর্যন্ত, আপনি ফিরে বসতে এবং স্ক্রিপ্টটিকে তার কাজ করতে দিতে প্রায় প্রস্তুত। এটি ডেটা সংগ্রহ করবে এবং দুটি তালিকা বস্তুতে সংরক্ষণ করবে।
edgeList = [["Source,Target"]]
meta = [["Id","Year"]]
এখন একটি লুপ লিখুন যা nodes
এর প্রতিটি আইটেমে আগে সংজ্ঞায়িত ফাংশনগুলি প্রয়োগ করবে , এবং আউটপুটগুলিকে edgeList
-এ সংরক্ষণ করুন এবং meta
.
for n in nodes:
try:
temp = getSoup(n)
except:
continue
try:
influenced = getLinks(temp)
for link in influenced:
if link in nodes:
edgeList.append([n+","+link])
print([n+","+link])
except:
continue
year = getYear(temp)
meta.append([n,year])
এই ফাংশনটি প্রতিটি ভাষাকে nodes
-এ নেয় এবং এর উইকিপিডিয়া পৃষ্ঠা থেকে সারাংশ সারণী পুনরুদ্ধার করার চেষ্টা করে।
তারপর, এটি সারণীতে তালিকাভুক্ত সমস্ত ভাষা পুনরুদ্ধার করে যা প্রশ্নে থাকা ভাষা দ্বারা প্রভাবিত হয়েছে৷
প্রতিটি ভাষার জন্য যা nodes
-এও দেখা যায় তালিকা, edgeList
এ একটি উপাদান যুক্ত করুন ["source,target"]
আকারে . এইভাবে, আপনি গেফিতে খাওয়ানোর জন্য একটি প্রান্ত তালিকা তৈরি করবেন।
ডিবাগ করার উদ্দেশ্যে, edgeList
এ যোগ করা প্রতিটি উপাদান প্রিন্ট করুন - শুধু নিশ্চিত হতে হবে যে সবকিছু যেমন উচিত তেমন কাজ করছে। আপনি যদি অতিরিক্ত পুঙ্খানুপুঙ্খ হন, তাহলে আপনি except
এ মুদ্রণ বিবৃতি যোগ করতে পারেন ধারাগুলিও৷
এর পরে, ভাষার নাম এবং বছর পান এবং এগুলিকে meta
-এ যোগ করুন তালিকা।
CSV-এ লেখা
একবার লুপ চালানো হলে, চূড়ান্ত ধাপ হল edgeList
-এর বিষয়বস্তু লেখা এবং meta
কমা বিভক্ত মান (CSV) ফাইলে। এটি csv
দিয়ে সহজেই করা যায় মডিউল আগে আমদানি করা হয়েছে।
with open("edge_list.csv","w") as f:
wr = csv.writer(f)
for e in edgeList:
wr.writerow(e)
with open("metadata.csv","w") as f2:
wr = csv.writer(f2)
for m in meta:
wr.writerow(m)
সম্পন্ন! স্ক্রিপ্ট সংরক্ষণ করুন, এবং টার্মিনাল রান থেকে:
$ python3 script.py
আপনি স্ক্রিপ্ট প্রতিটি উৎস-টার্গেট জোড়া মুদ্রণ দেখতে হবে কারণ এটি প্রান্ত তালিকা তৈরি করে। নিশ্চিত করুন যে আপনার ইন্টারনেট সংযোগ স্থির আছে, এবং স্ক্রিপ্টটি তার যাদু করে তখন বসে থাকুন।
ধাপ 3 — গেফি দিয়ে গ্রাফ নির্মাণ
আশা করি আপনি Gephi ইনস্টল এবং আগে চলমান আছে. এখন আপনি একটি নতুন প্রকল্প তৈরি করতে পারেন এবং একটি নির্দেশিত গ্রাফ তৈরি করতে আপনার সংগ্রহ করা ডেটা ব্যবহার করতে পারেন। এটি দেখাবে কিভাবে বিভিন্ন প্রোগ্রামিং ভাষা একে অপরকে প্রভাবিত করেছে!
গেফিতে একটি নতুন প্রকল্প তৈরি করে শুরু করুন এবং "ডেটা ল্যাবরেটরি" ভিউতে স্যুইচ করুন। এটি গেফিতে ডেটা পরিচালনা করার জন্য একটি স্প্রেডশীটের মতো ইন্টারফেস প্রদান করে। প্রথম কাজটি হল প্রান্ত তালিকা আমদানি করা৷
৷- "স্প্রেডশীট আমদানি করুন" এ ক্লিক করুন।
-
edge_list.csv
বেছে নিন পাইথন স্ক্রিপ্ট দ্বারা উত্পন্ন ফাইল। নিশ্চিত করুন যে গেফি বিভাজক হিসাবে কমা ব্যবহার করতে জানে৷
৷ - লিস্টের ধরন থেকে "এজ তালিকা" বেছে নিন।
- "পরবর্তী" ক্লিক করুন এবং পরীক্ষা করুন যে আপনি স্ট্রিং হিসাবে উত্স এবং লক্ষ্য কলাম উভয়ই আমদানি করছেন৷
এটি নোডের একটি তালিকা সহ ডেটা ল্যাব আপডেট করা উচিত। এখন, metadata.csv
আমদানি করুন ফাইল এইবার, তালিকার ধরন থেকে "নোড তালিকা" বেছে নেওয়ার বিষয়টি নিশ্চিত করুন।
"প্রিভিউ" ট্যাবে স্যুইচ করুন, এবং নেটওয়ার্কটি কেমন দেখাচ্ছে তা দেখুন৷
৷আহ… এটা একটুখানি… একরঙা। এবং অগোছালো. স্প্যাগেটির প্লেটের মতো। এটা ঠিক করা যাক।
এটিকে সুন্দর করা
আপনি উপস্থাপনায় কাজ করতে পারেন এমন সব ধরণের উপায় আছে, এবং এখানে অল্প কিছু সৃজনশীল স্বাধীনতা আসে। নেটওয়ার্ক ভিজ্যুয়ালাইজেশনের সাথে, মূলত তিনটি বিষয় বিবেচনা করতে হবে:
- পজিশনিং বেশ কয়েকটি অ্যালগরিদম রয়েছে যা একটি নেটওয়ার্কের জন্য বিন্যাস প্যাটার্ন তৈরি করতে পারে। একটি জনপ্রিয় পছন্দ হল ফ্রুচটারম্যান-রিনগোল্ড অ্যালগরিদম, যা গেফিতে পাওয়া যায়।
- সাইজিং ৷ একটি গ্রাফে নোডের আকার কিছু আকর্ষণীয় সম্পত্তি উপস্থাপন করতে ব্যবহার করা যেতে পারে। প্রায়শই, এটি একটিকেন্দ্রীয়তা পরিমাপ . কেন্দ্রীয়তা পরিমাপ করার অনেক উপায় আছে, কিন্তু এগুলি সমস্তই একটি প্রদত্ত নোডের "গুরুত্ব" প্রতিফলিত করে, এটি বাকি নেটওয়ার্কের সাথে কতটা ভালভাবে সংযুক্ত।
- রঙ করা একটি নোডের কিছু বৈশিষ্ট্য দেখানোর জন্য রঙ ব্যবহার করাও সম্ভব। প্রায়শই, সম্প্রদায়িক কাঠামো নির্দেশ করতে রঙ ব্যবহার করা হয় . এটিকে বিস্তৃতভাবে "নোডের একটি গ্রুপ যা গ্রাফের বাকি অংশের তুলনায় একে অপরের সাথে বেশি সংযুক্ত" হিসাবে সংজ্ঞায়িত করা হয়। একটি সামাজিক নেটওয়ার্কে, এটি বন্ধুত্ব, পরিবার বা পেশাদার গোষ্ঠী প্রকাশ করতে পারে। বেশ কয়েকটি অ্যালগরিদম রয়েছে যা সম্প্রদায়ের কাঠামো সনাক্ত করতে পারে। গেফি বিল্ট-ইন লুভেন পদ্ধতির সাথে আসে।
এই পরিবর্তনগুলি করতে, আপনাকে কিছু পরিসংখ্যান গণনা করতে হবে। "ওভারভিউ" উইন্ডোতে স্যুইচ করুন। এখানে আপনি ডানদিকে একটি প্যানেল দেখতে পাবেন। এটিতে একটি "পরিসংখ্যান" ট্যাব থাকা উচিত। এটি খুলুন, এবং আপনি বিকল্পের একটি পরিসীমা দেখতে পাবেন।
গেফি অনেক ইনবিল্ট পরিসংখ্যানগত ক্ষমতা নিয়ে আসে। তাদের প্রত্যেকের জন্য, "চালান" এ ক্লিক করা একটি প্রতিবেদন তৈরি করবে যা নেটওয়ার্ক সম্পর্কে অন্তর্দৃষ্টি প্রকাশ করবে৷
জানার জন্য কিছু দরকারী বিষয় অন্তর্ভুক্ত:
- গড় ডিগ্রি গড় ভাষা প্রায় চারটি অন্যের সাথে সংযুক্ত। প্রতিবেদনটি একটি ডিগ্রী বিতরণ গ্রাফও দেখায়। এটি প্রকাশ করে যে বেশিরভাগ ভাষার খুব কম সংযোগ রয়েছে, যখন একটি ছোট অনুপাতের অনেকগুলি রয়েছে। এটি প্রস্তাব করে যে এটি একটি স্কেল-মুক্ত৷ নেটওয়ার্ক . স্কেল-মুক্ত নেটওয়ার্ক এবং সেগুলি তৈরি করে এমন প্রক্রিয়াগুলি নিয়ে অনেক গবেষণা করা হয়েছে৷
- ব্যাস এই নেটওয়ার্কের ব্যাস 12 - যার অর্থ এটি যে কোনও দুটি ভাষার মধ্যে সংযোগের "প্রশস্ত" সংখ্যা। গড় পথের দৈর্ঘ্য মাত্র চারের নিচে। এর মানে হল, গড়ে যেকোন দুটি ভাষাকে চারটি প্রান্ত দিয়ে আলাদা করা হয়। এই পরিসংখ্যানগুলি নেটওয়ার্কের "আকার" পরিমাপ দেয়।
- মডুলারিটি এটি এমন একটি স্কোর যা দেখায় যে নেটওয়ার্কটি কতটা "বিভাগীয়"। এখানে, মডুলারিটি স্কোর প্রায় 0.53। এটি তুলনামূলকভাবে বেশি, এই নেটওয়ার্কের মধ্যে স্বতন্ত্র মডিউল রয়েছে। আবার, এটি অন্তর্নিহিত সিস্টেম সম্পর্কে আকর্ষণীয় কিছু নির্দেশ করে। ভাষাগুলি স্বতন্ত্র "প্রভাব গ্রুপে" পড়ে।
যাইহোক, নেটওয়ার্কের চেহারা পরিবর্তন করতে, বাম প্যানেলে যান৷
৷"লেআউট" ট্যাবে, আপনি কোন লেআউট অ্যালগরিদম ব্যবহার করবেন তা নির্বাচন করতে পারেন৷ "রান" টিপুন এবং রিয়েল-টাইমে গ্রাফ শিফট দেখুন! দেখুন কোন লেআউট অ্যালগরিদম আপনার কাছে সবচেয়ে ভালো কাজ করে৷
৷লেআউট ট্যাবের উপরে "আবির্ভাব" ট্যাব আছে। এখানে, আপনি নোড এবং প্রান্তের রঙ, আকার এবং লেবেলের জন্য বিভিন্ন সেটিংসের সাথে খেলতে পারেন। এগুলি বৈশিষ্ট্যের উপর ভিত্তি করে কনফিগার করা যেতে পারে (যে পরিসংখ্যানগুলি আপনি গণনা করার জন্য গেফিকে পান তা সহ)।
একটি পরামর্শ হিসাবে, আপনি করতে পারেন:
- নোডগুলিকে তাদের মডুলারিটি বৈশিষ্ট্য দ্বারা রঙ করুন। এটি তাদের সম্প্রদায়ের সদস্যতা অনুসারে তাদের রঙ করে।
- নোডগুলিকে তাদের ডিগ্রি অনুসারে আকার দিন। আরও ভাল সংযুক্ত নোডগুলি কম সংযুক্ত নোডগুলির চেয়ে বড় দেখাবে৷
যাইহোক, আপনার পরীক্ষা করা উচিত এবং আপনার পছন্দের লেআউট নিয়ে আসা উচিত।
একবার আপনি আপনার গ্রাফের উপস্থিতিতে খুশি হয়ে গেলে, এটি চূড়ান্ত ধাপে যাওয়ার সময় - ওয়েবে রপ্তানি করা!
ধাপ 4 — Sigma.js
ইতিমধ্যে আপনি একটি নেটওয়ার্ক ভিজ্যুয়ালাইজেশন তৈরি করেছেন যা গেফিতে অন্বেষণ করা যেতে পারে। আপনি একটি স্ক্রিনশট নিতে বা এসভিজি, পিডিএফ বা পিএনজি ফর্ম্যাটে গ্রাফ সংরক্ষণ করতে পারেন৷
যাইহোক, আপনি যদি Sigma.js প্লাগইনটি আগে ইন্সটল করে থাকেন, তাহলে গ্রাফটি HTML-এ রপ্তানি করবেন না কেন? এটি একটি ইন্টারেক্টিভ ভিজ্যুয়ালাইজেশন তৈরি করবে যা আপনি অনলাইনে হোস্ট করতে পারবেন, বা GitHub-এ আপলোড করতে পারবেন এবং অন্যদের সাথে শেয়ার করতে পারবেন।
এটি করতে, গেফির মেনু বার থেকে "রপ্তানি> Sigma.js টেমপ্লেট…" নির্বাচন করুন৷
প্রয়োজনীয় বিবরণ পূরণ করুন. আপনি কোন ডিরেক্টরিতে প্রকল্প রপ্তানি করবেন তা চয়ন করতে ভুলবেন না। আপনি শিরোনাম, কিংবদন্তি, বর্ণনা, হোভার আচরণ এবং অন্যান্য অনেক বিবরণ পরিবর্তন করতে পারেন। আপনি প্রস্তুত হলে, "ঠিক আছে" ক্লিক করুন৷
৷এখন, আপনি যদি প্রোজেক্টটি রপ্তানি করেছেন সেই ডিরেক্টরিতে নেভিগেট করলে, আপনি Sigma.js দ্বারা উত্পন্ন সমস্ত ফাইল সমন্বিত একটি ফোল্ডার দেখতে পাবেন৷
index.html
খুলুন আপনার প্রিয় ব্রাউজারে। তা-দা! আপনার নেটওয়ার্ক আছে! আপনি যদি একটু CSS এবং JavaScript জানেন, আপনি আপনার ইচ্ছামতো আউটপুট টুইক করার জন্য বিভিন্ন জেনারেট করা ফাইলগুলিতে ডুব দিতে পারেন।
এবং এটি এই টিউটোরিয়ালটি শেষ করে!
সারাংশ
- অনেক সিস্টেমকে নেটওয়ার্ক হিসাবে মডেল এবং ভিজ্যুয়ালাইজ করা যেতে পারে। গ্রাফ তত্ত্ব হল গণিতের একটি শাখা যা নেটওয়ার্ক কাঠামো এবং বৈশিষ্ট্যগুলি বুঝতে সাহায্য করার জন্য সরঞ্জাম সরবরাহ করে।
- আপনি একটি প্রোগ্রামিং ভাষার প্রভাব গ্রাফ তৈরি করতে উইকিপিডিয়া থেকে ডেটা স্ক্র্যাপ করতে পাইথন ব্যবহার করেছেন। সংযোগের মাপকাঠি ছিল একটি প্রদত্ত ভাষা অন্যের নকশার উপর প্রভাব হিসাবে তালিকাভুক্ত ছিল কিনা৷ ৷
- Gephi এবং Sigma.js হল ওপেন সোর্স টুল যা আপনাকে নেটওয়ার্ক বিশ্লেষণ ও কল্পনা করতে দেয়। তারা আপনাকে ইমেজ, পিডিএফ বা ওয়েব ফর্ম্যাটে নেটওয়ার্ক রপ্তানি করার অনুমতি দেয়।
পড়ার জন্য ধন্যবাদ — আমি আপনার কোন মন্তব্য বা প্রশ্নের জন্য অপেক্ষা করছি! গ্রাফ তত্ত্ব সম্পর্কে আরও জানার জন্য একটি চমত্কার সম্পদের জন্য, Albert-László Barabási-এর ইন্টারেক্টিভ অনলাইন বইটি দেখুন৷
এই টিউটোরিয়ালের সম্পূর্ণ কোড এখানে পাওয়া যাবে।