হোমবিশ্ব ক্রিকেটযে রেকর্ডে শুধু ‘ক্রিকেট’ লেখা থাকে: ডেটা পাইপলাইনের নীরব ব্যর্থতা

যে রেকর্ডে শুধু ‘ক্রিকেট’ লেখা থাকে: ডেটা পাইপলাইনের নীরব ব্যর্থতা

**মূল উত্তর:** Stage-1 ডিকনস্ট্রাকশন আউটপুটে কেবল একটি ডোমেইন লেবেল (cricket_world) পাওয়া গেছে, বাকি সব ফিল্ড শূন্য। তাই কোনো ক্রিকেট-বিষয়ক সিদ্ধান্ত টানা সম্ভব নয়; রেকর্ডটি পুনঃনিষ্কাশনে পাঠানোই একমাত্র সঠিক পদক্ষেপ। **মূল তথ্য:** - বারোটি ফিল্ডের মধ্যে ভরাট মাত্র একটি — ডোমেইন লেবেল cricket_world; তথ্যবিন্দু, সারাংশ ও অবস্থান শূন্য। - ‘প্রযোজ্য নয়’ লেখা মানে নিরপেক্ষতা নয়; এটি অনুপস্থিত তথ্য, যা ফলস নেগেটিভ তৈরি করে। - ফাইলের আকার ইঙ্গিত দেয় ব্যর্থতা ঘটেছে তথ্যবিন্দু নিষ্কাশনের স্তরে বা তার আগে। - ক্রিকেট কনটেন্ট প্রায়ই স্কোর টেবিল ও লাইভ ফিড আকারে আসে, ফলে গদ্য-ভিত্তিক নিষ্কাশক ব্যর্থ হয়। - শূন্য তথ্যবিন্দুর রেকর্ড কর্পাস-স্তরের পরিসংখ্যান থেকে বাদ দেওয়া বাধ্যতামূলক। **সূত্র:** অভ্যন্তরীণ Stage-1 ডিকনস্ট্রাকশন রিপোর্ট; নথিতে প্রকাশতারিখ উল্লেখ নেই। **সম্ভাব্য পরবর্তী প্রশ্ন:** প্রশ্ন: শূন্য রেকর্ড ডেটাবেসে কীভাবে রাখা উচিত? উত্তর: deconstruction_failed ট্যাগ নিয়ে, যাতে ভবিষ্যতে পুনঃনিষ্কাশন ছাড়া কেউ এটি ব্যবহার না করে। প্রশ্ন: ক্রিকেট স্কোরকার্ড নিষ্কাশনে কী পরিবর্তন দরকার? উত্তর: গদ্য-ভিত্তিক পদ্ধতির পাশাপাশি স্কিমা-সচেতন শাখা দরকার, যা ম্যাচ মেটাডেটা, ইনিংস ও ফল আলাদা করে পড়তে পারে। প্রশ্ন: Stage-1 ব্যর্থ হলে কে দায়ী — উৎস না পাইপলাইন? উত্তর: ফাইলের আকার বলে না; ক্যানোনিকাল ইউআরএল ও রেন্ডার-টাইম যাচাইয়ের পরেই তা নির্ধারণ করা যায়।

গত সপ্তাহে আমার হাতে একটি ফাইল এল। বারোটি ফিল্ড। শিরোনাম খালি, উৎস খালি, ধরন খালি, তথ্যবিন্দুর তালিকা শূন্য, সারাংশ শূন্য, লেখকের অবস্থান ঘরে লেখা ‘প্রথম ধাপে মূল্যায়িত হয়নি’। ভরাট ছিল মাত্র একটি ঘর — ডোমেইন লেবেল: cricket_world। বাকি এগারোটি ঘর আমার কাছে এমন সিদ্ধান্ত দাবি করছিল, যার কাঁচামাল ওই ফাইলে নেই।

যে রেকর্ডে শুধু ‘ক্রিকেট’ লেখা থাকে: ডেটা পাইপলাইনের নীরব ব্যর্থতা

ভাবুন একটা স্কোরকার্ড, যেখানে শুধু ‘ক্রিকেট’ লেখা, বাকিটা সাদা। কোন দল জিতল, কে ব্যাট করল, কত ওভার চলল — কিছুই নেই। তবু কেউ ঘোষণা করছে, স্কোরকার্ডটি পড়া হয়ে গেছে।

