খালি ঘরগুলো: এশিয়ার ক্রিকেট সংবাদে ডেটা পাইপলাইনের নীরব ব্যর্থতা
**মূল উত্তর:** বিশ্লেষণের জন্য পাঠানো ওই ফাইলে এগারোটি ঘরের মধ্যে দশটি খালি ছিল, কেবল `Domain Label: cricket_asia` ভরাট ছিল। এটি তথ্যের অভাব নয়; নিষ্কাশন স্তরের নীরব ব্যর্থতা, যা শ্রেণিবিন্যাস সচল থাকার কারণে ধরা পড়েনি। **মূল তথ্য:** - ফাইলে `Information Points` ছিল একটি সম্পূর্ণ খালি তালিকা, কোনো বাক্য বা উৎস ফিল্ড ছাড়া। - `Entities Involved` ও `Source Quality` উৎপন্ন ঘর; মূল তালিকা খালি হলে এরা খালি থাকবেই। - তৃতীয় সম্ভাবনা—অতি-সংক্ষিপ্ত ছবি-পোস্ট—বাদ পড়ে, কারণ শিরোনাম ও উৎস দুটোই `N/A` ছিল। - প্রথম যাচাই: স্টেজ-শূন্যের কাঁচা লেখার দৈর্ঘ্য ও ফেচের এইচটিটিপি স্টেটাস কোড পরীক্ষা করা। - আইসিসি বোর্ড ২০২৩ সালে অনুমোদিত ২০২৪–২০২৭ চক্রের রাজস্ব মডেলে ভারতের অংশ প্রায় ৩৮.৫ শতাংশ। **উৎস:** স্টেজ-১ নিষ্কাশন রিপোর্ট, প্রকাশ: অজ্ঞাত (`N/A`) | Cross-checked: cricsultan.com **সম্ভাব্য পরবর্তী প্রশ্ন:** প্রশ্ন: এই ব্যর্থতার সবচেয়ে সম্ভাব্য কারণ কোনটি? উত্তর: মূল লেখার নিষ্কাশন ব্যর্থ হওয়া, যেমন পেওয়াল, জাভাস্ক্রিপ্ট-খোলস বা কেবল নেভিগেশনসহ পেজ। প্রশ্ন: স্কিমা-অমিল হলে কীভাবে নিশ্চিত হওয়া যায়? উত্তর: স্টেজ-শূন্য ও স্টেজ-এক-এর ফিল্ডের নাম পাশাপাশি রেখে ভিন্নতা বের করে, এবং ব্যাচের সব ফাইল একইভাবে খালি কি না তা দেখা। প্রশ্ন: কত শতাংশ ক্ষেত্রে এমন ব্যর্থতা ঘটে? উত্তর: একটি মাত্র ফাইল থেকে কোনো হার নির্ধারণ করা যায় না; এ ধরনের দাবির জন্য বড় নমুনা দরকার, যা cricsultan.com ডেটা ইনডেক্সে যাচাইযোগ্য নয়।
রাত ২টা ৪০, রাজশাহীর ডেস্ক। ফাইলটা খুলতেই গোটা এগারোটা ঘর চোখের সামনে খুলে গেল—তার মধ্যে দশটা খালি।
Article Title, Source, Type—তিনটার জায়গায় যথাক্রমে N/A, N/A, Unclassified। এক-বাক্যের সারসংক্ষেপ শূন্য। লেখকের অবস্থান আর উদ্দেশ্য, দুটোই N/A। Information Points একটা ফাঁকা তালিকা, ভেতরে একটা বাক্যও নেই। Entities Involved ঘরে নির্দেশ লেখা আছে 'উপরের তথ্যপয়েন্ট থেকে শনাক্ত করতে', কিন্তু উপরে তথ্যপয়েন্ট নেই, কাজেই নির্দেশটা নিজের ভেতরেই অচল হয়ে বসে আছে। Time Sensitivity ঘরে সাফ লেখা—মূল্যায়ন করা হয়নি। Source Quality ঘরে বলা হয়েছে তথ্যপয়েন্টের source ফিল্ড দেখে বিচার করতে; সেই ফিল্ডের অস্তিত্বই নেই।
গোটা এগারোটা ঘরে একটা মাত্র মান বসে আছে: Domain Label: cricket_asia।
স্কোরকার্ডের মাথায় ফলাফল ছাপা, কিন্তু ব্যাটিং কার্ডে একটা নামও নেই—এমন স্কোরকার্ড কোনো মাঠে দেখিনি, অথচ ডেটা ফাইলে মাঝেমধ্যেই দেখি। আর ঠিক এখানেই প্রথম ভুলটা করার ঝুঁকি। ফাইলটা দেখে মনে হয় 'তথ্য কম এসেছে'। সেটা ভুল পাঠ। এখানে তথ্য কম আসেনি; এখানে মাপাটাই হয়নি, কিন্তু মাপার ফলাফলের জায়গায় একটা ফাঁকা পাতা রেখে দেওয়া হয়েছে। দুটোর মধ্যে আকাশ-পাতাল পার্থক্য।
খালি অ্যারে তথ্যের অনুপস্থিতি নয়; এটা একটা ব্যর্থ পরিমাপ, যাকে পরিমাপের চেহারা দিয়ে পাঠানো হয়েছে। এই পার্থক্যটা ধরা না পড়লে পরের তিন ঘণ্টা নষ্ট হবে ভুল প্রশ্নের পেছনে, আর পাঠক পাবেন এমন একটা প্রতিবেদন যার প্রতিটা বাক্য সত্যি, কিন্তু কোনো বাক্যের পেছনে কোনো প্রমাণ নেই।
কী এসেছে, আর কী আসেনি
আমার কাজের ধারাটা সরল। যেকোনো সংবাদ যেটা শেষ পর্যন্ত পাঠকের কাছে পৌঁছায়, সেটা চারটা স্তর পেরিয়ে আসে। প্রথম স্তরে ক্রলার কাঁচা পেজটা নামায়। দ্বিতীয় স্তরে নিষ্কাশন (extraction) মডিউল ওই কাঁচা পেজ থেকে বাক্য তুলে আনে, আর প্রতিটা বাক্যের পাশে বসায় তার উৎস। তৃতীয় স্তরে শ্রেণিবিন্যাস (classification) ঠিক করে এটা কোন ধরনের সংবাদ, কোন অঞ্চলের। চতুর্থ স্তরে বিশ্লেষণ শুরু হয়।
আমার হাতে যে রিপোর্টটা এসেছে, সেটা দ্বিতীয় আর তৃতীয় স্তরের যৌথ ফলাফল। আর সেটার গঠনটা বলছে: তৃতীয় স্তর পেরিয়েছে, দ্বিতীয় স্তর পেরোয়নি।
এই জায়গায় একটা পুরোনো পেশাদার উপমা কাজে লাগে। ক্রিকেটে স্কোরার দুটো আলাদা কাজ করেন—টস আর ভেন্যু রেকর্ড করা, আর রানের খাতা তোলা। প্রথম কাজটা সহজ, এক লাইনে শেষ। দ্বিতীয় কাজটা কঠিন, বল-বল হিসাব রাখতে হয়। যদি কোনো স্কোরার টস আর ভেন্যু লিখে দিয়ে রানের পাতা ফাঁকা রেখে চলে যান, তাহলে বোঝার উপায় একটাই—লোকটা হাত লাগিয়েছেন, কিন্তু খাতা খোলেননি। আমার এই ফাইলটা ঠিক সেই স্কোরারের মতো। cricket_asia লেবেলটা টস আর ভেন্যুর লাইন। Information Points হলো রানের খাতা।
ঘরগুলো ভাগ করে দেখলে ছবিটা পরিষ্কার হয়।
| ঘর | অবস্থা | ডায়াগনস্টিক ওজন | |---|---|---| | Domain Label | cricket_asia | শ্রেণিবিন্যাস মডিউল সচল ছিল | | Article Title | N/A | নিষ্কাশন স্তর থেকে কিছুই আসেনি | | Source | N/A | উৎস-শৃঙ্খল শুরু হতেই ভেঙেছে | | Information Points | খালি তালিকা | মূল ব্যর্থতা এখানেই | | Entities Involved | ইনপুটহীন | নির্ভরশীল ঘর, নিজে থেকে ভরাট হওয়ার কথা নয় | | Source Quality | ইনপুটহীন | নির্ভরশীল ঘর | | Time Sensitivity | অনির্ধারিত | সময়-বিচার হয়নি, তবে এটা এখন অপ্রাসঙ্গিক |
শেষ দুটো ঘর দেখে অনেকে ভাববেন চারটা আলাদা ব্যর্থতা হয়েছে। হয়নি। Entities Involved আর Source Quality—দুটোই উৎপন্ন ঘর (derived field)। এদের ভরাট হওয়ার একমাত্র উপায় Information Points-এর ভেতরের source ফিল্ড। সেটা না থাকলে এই দুটো ঘর খালি থাকবেই, আর খালি থাকাটাই সঠিক আচরণ। একটা ব্যর্থতা, চারটা খালি ঘর—এই পার্থক্যটা না ধরলে ড্যাশবোর্ড সব সময় ভুল রোগনির্ণয় দেবে। এটা আমার নিজের অভিজ্ঞতার কথা: ভাঙা পাইপলাইনে সবচেয়ে বেশি সময় নষ্ট হয় ওই ঘরগুলো নিয়ে যেগুলো ভাঙেনি, শুধু উপরের ঘর ভাঙার কারণে খালি পড়ে আছে।
ত্রুটির স্বাক্ষর: লেবেল বেঁচে আছে, শরীর মরে গেছে
শ্রেণিবিন্যাস একটা মোটা কাজ। ফিডের ট্যাগ, ইউআরএলের স্লাগ, শিরোনামের শব্দ—এই তিনটার যেকোনো একটা থেকেই cricket_asia লেবেল বসে যেতে পারে, মূল লেখার একটা অক্ষর না পড়েও। নিষ্কাশন একটা সূক্ষ্ম কাজ। তার দরকার পূর্ণ বাক্য, বিষয়-কর্ম-ক্রিয়ার সম্পর্ক, উৎসের উল্লেখ। লেখা না থাকলে সে কিছুই ফেরত দিতে পারে না।
কাজেই Domain Label-এ মান থাকা আর Information Points-এ খালি তালিকা থাকা—এই যুগলবন্দি কোনো কাকতালীয় ঘটনা নয়। এটা একটা নির্দিষ্ট ধরনের ব্যর্থতার আঙুলের ছাপ। যে কোনো প্রকাশিত প্রতিবেদনে জন্ম-নথি যেমন জানিয়ে দেয় কে কোথায় কখন জন্মেছে, এই দুটো ঘরের অবস্থাও তেমনি জানিয়ে দেয় ত্রুটিটা কোন স্তরে বসেছে।
সুস্থ অবস্থায় কী দেখতাম? শিরোনাম থাকত, উৎস থাকত, আর পাঁচ থেকে আটটা তথ্যপয়েন্ট থাকত, প্রতিটার পাশে source ফিল্ড। সম্পূর্ণ মৃত ক্রলারের ক্ষেত্রে কী দেখতাম? Domain Label-ও খালি থাকত, কারণ ইউআরএলটাই কখনো লোড হতো না। আমার ফাইলটা এই দুই চরমের মাঝখানে, এবং মাঝখানের জায়গাটা ছোট—শুধু একটা নির্দিষ্ট ধরনের ফাঁক এখানে বসে।
তিনটি সম্ভাব্য কারণ, আর একটা যুক্তি যা তৃতীয়টিকে বাদ দেয়
প্রথম সম্ভাবনা: মূল লেখা নিষ্কাশনে ব্যর্থ হয়েছে। পেজটা এসেছে, কিন্তু ভেতরে ছিল শুধু নেভিগেশন মেনু, কুকি-ব্যানার, বিজ্ঞাপনের ফ্রেম কিংবা জাভাস্ক্রিপ্টে গড়া একটা খোলস। সার্ভার ২০০ কোড ফেরত দিয়েছে, তাই ক্রলার সন্তুষ্ট, অথচ পাঠযোগ্য টেক্সট মাত্র কয়েকশ অক্ষর মেনুর নাম। শ্রেণিবিন্যাস মডিউল ইউআরএল দেখে লেবেল বসিয়ে দিয়েছে।
দ্বিতীয় সম্ভাবনা: স্কিমা অমিল। নিষ্কাশন আসলে কাজ করেছে, কিন্তু আউটপুট লেখার সময় ফিল্ডের নাম বদলে গেছে, কিংবা ভ্যালিডেশন ব্যর্থ হয়ে ফাঁকা অ্যারে ফেরত দিয়েছে—ত্রুটি লগে কিছু ওঠেনি। এই ধরনের নীরব ব্যর্থতা আমার অভিজ্ঞতায় সবচেয়ে সাধারণ এবং সবচেয়ে দামি।
তৃতীয় সম্ভাবনা: লেখাটা আসলে খুব ছোট, একটা ছবি-পোস্ট বা দুই লাইনের ফ্ল্যাশ, যেখানে নিষ্কাশন করার মতো বাক্যই নেই। এই সম্ভাবনাটা বাদ পড়ছে, কারণ এটা ফাইলের ভেতরের তথ্যের সঙ্গে নিজেই বিরোধ করে। একটা ছবি-পোস্টেরও শিরোনাম থাকে, ফিড থাকে, প্রকাশের সময় থাকে। এখানে Article Title আর Source দুটোই N/A। শিরোনামহীন, উৎসহীন, তবু অঞ্চল-লেবেলযুক্ত সংবাদ—এমন জিনিস প্রকাশনার জগতে হয় না, পাইপলাইনের জগতে হয়।
দুই আর একের মধ্যে পার্থক্য করার সবচেয়ে সস্তা পরীক্ষাটা আমি আগে করতাম: একই ব্যাচের বাকি লেখাগুলো কী ফেরত দিয়েছে? যদি ব্যাচের প্রতিটা ফাইলই ফাঁকা অ্যারে দেয়, তাহলে দোষটা স্কিমার, একক লেখার নয়। যদি শুধু এই একটা ফাইল ফাঁকা হয়, তাহলে দোষটা পেজের। একটা পরীক্ষা, দুই রকম জগৎ।
আর একটা অভ্যাস আমি জোর করে গড়েছি: লগ খোলার আগে লিখে ফেলি কী দেখতে চাই। এটাকে বলে হাইপোথিসিস আগে নথিভুক্ত করা। না করলে লগ খোলার পরে মানুষ যা পায়, তার মধ্যেই একটা গল্প খুঁজে বের করে—আর সেই গল্পটা সাধারণত নিজের প্রথম অনুমানটাকেই সমর্থন করে।
শূন্য মানে শূন্য নয়
ডেটা ফাইলে তিনটা জিনিসকে একই রকম দেখতে লাগে, অথচ তারা তিন রকম: নাল (তথ্য নেই), ফাঁকা তালিকা (মাপা হয়েছে, কিছু পাওয়া যায়নি), আর শূন্য (মাপা হয়েছে, ফল শূন্য)। ক্রিকেটে এর সরাসরি উদাহরণ আছে।
একজন বোলার যিনি এক ওভারও করেননি, তার ইকোনমি প্রিন্ট হয় ০.০০। আরেকজন বোলার যিনি চার ওভার করলেন, কিন্তু স্কোরার তাঁর খাতা তুলতেই ভোলেন, তাঁর ইকোনমিও প্রিন্ট হয় ০.০০। একই সংখ্যা, দুই ভিন্ন বাস্তবতা। প্রথমটা সত্যি, দ্বিতীয়টা মিথ্যা। স্কোরবোর্ড কোনো পার্থক্য করে না, কারণ স্কোরবোর্ড শুধু সংখ্যা ছাপে, সংখ্যার জন্ম-নথি ছাপে না।
স্প্রেডশিট মিথ্যা বলেনি; মাপার যন্ত্রটাই মিথ্যা বলেছিল। ২০১৭ সালে ঢাকার একটা ডিজিটাল ডেস্কে প্রথম এটা শিখি—সেই গল্প পরে আসছে।
এই জায়গায় আরেকটা লাইন আমার ডেস্কের দেয়ালে লেখা আছে, কাগজে ছাপা, ফ্রেমে বাঁধানো: প্রতিটি ট্রান্সফার উইন্ডো একটা খতিয়ান, আর প্রতিটা গুজবের একটা দশমিক থাকে। আজকের ফাইলে সমস্যা হলো দশমিকটাই নেই। খতিয়ান আছে, কলম আছে, কিন্তু কোনো এন্ট্রি নেই। আর এন্ট্রি ছাড়া খতিয়ান শুধু কাগজ।
আর মডেলের ক্ষেত্রে কথাটা আরও স্পষ্ট: মডেলটা ব্যর্থ হয়নি, মডেলকে জিজ্ঞাসাই করা হয়নি। প্রশ্নহীন মডেলের উত্তর 'উত্তর নেই'—এটা মডেলের দোষ নয়, প্রশ্নকর্তার দোষ।
ক্রিকেট_এশিয়া: চার জায়গা যেখানে পাহারা লাগে
cricket_asia লেবেলটা একা কিছুই বলে না, কিন্তু এটা আমাদের বলে দেয় পরের লেখাটা কোন চারটা খনি-ক্ষেত্রে পড়বে। এই চারটার প্রত্যেকটায় তথ্যপয়েন্টের source ফিল্ড ছাড়া কাজ করা যায় না, আর সেটাই এখানে নেই।
প্রথমত, ভূ-রাজনীতি। ভারত-পাকিস্তান, বাংলাদেশ, শ্রীলঙ্কা, আফগানিস্তান—এই পাঁচজনের মধ্যে সিরিজ নির্ধারণ, আয়োজকত্ব, সম্প্রচার স্বত্ব প্রায়ই ক্রীড়া-সিদ্ধান্তের চেয়ে কূটনৈতিক ইঙ্গিত হিসেবে ব্যবহৃত হয়। নিরপেক্ষ ভেন্যু, ভিসা, সফরের অনুমতি—এসব শিরোনামে ক্রিকেট, ভেতরে রাষ্ট্রনীতি। উৎস না জানলে কোন বাক্যটা ক্রীড়া-প্রতিবেদন আর কোনটা রাষ্ট্রীয় অবস্থানের মোড়ক, আলাদা করা অসম্ভব।
দ্বিতীয়ত, বোর্ড-রাজনীতি। চারটা বোর্ডের আর্থিক ও বাচনিক ক্ষমতা সমান নয়। আইসিসি বোর্ড ২০২৩ সালে ২০২৪–২০২৭ চক্রের যে রাজস্ব বণ্টন মডেল অনুমোদন করে, তাতে ভারতের অংশ প্রায় ৩৮.৫ শতাংশ—বাকি সদস্যদের ভাগ সেই তুলনায় অনেক ছোট। এই বাস্তবতায় বিসিবি বা পিসিবির কোনো আর্থিক দাবির প্রতিবেদন পড়ার সময় প্রথম প্রশ্নটা হওয়া উচিত: সংখ্যাটা কার হিসাব, কোন সালে, কোন ভিত্তিতে। যে প্রতিবেদনে কেবল এক বোর্ডের এক কর্মকর্তার বয়ান আছে, সেটা তথ্য নয়—সেটা এক পক্ষের জবানবন্দি।
তৃতীয়ত, লিগের বাণিজ্যিক আখ্যান। আইপিএল, পিএসএল, আইএলটি২০, এলপিএল—এদের তুলনার রিপোর্টে 'বাজার', 'প্লেয়ার ফি', 'দর্শক' számগুলো প্রায়ই ভিন্ন ভিন্ন পদ্ধতিতে গণা হয়। উদাহরণ হিসেবে একটা যাচাইযোগ্য সংখ্যা: ২০২২ সালের নিলামে বিসিসিআই ঘোষিত আইপিএলের ২০২৩–২০২৭ চক্রের সম্প্রচার স্বত্বের মোট মূল্য প্রায় ৪৮,৩৯০ কোটি রুপি। এই সংখ্যাটা অর্থবহ, কিন্তু শুধু তখনই—যখন জানা থাকে এটা মিডিয়া রাইটস, লিগের মোট আয় নয়, এবং এতে বিদেশি সম্প্রচার ও ডিজিটাল প্যাকেজ আলাদা ভাগে ধরা আছে। এই সংজ্ঞাগুলো না জেনে দুই লিগের সংখ্যা পাশাপাশি বসানো মানে দুই ভিন্ন স্কেলে মাপা দুই জিনিসকে এক লাইনে দাঁড় করানো।
চতুর্থত, উৎসের গঠন। দক্ষিণ এশিয়ার ক্রিকেট সংবাদ ঘুরপাক খায় কয়েকটা সংস্থার চারপাশে—পিটিআই, এএনআই, এএফপি—আর বোর্ডের সরকারি প্রেস বিজ্ঞপ্তি। একটা বোর্ড-বিজ্ঞপ্তি পিটিআই হয়ে, সেখান থেকে ইংরেজি ডেস্ক, সেখান থেকে বাংলা ডেস্কে ঢোকে; তিন হাত ঘুরে তথ্যটা যখন পাঠকের কাছে পৌঁছায়, তখন 'বোর্ড সূত্রে জানা গেছে' লেখা থেকে যায়, কিন্তু কোন বোর্ড, কোন তারিখ, কোন নথি—সব ঝরে পড়েছে। উৎসের ঠিকানা ছাড়া বাক্য একটা দাবি, তথ্য নয়। নাম-সূত্রে খেলোয়াড়ের বাজারমূল্য বা এনডোর্সমেন্ট ভ্যালুর যে সংখ্যা চলে—শাকিব আল হাসান, ভিরাট কোহলি কিংবা বাবর আজমের ক্ষেত্রেই হোক—সেই সংখ্যাগুলোর পদ্ধতি প্রায় কখনো লেখা থাকে না। পদ্ধতিহীন সংখ্যা তুলনার অযোগ্য, সেটা যত বড়ই হোক।
আন্তঃক্রীড়া উপমা: কাজান, ২.৩১ এক্সজি, আর একটা সীমা
২০১৮ সালের ২৭ জুন, কাজান। জার্মানি ০-২ দক্ষিণ কোরিয়ার কাছে হারে। ম্যাচ শেষ হওয়ার আগেই আমি হিসাব করে ফেলেছিলাম: জার্মানির প্রত্যাশিত গোল (xG) ২.৩১, কোরিয়ার ০.৭৮। স্কোরবোর্ড আর প্রক্রিয়া এখানে দুটো ভিন্ন কথা বলছিল। ফাইনাল হুইসেলের আগেই চৌদ্দ টুইটের একটা থ্রেড দিয়েছিলাম, মূল কথা একটাই—চ্যাম্পিয়নরা এমন একটা ম্যাচ হেরেছে যেখানে স্কোরবোর্ড ছাড়া প্রায় প্রতিটা সূচকে তারা এগিয়ে ছিল।
এই উপমাটা এখন কাজে লাগাব, তবে সীমাটা আগে বলে নিই। ফুটবলের xG একটা ধারাবাহিক মাপ—শটের সংখ্যা ও গুণমান থেকে একটা প্রত্যাশা তৈরি হয়। আর আজকের ফাঁকা তালিকা একটা শ্রেণিগত অবস্থা—হয় আছে, নয় নেই। দুটোকে এক জায়গায় বসিয়ে আমি শুধু একটা শিক্ষা নিচ্ছি: ফলাফল আর প্রক্রিয়া আলাদা জিনিস, আর ফলাফল সব সময় সত্যি কথা বলে না। এর বেশি কিছু এই উপমা থেকে নেওয়া যায় না, নিলে সেটা সাজসজ্জা হবে, বিশ্লেষণ নয়।
আজকের ফাইলে 'ফলাফল' হলো খালি ঘরগুলো—যা চোখে দেখা যায়। 'প্রক্রিয়া' হলো নিষ্কাশন লগ—যা দেখা যায় না। ফলাফল বলছে ম্যাচ ড্র, প্রক্রিয়া বলছে ম্যাচই হয়নি। এই দুইয়ের তফাত বুঝতে না পারলে আমরা সারা রাত ড্র নিয়ে লিখব, অথচ প্রশ্নটা মাঠ তৈরি হয়েছে কি হয়নি তা নিয়ে।
আমার নিজের পাইপলাইন কেন
২০১৭ সালে, চব্বিশ বছর বয়সে, রাজশাহী ছেড়ে ঢাকার একটা ডিজিটাল ডেস্কে যোগ দিই, মাসে আঠারো হাজার টাকায়। কাজ ছিল বাংলাদেশ প্রিমিয়ার লিগ ফুটবলের ৬৬টা ম্যাচ হাতে হাতে চার্ট করা—শটের অবস্থান, শরীরের কোন অংশ, ডিফেন্সিভ প্রেসার, গোলকিপারের অবস্থান। ষষ্ঠ সপ্তাহে পুরো শিটটা পাইথনে নতুন করে লিখলাম। আমার প্রত্যাশিত গোলের টেবিল বলল, আবাহনী লিমিটেড ঢাকা তাদের xG ছাড়িয়ে গেছে ১১.৪ গোলে; লিগ টেবিল বলল, তারাই চ্যাম্পিয়ন। বাংলাদেশের ফুটবলে এই দুই সংখ্যা কেউ পাশাপাশি ছাপেনি।

