জ্যফি এবং সিগমা.জেএস দিয়ে নেটওয়ার্ক ভিজ্যুয়ালাইজেশন টিউটোরিয়াল
আজ আমরা যা তৈরি করব তার প্রিভিউ: প্রোগ্রামিং ল্যাঙ্গুয়েজ ইনফ্লুয়েন্স গ্রাফ। ২৫০টিরও বেশি প্রোগ্রামিং ল্যাঙ্গুয়েজের "ডিজাইন ইনফ্লুয়েন্স" সম্পর্ক গভীরভাবে জানার জন্য লিঙ্কটি দেখুন!
আপনার পালা!
আজকের হাইপার-কানেক্টেড বিশ্বে, নেটওয়ার্ক আধুনিক জীবনের সর্বত্রব্যাপী দিক।
আমার আজকের দিনের শুরুটি নিই — আমি লন্ডনের পরিবহন নেটওয়ার্ক ব্যবহার করে শহরে এলাম। তারপর আমার প্রিয় কফি শপের একটি শাখা-এ গিয়ে তাদের ওয়ায়-ফায় নেটওয়ার্ক-এ আমার ক্রোমবুক কানেক্ট করলাম। এরপর আমি যেসব সোশ্যাল নেটওয়ার্কিং সাইটে ঘুরে থাকি সেগুলোতে লগ ইন করলাম।
গত কয়েক দশকের সবচেয়ে প্রভাবশালী কোম্পানিগুলোর সাফল্যের পেছনে নেটওয়ার্কের শক্তি আছে, এটি আর গোপন নয়।
ফেসবুক, টুইটার, ইনস্টাগ্রাম, লিংকডইন এবং অন্যান্য সোশ্যাল মিডিয়া প্ল্যাটফর্ম সোশ্যাল নেটওয়ার্কের স্মল-ওয়ার্ল্ড বৈশিষ্ট্যের ওপর নির্ভর করে। এটা তাদের ব্যবহারকারীদের একে অপরের সাথে (এবং বিজ্ঞাপনদাতাদের সাথে) কার্যকরভাবে সংযুক্ত করতে সাহায্য করে।
গুগলের বর্তমান সাফল্যের অনেকটাই তাদের সার্চ ইঞ্জিন মার্কেটে প্রাথমিক প্রভাবশালিতার فضل — যা আংশিকভাবে তাদের পেজ র্যাঙ্ক নেটওয়ার্ক অ্যালগরিদমের সাহায্যে প্রাসঙ্গিক ফলাফল ফেরত দেওয়ার ক্ষমতার কারণে সম্ভব হয়েছে।
অ্যামাজনের দক্ষ ডিস্ট্রিবিউশন নেটওয়ার্ক তাদের কিছু বড় শহরে সেম-ডে ডেলিভারি অফার করতে সক্ষম করে।
নেটওয়ার্ক কৃত্রিম বুদ্ধিমত্তা এবং মেশিন লার্নিং-এর মতো ক্ষেত্রেও অত্যন্ত গুরুত্বপূর্ণ। নিউরাল নেটওয়ার্ক গবেষনার একটি খুব সক্রিয় ক্ষেত্র। কম্পিউটার ভিশনে অপরিহার্য অনেক ফিচার ডিটেকশন অ্যালগরিদম ছবির বিভিন্ন অংশ মডেল করতে নেটওয়ার্কের ওপর ভরপুর নির্ভর করে।
বৈজ্ঞানিক ঘটনার একটি وسیع পরিসরও নেটওয়ার্ক মডেলের মাধ্যমে বোঝা যাবে। এতে কোয়ান্টাম মেকানিক্স, বায়োকেমিক্যাল পথ, এবং পশুবিজ্ঞান ও সামাজিক-আর্থিক ব্যবস্থা অন্তর্ভুক্ত।
তবে, তাদের অবিচ্ছেদ্য গুরুত্ব দেওয়া সত্ত্বেও, আমরা নেটওয়ার্ক এবং তাদের বৈশিষ্ট্যগুলোকে কীভাবে আরও ভালোভাবে বুঝতে পারি?
নেটওয়ার্কের গাণিতিক অধ্যয়নকে "গ্রাফ থিওরি" নামে ডাকা হয়, এবং এটি গণিতের আরও সহজ শাখাগুলোর একটি। এই আর্টিকেলটি কম বা বেশি কোনো पूर्व জ্ঞান বা অভিজ্ঞতা ধরে একটি পরিচিতি দিতে লক্ষ্যবদ্ধ।
আমরা পাইথন ৩.এক্স এবং জ্যফি নামে একটি অসাধারণ ওপেন-সোর্স সফটওয়্যার ব্যবহার করে অতীত ও বর্তমানের প্রোগ্রামিং ল্যাঙ্গুয়েজের মধ্যে কীভাবে প্রভাবের মাধ্যমে সংযোগ রয়েছে তার একটি নেটওয়ার্ক ভিজ্যুয়ালাইজেশন তৈরি করব।
তবে প্রথমে…
নেটওয়ার্ক আসলে কী?
উপরোক্ত উদাহরণগুলো আমাদের কিছু সংকেত দেয়। পরিবহন নেটওয়ার্ক গন্তব্যগুলোর সাথে রুট দ্বারা সংযুক্ত। সোশ্যাল নেটওয়ার্ক ব্যক্তিগুলোর সাথে তাদের পারস্পরিক সম্পর্ক দ্বারা সংযুক্ত। গুগলের সার্চ ইঞ্জিন অ্যালগরिदম ওয়েবপেজগুলোর "র্যাঙ্ক" মূল্যায়ন করে যেসব পেজ অন্যদের तरफ লিংক দিয়েছে সেগুলো দেখে।
বিস্তৃতভাবে, একটি নেটওয়ার্ক হলো এমন যেকোনো সিস্টেম যা নোড এবং এজ, বা সাধারণ ভাষায় "বিন্দু এবং রেখা" এর মাধ্যমে বর্ণনা করা যায়।