ময়মনসিংহে ২০১৭ সালে শেখ রাসেল ক্রীড়া চক্রের সঙ্গে স্বেচ্ছাসেবী ডেটা কাজ করার সময় আমার খাতায় এমন ফাঁকা পাতা কম ছিল না। বাংলাদেশ প্রিমিয়ার লিগে আবাহনী লিমিটেড ঢাকার বিপক্ষে ওই ম্যাচে প্রতিটি শট হাতে টুকে রেখেছিলাম। মডেল বলল, শেখ রাসেলের xG ২.৭, আবাহনীর ০.৮ — ম্যাচ শেষ ১-১। ফেসবুকে লেখাটি ১,২০০ বার শেয়ার হয়, ঢাকার স্কাউটরাও পড়েন। কিন্তু খাতার পেছনে আরেক ধরনের পাতা ছিল: ম্যাচের নাম, তারিখ, প্রতিযোগিতার ট্যাগ সব লেখা, আর শটের ঘরগুলো নীরব। ওই নীরব পাতাগুলোই আমাকে সবচেয়ে বেশি শিখিয়েছে।

ময়মনসিংহে প্রথম xG মডেলটি ছিল ছায়ার লিগে একটি লণ্ঠন — আলো কম, তবু যা ধরা পড়ে, তা সত্যি।

যে রেকর্ডে শুধু ‘ক্রিকেট’ লেখা থাকে: ডেটা পাইপলাইনের নীরব ব্যর্থতা

ক্রিকেটের টেক্সট নিষ্কাশন কেন ভাঙে, সেটা বুঝতে পাইপলাইনের গঠনটা দেখতে হয়। সাধারণত প্রথম ধাপে ডোমেইন ঠিক হয় — সস্তা, দ্রুত, শুরুর কাজ। তারপর তথ্যবিন্দু বের করা হয়: কোন বাক্যে কোন দাবি, কোন সংখ্যা কোথা থেকে এসেছে। শেষে আসে সত্তা-নিশ্চিতকরণ, সময়-সংবেদনশীলতার শ্রেণি, উৎসের মান। যে ফাইলটি আমার হাতে এল, তার আকারই বলে দেয় ছুরি কোথায় পড়েছে: ডোমেইন পূরণ হয়েছে, তার নিচের প্রতিটি স্তর শূন্য।

দক্ষিণ এশিয়ার ক্রিকেট কনটেন্টে এই আকার খুব চেনা। আমাদের এখানে ক্রিকেট প্রায়ই গদ্যে আসে না। এটা আসে স্কোর টেবিল হয়ে, ওভার-বাই-ওভার ফিড হয়ে, লাইভ ব্লগের এমবেড হয়ে, এএমপি রিডাইরেক্ট হয়ে। ২০২০ সালে বসুন্ধরা কিংসে ট্রান্সফার মার্কেট অ্যাডমিনিস্ট্রেটর হিসেবে কাজ করার সময় দেখেছি, ক্লাবের নিজস্ব রিপোর্টিংও একই রোগে ভুগত — ইভেন্ট লগ থাকত, প্রেক্ষাপটের বাক্য থাকত না। একটা প্লেয়ার প্রোফাইল দাঁড় করাতে গিয়ে বারবার ফিরে যেতে হতো মূল ভিডিওতে, কারণ টেক্সট ফাইলে কেবল নাম আর সংখ্যা ছিল, ব্যাখ্যা ছিল না।

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

এই চারটির কোনটি সত্যি, তা ফাইলটি দেখে বলা যায় না। কিন্তু আকারটা একটা ইঙ্গিত দেয় — ব্যর্থতা ঘটেছে তথ্যবিন্দুর স্তরে বা তার আগে, লেখা পড়ে ফাঁকা পাওয়ার পরে নয়। বাকি এগারোটি ঘর আসলে নির্দেশ, কোনো আবিষ্কার নয়।