সেই অভিজ্ঞতা থেকে একটা অভ্যাস বদলেছিল চিরতরে: 'জিতে যাওয়ার যোগ্য ছিল' লেখা বন্ধ করে দিয়ে প্রতিটা দাবির পাশে একটা সংখ্যা বসাতে শুরু করলাম, আর প্রতিটা কলামের নিচে পদ্ধতির টীকা। আজ সেই একই নিয়ম আরও কড়া: সংখ্যার টীকা না থাকলে সংখ্যাটাই ছাপি না।
২০২০ সালের এপ্রিলে ডেস্ক চল্লিশ শতাংশ কর্মী ছাঁটে, আমার চুক্তি শূন্য ঘণ্টায় নেমে আসে। নিজের স্ক্র্যাপিং পাইপলাইন বানালাম। ১৬ মে বুন্দেসলিগা ফিরল, আমি পাঁচ লিগের ৩০৬টা ম্যাচ ট্র্যাক করলাম। লকডাউনের আগে হোম উইন রেট ছিল ৪৩.২ শতাংশ, খালি স্টেডিয়ামে নেমে আসে ৩৩.৬ শতাংশে; হোম দলের xG কমে ম্যাচপ্রতি ০.১১। তথ্যসেটটা কোড সহ প্রকাশ করলাম, দুটো এশীয় আউটলেটকে লাইসেন্স দিলাম।
খালি স্টেডিয়াম, ভাঙা হোম অ্যাডভান্টেজ—সেই অভিজ্ঞতার সবচেয়ে বড় শিক্ষা প্রযুক্তিগত নয়, মালিকানার। যে পাইপলাইন নিজের, সেটা ভাঙলে চিৎকার করে ভাঙে। যে পাইপলাইন ভাড়া করা, সেটা চুপচাপ ভাঙে, আর তার ফাঁকা ফলাফলটা সুন্দর ফরম্যাটে এসে ডেস্কে বসে থাকে। আজকের ফাইলটা দ্বিতীয় ধরনের।
তিনটি ইনপুট, তিন স্তরের আস্থা
যদি এই ফাইলটা নিয়েই কাজ চালাতে হয়, তাহলে তিনটা পথ খোলা, আর প্রতিটার আস্থার মাত্রা আলাদা—সেটা আগেই বলে রাখা দরকার।
প্রথম পথ, সবচেয়ে ভালো: মূল লেখার সম্পূর্ণ টেক্সট, প্লেইন টেক্সট হলেও চলবে। সেই ক্ষেত্রে অবস্থান, সত্তা, উৎস, সময়-সংবেদনশীলতা—সব আমি নিজে পুনর্গঠন করব। আস্থা: সর্বোচ্চ।
দ্বিতীয় পথ: শিরোনাম, উৎস, আর তিন থেকে পাঁচটা তথ্যপয়েন্ট, প্রতিটার পাশে source ফিল্ড। এতে অবস্থান নির্ণয় ও উৎসের বিশ্বাসযোগ্যতা বিচার করা যায়, যদিও মূল লেখার সূক্ষ্ম বাঁকগুলো হারাবে। আস্থা: মাঝারি।
তৃতীয় পথ: মূল লেখা আর না পাওয়া গেলে শুধু শিরোনাম, উৎস আর প্রকাশের তারিখ। এই ক্ষেত্রে আমি কেবল মেটাডেটা-ভিত্তিক একটা পাঠ দিতে পারি, এবং সেটা স্পষ্টভাবে কম-আস্থা হিসেবে চিহ্নিত থাকবে; কোনো তথ্যগত সিদ্ধান্ত এখান থেকে নেওয়া যাবে না। আস্থা: নিম্ন।
তিনটাতেই একটা শর্ত এক: কোন স্তরের আস্থা, সেটা লেখার ভেতরেই ঘোষণা করতে হবে। পাঠক বিচার করতে পারবেন কোন বাক্যটা কতটা ভার বহন করছে। লুকানো আস্থা-স্তর হলো সাংবাদিকতার সবচেয়ে সাধারণ প্রতারণা—লেখক নিজেও জানেন না কোন লাইনটা তিনি জানেন, কোনটা অনুমান করছেন।