কিছু সিস্টেম সহজেই এই রকমে অ্যাবস্ট্রাক্ট করা যায়। সোশ্যাল নেটওয়ার্ক সম্ভবত সবচেয়ে স্পষ্ট উদাহরণ। কম্পিউটার ফাইল সিস্টেম আরেকটি — ফোল্ডার এবং ফাইল তাদের "পেরেন্ট" এবং "চাইল্ড" সম্পর্ক দ্বারা লিংক করা থাকে।
কিন্তু নেটওয়ার্কের আসল শক্তি এই কথায় যে অনেক অনেক সিস্টেম নেটওয়ার্কের শর্তে অ্যাবস্ট্রাক্ট এবং মডেল করা যায়, এমনকি প্রথমে স্পষ্ট না হলে ও।
নেটওয়ার্কের রিপ্রেজেন্টেশন
নেটওয়ার্ককে গাণিতিকভাবে বিশ্লেষণ এবং বর্ণনা করতে হলে পেন-এন্ড-পেপার স্কেচের একটু ওপর যেতে হবে। বিন্দু এবং রেখার ছবিগুলোকাকে আমরা কীভাবে সংখ্যায় রূপান্তর করব যাতে সেগুলো কাঙ্ক্ষিত?
একটি সমাধান হলো একটি সন্নিহিত ম্যাট্রিক্স तैयार করা যাতে আমাদের নেটওয়ার্ক রিপ্রেজেন্ট করা যায়।
ম্যাট্রিক্স হলো একো ধারণা যা একটু ভয়ঙ্কর লাগতে পারে আপনি আপনার সাথে পরিচিত না হলে, কিন্তু ভয় পাওয়ার কিছু নেই। সেগুলো সংখ্যার গ্রিড হিসাবে চিন্তা করুন যেগুলো একসাথে অনেক গাণনা করতে ব্যবহার করা যায়। নিচে একটি উদাহরণ দেওয়া হলো:
Python Java Scala C# Python 0 1 0 0 Java 0 0 0 1 Scala 0 1 0 0 C# 0 1 0 0
এই ম্যাট্রিক্সে, প্রতিটি সারি এবং কলামের ছেদে ০ বা ১ থাকে, যথাক্রমে সংশ্লিষ্ট ভাষাগুলো লিংক করা আছে কিনা তার ওপর নির্ভর করে। আপনি উপরের চিত্রের সাথে এটি যাচাই করতে পারেন!
অधিকাংশ উদ্দেশ্যে, সন্নিহিত ম্যাট্রিক্স একটি নেটওয়ার্ককে গাণিতিকভাবে রিপ্রেজেন্ট করার একটি ভালো পদ্ধতি। কিন্তু কম্পিউটেশনাল দৃষ্টিকোণ থেকে, এটি কখনও কখনও ক্লান্তিকর হতে পারে।
উদাহরণস্বরূপ, একটি সাধারণ সংখ্যক নোডহলেও (মান लीজিয়ে ১০০০), ম্যাট্রিক্সে অনেক বড় সংখ্যক উপাদান থাকবে (যেমন ১০০০² = ১,০০০,০০০)।
বাস্তব জগতের অনেক সিস্টেম বিরল নেটওয়ার্ক তৈরি করে। এই নেটওয়ার্কগুলোতে, অধিকাংশ নোড শুধু অন্যদের একটি ছোট অংশের সাথে সংযুক্ত থাকে।
যদি আমরা ১০০০-নোডের একটি বিরল নেটওয়ার্ক কম্পিউটার মেমরিতে সন্নিহিত ম্যাট্রিক্স হিসেবে রিপ্রেজেন্ট করি, তাহলে ১,০০০,০০০ বাইট ডেটা র্যামে স্টোর থাকবে। অধিকাংশ শূন্য হবে। এটাকে আরও দক্ষতার সাথে করার কোনো উপায় থাকতে হয়।
বিকল্প পদ্ধতি হলো এজ লিস্ট ব্যবহার করা। এগুলো ঠিক সেই নামে পরিচিত। এগুলো শুধু কোন নোড জোড়া একে অপরের সাথে লিংক করা আছে তার একটি তালিকা।
উদাহরণস্বরূপ, উপরের প্রোগ্রামিং ভাষা নেটওয়ার্কটি নিম্নরূপ রিপ্রেজেন্ট করা যায়:
Java, Python Java, Scala Java, C# C#, Java
বড় নেটওয়ার্কের জন্য, এটি রিপ্রেজেন্ট করার অনেক বেশি কম্পিউটেশনালি দক্ষ পদ্ধতি। অবশ্যই এজ লিস্ট থেকে সন্নিহিত ম্যাট্রিক্স তৈরি করা সম্ভব (এবং বিপরীতটিও)। আমাদের একটিই বেছে নেওয়া বাধ্যতামূলক নয়।
নেটওয়ার্ক রিপ্রেজেন্ট করার আরেকটি উপায় হলো সন্নিহিত লিস্ট। এতে প্রতিটি নোডের পরে সেটি যেসব নোডের সাথে লিংক করা আছে সেগুলো লিস্ট করা হয়। উদাহরণস্বরূপ:
Java: Python, Scala, C# C#: Java
ডেটা সংগ্রহ, সংযোগ তৈরি
যেকোনো নেটওয়ার্ক মডেল এবং ভিজ্যুয়ালাইজেশন শুধু ততটাই ভালো হবে যতটাই ভালো ডেটা ব্যবহার করে এটি নির্মিত হয়েছে। এর মানে, ডেটা যথার্থ এবং সম্পূর্ণ নিশ্চিত করার পাশাপাশি, আমাদের নোডগুলোর মধ্যে এজ অনুমান করার একটি উপায় যৌক্তিক করতে হবে।
অনেক ক্ষেত্রে, এটি সর্বाधিক গুরুত্বপূর্ণ ধাপ। নেটওয়ার্ক সম্পর্কে পরবর্তী যেকোনো বিশ্লেষণ এবং অনুমান "লিঙ্কেজ κριটেরিয়া"কে যৌক্তিক করতে পারার ওপর নির্ভর করে।
উদাহরণস্বরূপ, সোশ্যাল নেটওয়ার্ক বিশ্লেষণে, আপনি লোকেদের সোশ্যাল মিডিয়ায় একে অপরের ফলো করলে লিংক করতে পারেন। আণবিক জীববিজ্ঞানে, আপনি জিনগুলো তাদের কো-এক্সপ্রেশনের ওপর ভিত্তি করে লিংক করতে পারেন।
অনেকসময়, নোড লিংক করার পদ্ধতিটি এজগুলোর ওজন নির্ধারণ করার অনুমতি দেয়, যা "শক্তি" নির্দেশ করে।
উদাহরণস্বরূপ, অনলাইন রিটেলের প্রেক্ষাপটে, আপনি প্রোডাক্টগুলো কতবার একসাথে কেনা হয়েছে তার ওপর ভিত্তি করে লিংক করতে পারেন। যেসব প্রোডাক্ট ঘন ঘন একসাথে কেনা হয়েছে সেগুলো যেসব প্রোডাক্ট কখনও কখনও একসাথে কেনা হয়েছে তাদের চেয়ে বেশি ওজনযুক্ত এজ দ্বারা লিংক করা থাকবে। যেসব প্রোডাক্ট কেবল তদবিরত একসাথে কেনা হয়েছে সেগুলো কোনোভাবে লিংক করা থাকবে না।
আপনি কল্পনা করতে পারেন, নোডগুলোক একে অপরের সাথে লিংক করার পদ্ধতিগুলো আপনার ইচ্ছা মতো সোফিস্টিকেটেড হতে পারে।
তবে, এই টিউটোরিয়ালের জন্য আমরা প্রোগ্রামিং ভাষা সংযোগ করার একটি সহজ পদ্ধতি ব্যবহার করব। আমরা উইকিপিডিয়ার নির্ভুলতার ওপর নির্ভর করব।
আমাদের উদ্দেশ্যে এটি ঠিক থাকবে। উইকিপিডিয়ার সাফল্য প্রমাণ করে যে সেটি অবশ্যই কিছু ঠিক করছে। আর্টিকেল লেখার ওপেন-সোর্স, সহযোগিতামূলক পদ্ধতি নিশ্চিত করে কিছু মাত্রা নিরপেক্ষতা।
এছাড়া, এর tương對ভাবে কনসিস্টেন্ট পেজ স্ট্রাকচার এটি ওয়েব-স্ক্র্যাপিং টেকনিক চেষ্টা করার জন্য একটি সুবিধাজনক প্লে-গ্রাউন্ড করে তোলে।
আরেকটি বোনাস হলো ব্যাপক, ভালো ডকুমেন্টেড উইকিপিডিয়া API, যা তথ্য পুনরুদ্ধারকে আরও সহজ করে তোলে। চলুন শুরু করি।
স্টেপ ১ — জ্যফি ইনস্টল করা
জ্যফি লিনাক্স, ম্যাক এবং উইন্ডোজে উপলব্ধ। এখান থেকে ডাউনলোড করুন।
এই প্রজেক্টের জন্য, আমি লুবুন্টু ব্যবহার করছি। আপনি উবুন্টু/ডেবিয়ানে থাকলে, জ্যফি চালু করার জন্য নিচের ধাপগুলো ফলো করুন। অন্যথায়, ইনস্টলেশন প্রক্রিয়া সম্ভবত আপনার পরিচিত যেকোনো পদ্ধতির মতোই হবে।
আপনার সিস্টেমের জন্য জ্যফির লেটেস্ট ভার্সন (লেখা সময়ে এটি v0.9.1 ছিল) ডাউনলোড করুন। রেডি হলে, ফাইলগুলো এক্সট্রাক্ট করুন।
cd Downloads tar -xvzf gephi-0.9.1-linux.tar.gz cd gephi-0.9.1/bin ./gephi
আপনাকে জাভা জিআরই-এর ভার্সন চেক করতে হতে পারে। জ্যফি একটি সাম্প্রতিক ভার্সন চায়। আমার তুলনামূলকভাবে নতুন লুবুন্টু ইনস্টলেশনে, আমি সিম্পলি ডিফল্ট-জিআরই ইনস্টল করলাম, এবং সেখান থেকে সবকিছু কাজ করল।
apt install default-jre ./gephi
আপনি শুরু করার জন্যเตতäা হওয়ার আগে একটু ধাপ বাকি। গ্রাফটি ওয়েবে এক্সপোর্ট করতে, আপনি জ্যফির জন্য সিগমা.জেএস প্লাগইন ব্যবহার করতে পারেন।
জ্যফির মেনু বার থেকে, "টুলস" অপশন বেছে নিন, এবং "প্লাগইনস" সিলেক্ট করুন।
"অভেইলেবল প্লাগইনস" ট্যাবে ক্লিক করুন এবং "SigmaExporter" সিলেক্ট করুন (আমি JSON এক্সপোর্টারও ইনস্টল করেছিলাম, কারণ এটি আরেকটি ব্যবহারী প্লাগইন)।
"ইনস্টল" বাটনে ক্লিক করুন এবং প্রক্রিয়াটি पूरा করুন। একবার হলে জ্যফি রিস্টার্ট করুন।
স্টেপ ২ — পাইথন স্ক্রিপ্ট লিখা
এই টিউটোরিয়ালে পাইথন ৩.এক্স এবং কিছু মডিউল ব্যবহার করা হবে যা জীবন সহজ করবে। পিপ মডিউল ইনস্টলার ব্যবহার করে নিচের কমান্ড চালান:
pip3 install wikipedia
এখন, একটি নতুন ডিরেক্টরিতে, script.py নামে একটি ফাইল তৈরি করুন, এবং আপনার প্রিয় কোড এডিটর/আইডিইতে খুলুন। নিচে মূল লজিকের আউटलাইন দেওয়া হলো:
- প্রথমে, আপনাকে অন্তর্ভুক্ত করার জন্য প্রোগ্রামিং ভাষার একটি তালিকা প্রয়োজন।
- এরপর, সেই তালিকায় যান এবং সম্পর্কিত উইকিপিডিয়া আর্টিকেলের HTML রিট্রিভ করুন।
- এটি থেকে, প্রতিটি ভাষা যেসব ভাষাকে প্রভাবিত করেছে তার একটি তালিকা বের করুন। এটি আমাদের রফ-এন্ড-রেডি লিঙ্কেজ κριটেরিয়া হবে।
- এছাড়া, প্রতিটি ভাষা সম্পর্কে কিছু মেটাডেটা সংগ্রহ করলে ভালো হতো।
- শেষে, আপনি সংগ্রহ করা সব ডেটা একটি .csv ফাইলে লিখতে চান।
পূর্ণ স্ক্রিপ্ট এই গিস্টে পাওয়া যাবে।
কিছু মডিউল ইম্পোর্ট করুন
script.py-তে, কিছু মডিউল ইম্পোর্ট করুন যা কাজগুলো সহজ করবে:
import csv import wikipedia import urllib.request from bs4 import BeautifulSoup as BS import re
ঠিক আছে — নোড অন্তর্ভুক্ত করার একটি তালিকা তৈরি করুন। এখানে উইকিপিডিয়া মডিউল বড় উপকারী। এটি উইকিপিডিয়া API অ্যাক্সেস করা সুপার-সহজ করে দেয়।
নিচের কোড যোগ করুন:
pageTitle = "List of programming languages" nodes = list(wikipedia.page(pageTitle).links) print(nodes)
আপনি এই স্ক্রিপ্টটি সেভ এবং রান করলে, আপনি দেখবেন এটি "List of programming languages" উইকিপিডিয়া আর্টিকেল থেকে সব লিংক প্রিন্ট করে। চমৎকার!
তবে, স্বয়ংক্রিয়ভাবে সংগৃহীত যেকোনো ডেটা ম্যানুয়ালি ইনস্পেক্ট করা সবসময় বুদ্ধিমানের কাজ। দ্রুত একটা নজর দিলেই দেখা যাবে, প্রকৃত প্রোগ্রামিং ভাষার পাশাপাশি, স্ক্রিপ্টটি কিছু অতিরিক্ত লিংকও বের করেছে।
উদাহরণস্বরূপ, আপনি "List of markup languages", "Comparison of programming languages" এবং অন্যান্য দেখতে পেতে পারেন।
যদিও জ্যফি আপনাকে নোড রিমুভ করতে দেয় যেগুলো আপনি অন্তর্ভুক্ত করতে চান না, তবে আগাম শুধুই ডেটা "ক্লিন" করলে পরে সময় বাঁচাবে।
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 ধরুন
প্রথম ফাংশনটি বিউটিফুলসুপ মডিউল ব্যবহার করে প্রতিটি ভাষার উইকিপিডিয়া পেজের HTML ধরতে।
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
এই ফাংশনটি urllib.request মডিউল ব্যবহার করে "https://en.wikipedia.org/wiki/" + "programming language" এড্রেসের পেজের HTML ধরতে।
তারপর এটি বিউটিফুলসুপে পাস করা হয়, যা HTML পাড়ে এবং পার্স করে একটি অবজেক্ট তৈরি করে যেটি আমরা ইনফরমেশন খুঁজতে ব্যবহার করতে পারি।
এরপর, আপনার আগ্রহের HTML এলিমেন্ট বের করতে find_all() মেথড ব্যবহার করুন।
এখানে, এটি প্রতিটি প্রোগ্রামিং ভাষা আর্টিকেলের শীর্ষে সারাংশ টেবিল হবে। এগুলো কীভাবে চিহ্নিত করা যায়?
সহজ পদ্ধতিটি হলো প্রোগ্রামিং ভাষা পেজগুলোতে যান। সেখানে, আপনি ব্রাউজারের ডেভেলপার টুলস ব্যবহার করে আগ্রহের এলিমেন্টগুলো ইনস্পেক্ট করতে পারেন।
সারাংশ টেবিলটির HTML ট্যাগ <table> এবং CSS ক্লাস "infobox" এবং "vevent", তাই আপনি HTML-এ টেবিলটি চিহ্নিত করতে এগুলো ব্যবহার করতে পারেন।
আর্গুমেন্টগুলো দিয়ে সপসIFY করুন:
"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 অবজেক্ট আর্গুমেন্ট হিসেবে নেয়, এবং বিউটিফুলসুপের get_text() ফাংশন ব্যবহার করে একটি স্ট্রিং তৈরি করে।
পরবর্তী ধাপ হলো year নামে একটি সাবস্ট্রিং তৈরি করা। এটি শব্দ "appear"-এর প্রথম আবির্ভাবের পর ৩০ ক্যারেক্টার নেয়। এই স্ট্রিংটি ভাষা প্রথম প্রদর্শিত হওয়ার বছর ধারণ করা উচিত।
সिर्फ سالটি বের করতে, একটি রেগুলার এক্সপ্রেশন (কৃত্রিম re মডিউলের सौজন্যে) ব্যবহার করুন যেটি ১ থেকে ৩ এর মধ্যে যেকোনো ডিজিট দিয়ে শুরু হয় এবং তারপরে তিনটি ডিজিট থাকে সেগুলো ম্যাচ করবে।
re.match(r'.*([1-3][0-9]{3})',year)
এটি সফল হলে, ফাংশনটি year ইন্টিজার হিসেবে রিটার্ন করে। অন্যথায়, এটি একটি দুঃখদ "Could not determine" রিটার্ন করে। আপনি আরও মেটাডেটা স্ক্র্যাপ করতে চাইতে পারেন — যেন প্যারাডাইম, ডিজাইনার বা টাইপিং ডিসিপ্লিন।
লিংক সংগ্রহ
আপনার জন্য আরেকটি ফাংশন — এইবার, আপনি একটি প্রদত্ত ভাষার 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-এ স্টোর করা আছে।
উদাহরণস্বরূপ, Java 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 লিস্টে ও আছে, ["source,target"] ফর্মে একটি এলিমেন্ট edgeList-এ অ্যাপেন্ড করুন। এইভাবে, আপনি জ্যফিতে ফিড করার জন্য একটি এজ লিস্ট তৈরি করবেন।
ডিবাগিং উদ্দেশ্যে, 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
আপনি দেখবেন স্ক্রিপ্টটি এজ লিস্ট বিল্ড করার সময় প্রতিটি সোর্স-টার্গেট জোড়া প্রিন্ট করছে। নিশ্চিত করুন আপনার ইন্টারনেট কানেকশন স্থিতিশীল, এবং স্ক্রিপ্টটিجادু দেখানোর জন্য বসে থাকুন।
স্টেপ ৩ — জ্যফি দিয়ে গ্রাফ বিল্ডিং
আশা করি আপনি আগে জ্যফি ইনস্টল এবং রান করে ফেলেছেন। এখন আপনি একটি নতুন প্রজেক্ট তৈরি করতে পারেন এবং সংগৃহীত ডেটা ব্যবহার করে একটি ডিরেক্টেড গ্রাফ বানাতে পারেন। এটি দেখাবে কীভাবে বিভিন্ন প্রোগ্রামিং ভাষা একে অপরে প্রভাব ফেলেছে!
জ্যফিতে একটি নতুন প্রজেক্ট তৈরি করে শুরু করুন, এবং "ডেটা ল্যাবরেটরি" ভিউতে স্যুইচ করুন। এটি জ্যফিতে ডেটা হ্যান্ডলিং-এর জন্য একটি স্প্রেডশিট-লাইক ইন্টারফেস দেয়। প্রথম কাজ হলো এজ লিস্ট ইম্পোর্ট করা।
- "ইম্পোর্ট স্প্রেডশিট" ক্লিক করুন।
- পাইথন স্ক্রিপ্ট দ্বারা জেনারেট করা
edge_list.csvফাইল বেছে নিন। নিশ্চিত করুন জ্যফি কমা সেপারেটর হিসেবে ব্যবহার করছে। - লিস্ট টাইপ থেকে "Edge List" বেছে নিন।
- "Next" ক্লিক করুন এবং চেক করুন যে আপনি সোর্স এবং টার্গেট কলাম দুটোই স্ট্রিং হিসেবে ইম্পোর্ট করছেন।
এটি ডেটা ল্যাবে নোডের একটি লিস্ট আপডেট করবে। এখন, metadata.csv ফাইল ইম্পোর্ট করুন। এইবার, লিস্ট টাইপ থেকে "Nodes list" বেছে নিন।
"প্রিভিউ" ট্যাবে স্যুইচ করুন, এবং দেখুন নেটওয়ার্কটি কেমন দেখাচ্ছে।
আহ… এটি একটু… মনোক্রোম। আর গুলগুলি। 마치 স্প্যাঘেটির একটি প্লেটের মতো। এটা ঠিক করি।
এটাকে সুন্দর করুন
প্রেজেন্টেশনে কাজ করার সব ধরনের উপায় আছে, এবং এখানে একটু সৃষ্টিশীল স্বাধীনতা আসে। নেটওয়ার্ক ভিজ্যুয়ালাইজেশনের সাথে, মূলত তিনটি বিষয় বিবেচনা করতে হয়:
- পজিশনিং নেটওয়ার্কের জন্য লে আউট প্যাটার্ন জেনারেট করার বেশ কিছু অ্যালগরিদম আছে। একটি জনপ্রিয় পছন্দ হলো ফ্রুচ্টারম্যান-রেইনগোল্ড অ্যালগরিদম, যা জ্যফিতে উপলব্ধ।
- সাইজিং গ্রাফে নোডের আকার কিছু দিলচস্প বৈশিষ্ট্য রিপ্রেজেন্ট করতে ব্যবহার করা যায়। প্রায়শই, এটি একটি সেন্ট্রালিটি মেজার। সেন্ট্রালিটি মাপার অনেক পদ্ধতি আছে, কিন্তু সকলই নেটওয়ার্কের বাকি অংশের সাথে কতটা ভালোভাবে সংযুক্ত একটি প্রদত্ত নোড তার মাধ্যমে সেই নোডের "গুরুত্ব" প্রতিফলিত করে।
- কালারিং একটি নোডের কিছু বৈশিষ্ট্য দেখাতে রঙ ব্যবহার করা যেতে পারে। প্রায়শই, রঙ কমিউনিটি স্ট্রাকচার ইন্ডিকেট করতে ব্যবহার করা হয়। এটি ব্যাপকভাবে ডিফাইন করা হয় "নোডের একটি গ্রুপ যারা গ্রাফের বাকি অংশের চেয়ে একে অপরের সাথে বেশি সংযুক্ত"। একটি সোশ্যাল নেটওয়ার্কে, এটি বন্ধুত্ব, পারিবারিক বা পেশাদার গ্রুপ প্রকাশ করতে পারে। কমিউনিটি স্ট্রাকচার ডিটেক্ট করার বেশ কিছু অ্যালগরিদম আছে। জ্যফি লুভেইন মেথড বিল্ট-ইন দিয়ে আসে।
এই পরিবর্তনগুলো করতে, আপনাকে কিছু স্ট্যাটিস্টিক্যাল ক্যালকুলেট করতে হবে। "ওভারভিউ" উইন্ডোতে স্যুইচ করুন। এখানে আপনি ডান পাশে একটি প্যানেল দেখবেন। এতে একটি "স্ট্যাটিস্টিক্স" ট্যাব থাকা উচিত। এটি খুলুন, এবং আপনি বিকল্পের একটি রেঞ্জ দেখবেন।
জ্যফি অনেক বিল্ট-ইন স্ট্যাটিস্টিক্যাল ক্যাপাবিলিটি দিয়ে আসে। প্রতিটির জন্য, "Run" ক্লিক করলে একটি রিপোর্ট জেনারেট হবে যা নেটওয়ার্ক সম্পর্কে অন্তর্দৃষ্টি দেবে।
কিছু útil কাজেরстатистиক:
- গড় ডিগ্রি গড় ভাষা প্রায় চারটি অন্য ভাষার সাথে সংযুক্ত। রিপোর্টটি একটি ডিগ্রি ডিস্ট্রিবিউশন গ্রাফও দেখায়। এটি প্রকাশ করে অধিকাংশ ভাষার খুব কম সংযোগ আছে, যখন একটু ভাষার অনেক সংযোগ আছে। এটি ইঙ্গিত করে যে এটি একটি স্কেল-ফ্রি নেটওয়ার্ক। স্কেল-ফ্রি নেটওয়ার্ক ওপর বহু গবেষণা হয়েছে, এবং এগুলো জেনারেট করার প্রক্রিয়া ওপর।
- ডায়ামিটার এই নেটওয়ার্কের ডায়ামিটার ১২ — অর্থাৎ যেকোনো দুটি ভাষার মধ্যে "সবচেয়ে বড়" সংযোগের সংখ্যা ১২। গড় পথের দৈর্ঘ্য প্রায় চার। এর মানে, গড়ভাবে, যেকোনো দুটি ভাষা চারটি এজ দ্বারা পৃথক। এই ফিগারগুলো নেটওয়ার্কের "সাইজ" এর একটি মাপ দেয়।
- মডুলারিটি এটি একটি স্কোর যা দেখায় নেটওয়ার্কটি কতটুকু "কম্পার্টমেন্টালাইজড"। এখানে, মডুলারিটি স্কোর প্রায় ০.৫৩। এটি তুলনামূলকভাবে উচ্চ, যা ইঙ্গিত দেয় এই নেটওয়ার্কে স্বতন্ত্র মডিউল রয়েছে। আবারও, এটি অন্তর্নিহিত সিস্টেম সম্পর্কে কিছু দিলচস্প কথা বোঝায়। ভাষা স্পষ্ট "ইনফ্লুয়েন্স গ্রুপ"-এ পড়ে।
যাইহোক, নেটওয়ার্কের চেহারা মডিফাই করতে, বাম প্যানেলে যান।
"Layout" ট্যাবে, আপনি কোন লে আউট অ্যালগরিদম ব্যবহার করতে চান সেটি সিলেক্ট করতে পারেন। "Run" হিট করুন এবং রিয়েল-টাইমে গ্রাফটি শিফট होते দেখুন! দেখুন কোন লে আউট অ্যালগরিদম আপনাকে ভালো লাগে।
Layout ট্যাবের উপরে "Appearance" ট্যাব আছে। এখানে, আপনি নোড এবং এজের রঙ, আকার এবং লেবেলের বিভিন্ন সেটিং দিয়ে এক্সপেরিমেন্ট করতে পারেন। এগুলো অ্যাট্রিবিউটের ওপর ভিত্তি করে কনফিগার করা যায় (যে স্ট্যাটস আপনি জ্যফি থেকে ক্যালকুলেট করবেন সেটিও)।
একটি সাজেশন হিসেবে, আপনি:
- নোডগুলোর রঙ তাদের মডুলারিটি অ্যাট্রিবিউট দিয়ে করুন। এটি তাদের কমিউনিটি সদস্যতা অনুযায়ী রঙিন করে।
- নোডগুলোর আকার তাদের ডিগ্রি দিয়ে করুন। ভালো সংযুক্ত নোডগুলো কম সংযুক্ত নোডগুলোর চেয়ে বড় দেখাবে।
তবে, আপনাকে এক্সপেরিমেন্ট করতে হবে এবং আপনার পছন্দমত লে আউট বের করতে হবে।
একবার আপনি আপনার গ্রাফের চেহারার সাথে খুশি হলে, চূড়ান্ত ধাপে যাওয়ার সময় — ওয়েবে এক্সপোর্ট!
স্টেপ ৪ — সিগমা.জেএস
আপনি ইতিমধ্যে একটি নেটওয়ার্ক ভিজ্যুয়ালাইজেশন বানিয়ে ফেলেছেন যা জ্যফিতে এক্সপ্লোর করা যায়। আপনি একটা স্ক্রিনশট নিতে পারেন, বা গ্রাফটি SVG, PDF বা PNG ফরম্যাটে সেভ করতে পারেন।
তবে, আপনি আগে সিগমা.জেএস প্লাগইন ইনস্টল করে থাকলে, কেন না গ্রাফটি HTML-এ এক্সপোর্ট করবেন? এটি একটি ইন্টারেক্টিভ ভিজ্যুয়ালাইজেশন তৈরি করবে जिसे আপনি অনলাইন হোস্ট করতে পারেন, বা গিটহাবে আপলোড করে অন্যদের সাথে শেয়ার করতে পারেন।
এটি করতে, জ্যফির মেনু বার থেকে "Export > Sigma.js template…" সিলেক্ট করুন।
প্রয়োজনীয় ডিটেইলগুলো পূরণ করুন। আপনি কোন ডিরেক্টরিতে প্রজেক্ট এক্সপোর্ট করবেন সেটি বেছে নিন। আপনি টাইটেল, লেজেন্ড, বর্ণনা, হোভার বিহেভিয়ার এবং অন্যান্য অনেক ডিটেইল চেঞ্জ করতে পারেন। রেডি হলে "OK" ক্লিক করুন।
এখন, আপনি যে ডিরেক্টরিতে প্রজেক্ট এক্সপোর্ট করেছেন সেখানে যান, আপনি সিগমা.জেএস দ্বারা জেনারেট করা সব ফাইল ধারণকারী একটি ফোল্ডার দেখবেন।
আপনার প্রিয় ব্রাউজারে index.html খুলুন। Ta-da! আপনার নেটওয়ার্ক! আপনি যদি একটু CSS এবং জাভাস্ক্রিপ্ট জানেন, আপনি জেনারেট করা বিভিন্ন ফাইলগুলিতে ডুবিয়ে আউটপুট আপনার ইচ্ছামত টви করতে পারেন।
এই টিউটোরিয়ালটি এখানেই সমाप्त!
সারসংক্ষেপ
- অনেক সিস্টেম নেটওয়ার্ক হিসেবে মডেল এবং ভিজ্যুয়ালাইজ করা যায়। গ্রাফ থিওরি গণিতের একটি শাখা যা নেটওয়ার্ক স্ট্রাকচার এবং বৈশিষ্ট্য বুঝতে টুলস প্রদান করে।
- আপনি পাইথন ব্যবহার করে উইকিপিডিয়া থেকে ডেটা স্ক্র্যাপ করে একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ ইনফ্লুয়েন্স গ্রাফ বানিয়েছেন। লিঙ্কেজ ক্রিটেরিয়া ছিল কি একটি প্রদত্ত ভাষা অন্য ভাষার ডিজাইনে প্রভাব ফেলেছে কিনা।
- জ্যফি এবং সিগমা.জেএস ওপেন-সোর্স টুলস যা আপনাকে নেটওয়ার্ক বিশ্লেষণ এবং ভিজ্যুয়ালাইজ করতে দেয়। এগুলো ইমেজ, PDF বা ওয়েব ফরম্যাটে নেটওয়ার্ক এক্সপোর্ট করতে দেয়।
পড়ার জন্য ধন্যবাদ — আপনার যেকোনো মন্তব্য বা প্রশ্নের জন্য তৎপর! গ্রাফ থিওরির ওপর আরও শিখতে চাইলে, অ্যালবার্ট-লászló বারাবাসির ইন্টারেক্টিভ অনলাইন বুকটি দেখুন।
এই টিউটোরিয়ালের পূর্ণ কোড এখানে পাওয়া যাবে।