শূন্য রেকর্ড নিরপেক্ষতার প্রমাণ নয়। আমার হাতে আসা ফাইলে লেখা ছিল ‘লেখকের অবস্থান: প্রযোজ্য নয়’। এটা পক্ষপাতহীনতার সনদ নয়, এটা তথ্যের অনুপস্থিতি। এই দুইয়ের পার্থক্য না ধরলে বিশ্লেষণে সবচেয়ে বিপজ্জনক ভুলটা ঘটে — ফলস নেগেটিভ। কেউ সিদ্ধান্তে পৌঁছে যায়, পর্যালোচনায় পক্ষপাত পাওয়া যায়নি; বাস্তবে ঘটনাটি হলো পর্যালোচনাই হয়নি।

ক্রিকেটে এই ভুলের দাম বড়। জাতীয় প্রেস বনাম নিরপেক্ষ প্রেস, ফ্র্যাঞ্চাইজি বনাম জাতীয় দল — এই ফ্রেমিং ধরার কাজটা ঠিক যে দুটি ঘরে হয়, অবস্থান আর উদ্দেশ্য, দুটোই এখানে ফাঁকা। ফরম্যাটও চেনা যায় না: টেস্ট, ওডিআই, টি-টোয়েন্টি, নারী-পুরুষ, ঘরোয়া-আন্তর্জাতিক — সব সমান সম্ভাব্য। কোনো সত্তা নেই; খেলোয়াড়, দল, বোর্ড, ভেন্যু, টুর্নামেন্ট — কোনো নাম বসালে সেটা বানানো হবে। ঘটনার শ্রেণিও অজানা: ম্যাচ রিপোর্ট, প্রিভিউ, ট্রান্সফার বা অবসরের খবর, প্রশাসনিক বিতর্ক, বাজি বা স্পট-ফিক্সিং, খেলোয়াড়ের সুস্থতা, সূচি নিয়ে বিবাদ — সবই প্রমাণের সঙ্গে সমানতালে মেলে। সময়ও নেই; ‘মূল্যায়িত হয়নি’ মানে টিকে মৌসুমেও রাখা যায় না, ঐতিহাসিক রেকর্ডের সঙ্গে মেলানো তো দূরের কথা।

এখানে একটি সূক্ষ্ম রেখা আছে, যেটা আমি ২০২০ সালে শিখেছি। খালি স্টেডিয়াম আমাকে শিখিয়েছিল, নীরবতাও একটি ডেটা সোর্স হতে পারে। কিন্তু ওই নীরবতা চিহ্নিত ছিল — আমি জানতাম গ্যালারি খালি, তাই গোলের হুল্লোড়ভিত্তিক মেট্রিক অকার্যকর, আর প্রতিপক্ষের চাপের সূচক পুনর্গণনা দরকার। আজকের ফাইলে নীরবতা চিহ্নিত নয়; কেউ দেখেইনি। চিহ্নিত অনুপস্থিতি আর অচিহ্নিত শূন্যতা এক জিনিস নয়। প্রথমটা বিশ্লেষণে ঢোকে, দ্বিতীয়টা ঢোকে না।

এখানেই আমার নিজের পেশার প্রতি আস্থা ঝাঁক খায়। আমি এমন মানুষ যিনি টেমপ্লেট আগে বানান, লেখা পরে। শূন্য ঘর দেখলে হাত চুলকায় — কিছু দিয়ে ভরে দিই। ওই প্রবৃত্তিটাই সবচেয়ে বিপজ্জনক, কারণ অনুমানকে তথ্যের মর্যাদা দিয়ে দেয়।

২০২০ সালে ব্রাজিলিয়ান এক স্ট্রাইকারের ক্ষেত্রে আমি ঠিক উল্টোটা করেছিলাম। ক্লাবের চোখে তার xG ছিল প্রতি ৯০ মিনিটে ০.৭৮ — চমৎকার সংখ্যা। কিন্তু কভার করা দূরত্ব ১৮ শতাংশ কমে গিয়েছিল, আর দুর্বল প্রতিরক্ষার বিপক্ষে তার PPDA ফুলে উঠেছিল। প্রেক্ষাপট-সমন্বিত মডেল দাঁড় করিয়ে আমি সইয়ের বিরুদ্ধে সুপারিশ দিই। ক্লাব চুক্তি বাতিল করে। পরে সে অন্য ক্লাবে ১৪ ম্যাচে মাত্র ২ গোল করে। শিক্ষাটা সোজা: এক নম্বর যখন গল্পের সঙ্গে মিলতে চায় না, তখন গল্পটা বদলাতে হয়, নম্বরটা নয়।