বিপরীতমুখী পাঠ: নিরাপদ ব্যর্থতা আর বিপজ্জনক আত্মবিশ্বাস
এখানে একটা কথা স্বীকার করে নিই। ওপরের বিশ্লেষণে আমি সহজ পথটা নিইনি। সহজ পথ হতো এই বলা: ফাঁকা ফাইল মানে ফাঁকা কাজ, এমনিতেই কিছু হয় না। আসল বিপদটা অন্য জায়গায়।
খালি ঘর নিরাপদ ঘর। সে চোখের সামনে খালি পড়ে থাকে, তার মিথ্যা বলার ক্ষমতা নেই। বিপদটা হলো যেখানে ঘরটা ভরা, যুক্তিসঙ্গত, সাবলীল—কিন্তু উৎসহীন। একটা নিষ্কাশন মডিউল যদি ফাঁকা অ্যারে ফেরত দেয়, আমি থেমে যাই, লগ খুলি, প্রশ্ন করি। কিন্তু সেই একই মডিউল যদি একটা ভুল-কিন্তু-বিশ্বাসযোগ্য সারসংক্ষেপ ফেরত দেয়, আমি সেটা নিয়েই আটশো শব্দ লিখে ফেলি, কারণ ফাইলটা তো ভরা। নীরব ভুল আর নীরব ফাঁকা—দুটোর মধ্যে ভয়ংকরটা প্রথমটা।
এই জায়গায় প্রবাহের সামগ্রিক চিত্রটা মনে রাখা দরকার। দক্ষিণ এশিয়ার ক্রিকেট সংবাদে তথ্যের পুনরাবৃত্তি একটা নিজস্ব যন্ত্র। এক সংবাদসংস্থার লাইন ছয়টা প্ল্যাটফর্মে ঘুরে, প্রতিবার একটু করে আত্মবিশ্বাস যোগ করে, একটু করে উৎসের ঠিকানা হারায়। শেষে যখন বাংলা হেডলাইন হয়, তখন দাবিটা প্রবল, প্রমাণটা শূন্য। এই যন্ত্রটা ফাঁকা ঘরের মতো নিরীহ নয়, কারণ সে কখনো খালি দেখায় না।
সংখ্যাগরিষ্ঠ মতটাকে আমি এখানে ন্যায্যভাবেই বিবেচনা করেছি—রিপোর্টের মূল সুপারিশ, অর্থাৎ স্টেজ-শূন্যের কাঁচা লেখার দৈর্ঘ্য আর ফেচের স্টেটাস কোড যাচাই করা, সম্পূর্ণ সঠিক এবং এটাই প্রথম কাজ। আমি শুধু একটা সংযোজন করছি: সেই অডিটটাও আগে থেকে নথিভুক্ত হওয়া উচিত, নইলে সেটা দোষী খোঁজার অভিযানে পরিণত হয়। মডিউল বদলে দিলাম, ফল ভালো হলো—এই সিদ্ধান্তটা তথ্য নয়, আনন্দ।
সীমাবদ্ধতা
আমি একটা ফাইল দেখেছি। একটা। এখান থেকে কোনো হার (rate) বলা যায় না—কত শতাংশ ক্ষেত্রে নিষ্কাশন ব্যর্থ হয়, সেই সংখ্যা আমার কাছে নেই, বানিয়ে বলা যাবে না। মূল লেখাটা কী নিয়ে ছিল, কে লিখেছেন, কতটা নির্ভরযোগ্য—এগুলো সম্পর্কে আমি সম্পূর্ণ অন্ধ। স্কিমা-অমিলের অনুমানটা আমি পরীক্ষা করিনি; পরীক্ষার উপায় হলো স্টেজ-শূন্য ও স্টেজ-এক-এর ফিল্ডের নাম পাশাপাশি রেখে ভিন্নতা (diff) বের করা, আর কিছু জায়গায় body_length আর এইচটিটিপি স্টেটাস কোড দেখা।
আমার আস্থার জায়গাটা স্পষ্ট করে দিই। 'এটা তথ্যের অভাব নয়, মাপার ব্যর্থতা'—এই দাবিতে আস্থা উচ্চ, কারণ ফাইলের ভেতরের তথ্যই এর পক্ষে। কারণের ক্রমবিন্যাসে আস্থা মাঝারি। আর মূল লেখার গুণমান বা বিষয়বস্তু নিয়ে যেকোনো কথা সম্পূর্ণ কম-আস্থা, বরং বলা ভালো—সে বিষয়ে আমার কোনো ভিত্তি নেই।
সামনের রাউন্ডের সংকেত
আগামী রাউন্ডে আমি একটা সূচকেই চোখ রাখব, আর সেটা ফিল-রেট নয়, নাল-রেট। প্রতি ব্যাচে Information Points কতবার ফাঁকা ফিরছে, সেটা ট্র্যাক করব; আর একই সঙ্গে দেখব Domain Label ঠিক আছে কি না। দুটো যদি একসঙ্গে চলে—লেবেল স্থির, তথ্যপয়েন্টের নাল-রেট চড়ছে—তাহলে বুঝব নিষ্কাশন স্তরে কিছু একটা ধীরে ধীরে ক্ষয়ে যাচ্ছে, আগে যে লাইনটা কাজ করত সেটা আর করছে না। এটাই আগাম সংকেত; দুর্ঘটনার পরের ড্যাশবোর্ড নয়, দুর্ঘটনার আগের একটা faint ঝাঁকুনি।
আর একটা নিয়ম আমি এখন প্রতিটা ফাইলে মেনে চলি: উৎসের ঠিকানা ছাড়া কোনো বাক্য প্রকাশিত লেখায় ঢুকবে না। গত বছর আমরা যত আত্মবিশ্বাসী বাক্য ছেপেছি, তার কতগুলো আসলে একটা ফাঁকা ঘরের ওপর দাঁড়িয়ে ছিল?