স্বাভাবিক প্রতিক্রিয়া হবে — আরও ডেটা যোগ করি। কিন্তু শূন্য রেকর্ডে ডেটা যোগ করার অর্থ দাঁড়ায় দুর্বল অনুমান দিয়ে ফাঁক ভরা। সঠিক পথ উল্টো দিকে যায়: আগে আর্টিফ্যাক্ট পুনরুদ্ধার, তারপর নিষ্কাশন। ক্যানোনিকাল ইউআরএল, এএমপি সংস্করণ, রিডার ভিউ, পেওয়াল বা রেন্ডার-টাইম চেক। স্কোরকার্ড বা লাইভ ব্লগ হলে গদ্য-নিষ্কাশক দিয়ে কাজ হবে না — দরকার স্কিমা-সচেতন শাখা: ম্যাচ মেটাডেটা, ইনিংস, ফল।

এই শৃঙ্খলাটা আমি ২০১৮ বিশ্বকাপে রিমোট স্কাউটিংয়ের সময় রপ্ত করি। সেমিফাইনালে ইংল্যান্ডের বিপক্ষে ক্রোয়েশিয়ার মার্সেলো ব্রজোভিচ ১২.৮ কিলোমিটার দৌড়েছিলেন, পাস নির্ভুলতা ৮৯ শতাংশ, PPDA ৮.৭। তিনটি সংখ্যা আলাদা করে পড়লে প্রোফাইলটা অসম্পূর্ণ থাকে; একসঙ্গে পড়লে বোঝা যায়, চাপের মধ্যে কীভাবে পজিশন ধরে রাখা হয়। প্রেক্ষাপটহীন মডেল আসলে স্কাউটের কোট পরা একটা ক্যালকুলেটর।

আমার প্রস্তাব সহজ, কিন্তু অস্বস্তিকর। প্রতিটি রেকর্ডে আত্মবিশ্বাসের স্তর স্পষ্ট লিখতে হবে — কোনটা চূড়ান্ত, কোনটা প্রাথমিক। শূন্য তথ্যবিন্দু মানে কর্পাস-স্তরের পরিসংখ্যান থেকে রেকর্ডটি বাদ; ডেটাবেসে ঢুকলে সেটি deconstruction_failed ট্যাগ নিয়ে ঢুকবে, নীরবে নয়। আর সিদ্ধান্তটি পুনঃনিষ্কাশন বা ম্যানুয়াল পর্যালোচনার দিকে পাঠাতে হবে, সারাংশকারী বা ফ্যাক্ট-চেকারের দিকে নয়।

বছরের পর বছর মাঠের পাশে বসে ম্যাচ দেখে আমি একটা অভ্যাস ছাড়তে পারিনি — ফলাফলকে প্রথমে অভিযুক্ত ধরে নেওয়া, তারপর প্রমাণে নির্দোষ প্রমাণিত হলে ছেড়ে দেওয়া। ডেটা পাইপলাইনের ক্ষেত্রেও একই নিয়ম খাটে। খালি রেকর্ড দেখলে প্রশ্ন করতে হয়, ওটা সত্যিই খালি, নাকি আমাদের যন্ত্র অন্ধ।

যে রেকর্ডে শুধু ‘ক্রিকেট’ লেখা থাকে: ডেটা পাইপলাইনের নীরব ব্যর্থতা

আগামী টুর্নামেন্ট চক্রে দক্ষিণ এশিয়ার ক্রিকেট ডেটাসেট যত বড় হচ্ছে, তত বেশি লেবেল-পরা শূন্য রেকর্ড জমছে — যেগুলো দেখতে সম্পূর্ণ, ভেতরে ফাঁকা। যে হিসাবটা কেউ করতে চায় না: আপনার ‘যাচাইকৃত’ কর্পাসের কত শতাংশ আসলে একটি ডোমেইন লেবেল আর এগারোটি সাদা ঘর?

সংশ্লিষ্ট খেলোয়াড়গণ