100 poems in 1 minute (Bangla)

সে এসেছিল সে মোর  মর্ম গভীরতম উন্নত শির রয়েছে তুলিয়া  সকল,
তোমারি ভৈরবী মুকুল মম সুবাসে তব গোপনে সৌরভী আমার…
বন্ধু যদি চায় ভুলো না আপনায়  মিথ্যা দিয়ে চাতুরী দিয়ে রচিয়া।
সে কোন্‌ খেলা  কোথা কেটে গেল বৎসর বৎসর ক্ষয়িষ্ণু স্মৃতির ব্যর্থ!
সে দেয় বাঁটি ভরেছে মন গীত গন্ধে বসে

তোমারি এক প্রেমে  দুঃখসুখের বিচিত্র জীবনে  তুমি ছাড়া আর অন্য।।
বন্ধু যত মাথা তুলে বলতে পারে না হায়…
প্রাণের রথে বাহির হতে  পারব কবে  প্রবল প্রেমে সবার মাঝে,
সে আমার প্রাণে লাগে আমার বাণী আমার প্রাণে বাজায় বাঁশি॥

ও মা।।
যা চোখে পড়ে  তার পরে পথ ছাড়ো  তার পরদিনে উঠিবে প্রভাত  ফুটিবে,
বন্ধু কারে দিব দোষ বৃথা কর রোষ যারা শুধু মরে কিন্তু!
প্রাণের নিরর্থক চাঞ্চল্যে  ময়ূরটি ঘাড় বাঁকায় এদিকে ওদিকে  তার
উদাসীন।

কবিতা লেখার প্রধান উপাদানগুলো কি? আমি কবিতা লেখার কিছুই জানি না প্রায়। ছোটবেলায় ভাবতাম ছন্দ মিলিয়ে দিলেই বুঝি কবিতা হয়ে যায়। একটু বড় হয়ে বুঝলাম যে এটাকে প্রাথমিক ভাবে ছড়া বলে। তখন ভাবা শুরু করলাম যে কঠিন শব্দ ও বাক্যের বিন্যাস থাকলেই মনে হয় সেটা খুব ভাল কবিতা। আপাতদৃষ্টিতে উঠতি কবিদের লেখা পড়ে তাইই ধারণা হত। কবিতা পড়ার পরিধি একটু বিস্তার পাবার পর (রুদ্র মোহাম্মাদ শহিদুল্লাহ, পূর্ণেন্দু পত্রি, কিছু নিরমলেন্দু গুন ইত্যাদি), আর আধুনিক গানের কথাগুলো (জেমস – মারজুক রাসেল ইত্যাদি) ভাল লাগতে শুরু হবার পর কবিতার ক্ষমতার প্রতি শ্রদ্ধা তৈরি হওয়া শুরু করলো। নিজে কখনো কবি হতে পারবো না, সেটা ভাল করেই বুঝে গিয়েছিলাম তখনি। কিন্তু এই হতাশাই বোধহয় কবিতা নিয়ে অনেক ভাবে ভাবতে শিখিয়েছে। প্রধান প্রশ্ন ঘুরে ফিরে একটাইঃ কবিতা লেখার প্রধান উপাদানগুলো কি?

সাধারণ পাঠক হিসেবে আমার ধারণাগুলো সংক্ষেপে বলি। শব্দ আর বাক্যের চয়ন অন্যতম মূল মশলা। এর সাথে থাকতে হবে কোন নির্দিষ্ট ভাব (বা অনির্দিষ্ট, ইংরেজিতে একে বলে nonsense theme)। বাক্য বিন্যাস গৎবাঁধা গদ্যের মত না হলেই চলে অনেক সময়; ছন্দর উপস্থিতি অত্যাবশ্যক নয়, কবিতার ভাব এবং কবির রুচির ওপর নির্ভর করে এটা। এর বাইরে আরো অনেক কিছু আছে, তবে এক কথায় এই হচ্ছে আমার চিন্তা।

স্বয়ংক্রিয় কবিতা

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

আরো সাধারণভাবে যদি বলি – শুধু কিছু প্রাথমিক নিয়ম কে আমাদের বিল্ডিং ব্লক হিসেবে নিলে তাদের যেকোনো সমষ্টি থেকে আমরা কতোটুকু complex behavior আশা করতে পারি? মানুষের মস্তিষ্কের কার্যবিধি কিছুটা এরকম। আমাদের নিউরনরা বেশ কিছু সিগন্যাল আদান প্রদান করে নিজেদের মধ্যে। এসব সিগন্যালকে আমরা মোটামোটিভাবে শনাক্ত করে ফেলেছি। এছাড়াও দেখা গেছে যে কয়েকটি নিউরনের সমষ্টি (নিউরাল নেটওয়ার্ক) অনেক ধরণের কমপ্লেক্স প্যাটার্ন তৈরি করতে পারে। শুধু একটি নিউরনের পক্ষে এতোটুকু জটিল প্যাটার্ন তৈরি করা সম্ভব না, কিন্তু কয়েকজন একত্র হলেই কেওস (“বিশৃঙ্খলা”) তৈরি হয়ে যায়, যার থেকে তৈরি হয় অনুভূতি। আগ্রহীরা এই বইটি পরতে পারেনঃ New Kind of Science (Stephen Wolfram) যেখানে এই পদার্থবিদ ও গণিতবিদ সাধারণ মানুষের জন্য লিখেছেন ও দেখিয়েছেন কি করে শুধু ছোটখাটো কিছু প্রোগ্রাম একজন আরেকজনের সাথে interact করলে কতরকম কমপ্লেক্স কিন্তু বোধ্য প্যাটার্ন পাওয়া সম্ভব।

তাহলে অনুভূতি বলতে কি বুঝি আমরা? এটাকে গনিতের আওতায় আনা সম্ভব কি? অনেকেই চেষ্টা চালিয়ে যাচ্ছেন (রজার পেনরোজ etc.), যাদের প্রধান যুক্তি গড়ে উঠেছে chaos theory কে কেন্দ্র করে। যেরকম কমপ্লেক্স আচরণের কথা বললাম, সেটাকেও গণিত দিয়ে বাঁধ মানানো সম্ভব হয়ত। তারই একটি প্রচেষ্টা হিসেবে ৭০ এর দশকে প্রথম স্বয়ংক্রিয় কবিতা তৈরি করার জন্য একটি অ্যালগরিদম দেয়া হয়। মারকভ মডেল ব্যাবহার করে এই প্রক্রিয়াটি কিছু প্রদত্ত টেক্সট থেকে pseudorandom টেক্সট তৈরি করতে পারে, যা পড়লে অনেক সময় বোঝা মুশকিল এটা আসল না নকল। উপরের কবিতাটা কিন্তু এই মারকভ মডেল দিয়েই তৈরি করা। 🙂

মারকভ মডেল

আমি প্রধানত ব্যবহার করেছি খুব সাধারণ একটা মডেল, যার নাম হচ্ছে n-gram Markov Model। এখানে n যেকোনো নাম্বার হতে পারে ১ থেকে শুরু করে।

যেকোনো মারকভ মডেল সাধারণত একটি বিবর্তনশীল প্রক্রিয়া। আমি যদি কিছু নাম্বার দিয়ে একটা ভেক্টর (state) তৈরি করি, আর সেই ভেক্টর কে একটি ম্যাট্রিক্স দিয়ে গুণ করতে থাকি (ম্যাট্রিক্সটির কিছু properties maintain করতে হবে, যেমন Ergodicity and Aperiodicity) তাহলে একটা সময় সেই ভেক্টরটির মাণ আর পরিবর্তন হয় না। আমরা কেওস থিওরি তে বা স্ট্যাটিস্টিকস এ একে বলি stable state। ম্যাট্রিক্সটিকে বলা হয় transition matrix। এই ম্যাট্রিক্সটি এবং এই পুরো বিবর্তন ব্যাবস্থাটি  এমন ভাবে তৈরি করা হয় যেন বর্তমান ভেক্টর এর মাণ শুধু এর আগের কিছু states (আগের ইটেরেশন এর ভেক্টর এর মাণ) থেকে একদিকে converge করতে শুরু করে। কিন্তু  বর্তমান ভেক্টরটি কিন্তু আবার আগের এবং পরের ভেক্টর থেকে স্বাধীন (একে বলা হয় Markov property)।

n-gram Markov Model সাধারণত n সংখ্যক শব্দ নেয় (প্রদত্ত টেক্সট থেকে), ধরি এটা হচ্ছে একটা ভেক্টর v[1..n], এবং বাকি টেক্সটের মাঝে v[2..n] খোঁজ করে। যতগুলো match পাওয়া যায়, ততগুলো থেকে আমরা র‍্যান্ডমলি একটা বেছে নেই। সেটার পরের শব্দটি নিয়ে আমরা আমাদের পরের state তৈরি করি, যাকে বলতে পারি v’। অর্থাৎ, v’ = Union[{v[2..n], chosen word}].

যেমনঃ “আমি ফুচকা খাবার জন্য ফুচকা খাবার দোকানে গেলাম, কিন্তু ফুচকা খাবার দোকান বন্ধ ছিল।” এই বাক্য থেকে আমি বেশ কিছু 3-gram (n = 3) তৈরি করতে পারি।

আমি ফুচকা খাবার, ফুচকা খাবার জন্য, খাবার জন্য ফুচকা, জন্য ফুচকা খাবার, ফুচকা খাবার দোকানে, খাবার দোকানে গেলাম, …, ফুচকা খাবার দোকান, দোকান বন্ধ ছিল।

এখানে আমি যদি v[1..n] = {আমি, ফুচকা, খাবার} ধরি, তাহলে v[2..n] = {ফুচকা, খাবার}. তাহলে এই পুরো বাক্যে v[2..n] তিনবার পাওয়া যাবেঃ ফুচকা খাবার জন্য, ফুচকা খাবার দোকানে এবং ফুচকা খাবার দোকান। আমার কাছে তাহলে তিনটি অপশন আছে পরের শব্দটি বাছাই করার জন্যঃ  জন্য, দোকানে এবং দোকান।ধরা যাক পরের শব্দটি র‍্যান্ডম ভাবে সিলেক্ট করলাম এবং পেলাম দোকান। তাহলে v'[1..n] = {ফুচকা, খাবার, দোকান}।

নতুন v’ দিয়ে আমি একি অ্যালগরিদম আবারো চালাতে পারি। এইভাবেই বেশ কিছু iteration এর পর আমরা নতুন আরেকটি বাক্য পাই। এখানে n যত বড় হবে, ততই accurate বাক্য পাওয়া যাবে। কিন্তু সেটা আমাদেরকে শুধু মূল প্রদত্ত টেক্সট এর কাছাকাছি একটা কিছু দেবে। n ছোট হলে আরো অনেক নতুনত্ব আসবে, কিন্তু accuracy কমে যাবে। সেটা যদিও আরো অনেক interesting হবে।

এটা মারকভ মডেল কারণ আমার বর্তমান ভেক্টর আগের ও পরের ভেক্টরের ওপর নির্ভরশীল নয়। এখানে আমরা যা করছি তা মূলত একটি বড় ম্যাট্রিক্স দিয়ে একটি ভেক্টর কে বারবার গুণ করারই সমান।

এখানে এটাও লক্ষণীয় যে এই মারকভ মডেল আসলে কেওস থিওরির সাথে সম্পৃক্ত। যেকোনো গল্প, উপন্যাস বা কবিতা কে যদি আমরা কিছু সমষ্টিগত শব্দের বিশৃঙ্খলা হিসেবে ধরে নেই, তাহলে এই বিশৃঙ্খলা থেকে একি প্যাটার্নের আরেকটি বিশৃঙ্খলা তৈরি করাই হচ্ছে n-gram মারকভ মডেল এর কাজ। কবিতার মত ভাব নির্ভর সাহিত্যে এ ধরণের মডেল বেশ কাজে আসে।

এক মিনিটে ১০০ কবিতা?

চাইলেই কি এ দিয়ে অনেক কবিতা লিখে ফেলা যাবে? আমি রবীন্দ্রনাথের ৫০০ কবিতা, সুকান্তর কাব্যগ্রন্থ ছাড়পত্র আর জীবনানন্দর বেশ কিছু কাব্যগ্রন্থ একত্র করে একটা corpus তৈরি করেছিলাম বেশ আগেই, কবিতার মধ্যে শব্দর বিশৃঙ্খলার প্যাটার্ন বের করার উদ্দেশ্য নিয়ে। সেটা ব্যবহার করে, আর বেশ কিছু theme keyword দিয়ে (যারা কবিতার প্রধান ভাব নির্ধারণ করবে) মিনিটেই অনেক কবিতা বের করে ফেলা সম্ভব। Mathematica তে লেখা আমার বেশ ছোট একটা প্রোগ্রাম খুব দ্রুতই এই কাজ সেরে ফেলতে পারে নিপুণ ভাবে। প্রথমে লেখা কবিতাটি মূলত রবীন্দ্রনাথের ৫০০ কবিতার ওপর নির্ভরশীল। আমি আরো বেশ কিছু customization করেছি, যেমন র‍্যান্ডম চয়েস করার সময় চাইলেই biased সম্ভাব্যতা নিয়ে আসা যায়, তাহলে যেকোনো কবি বা কবিতার প্রাধান্য থাকতে পারে এই নতুন কবিতার ওপর।

সবসময় যে খুব ভাল কাজ করবে না, তার প্রমাণ পরের কবিতাটি। এটা বেশ কম সংখ্যক কবিতা থেকে তৈরি করা হয়েছে, এবং কিছু ভাবের (thematic) শব্দ কে লক্ষ্য করে প্রোগ্রামটি চালানো হয়েছে, যেমন প্রাণ, বন্ধু, সুখ, তোমারি এবং বিদায়।

প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ

তোমারি চরণ ওগো মৌন না যদি জুটে নিজের বল

সে ত্রিশূলমূলে শিবের দেউলদ্বারে কাঁদছে স্মৃতি কে দেবে,
সুখে তৃপ্ত তুমি আমার গীতরাগে ভালো লাগে জানি আমি তোমার

তোমারি ইচ্ছা করো হে পূর্ণ আমার জীবন মাঝে যাচি হে তোমার,
বন্ধু চুপে চুপে চলিতেছে বনপথ ধরি আকাশের বুকে বুকে

প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ।।
বন্ধু আজকে আঘাত দিও না তোমাদের পকেটে পকেটে আমরা!
সে যে সুদুর অজানা করবীকুঁড়ির পানে চোখ তার ভরে গেছে নীল!
সে ছুটিয়া যায় চকিত আকাশ পায় না নাগাল যার লুঘ।
যা ছিল গোপন স্বপন কদিন রয় এসেছে গোধূলি।।
প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ!
বিদায় তুমি তাহা জানিলে না চলে গেছে মুসাফের কবে ফের।
বিদায় দেখেছ উঠল যে হাওয়া ঝোড়ো ঠিকানা রইল।
সে সকাল আসবেই যেদিন এই খবর পাবে প্রত্যেকের চোখেমুখে সকালের আলোয়!
প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ

এই কবিতা তে একটা কথা বারবার এসেছেঃ প্রাণের বীণা নিয়ে যাব সেই অতলের সভা মাঝে চিরদিনের সুরটি বেঁধে শেষ।। এর কারণ হচ্ছে corpus ছোট হওয়ায় খুব সম্ভব প্রাণ সংক্রান্ত কথা আমার বেচারা প্রোগ্রামটি আর খুঁজে পায় নি। আরেকটি অর্থহীন কথা আছেঃ বন্ধু আজকে আঘাত দিও না তোমাদের পকেটে পকেটে আমরা! এই কথার সাধারণ কোন মানে নেই, কিন্তু একেবারেই সম্পূর্ণ অর্থহীন বলা যাবে না ঠিক। কবিতা যেহেতু ভাব সাহিত্য, এখানে মারকভ মডেল সহজেই পার পেয়ে যেতে পারে!

উপসংহার

কখনো বুঝিনি যেটা, এটা ছিল সূচনা,

আছে বাকি স্বপ্নের উপসংহার…

– তপু।

মারকভ মডেল বেশ পুরনো জিনিস। অনেক ভাষাবিদ, গণিতবিদ ও কম্পিউটার বিজ্ঞানীরা এর ওপর কাজ করেছেন। n-gram মারকভ মডেল ব্যাবহার করে Automatic Content Generation এবং নকল করা লেখা ধরার উপায় নতুন কিছু না। যা করেছি তা হচ্ছে শুধুই সূচনা, গাণিতিক ভাবে এই মডেল এখন বহুল প্রচলিত গবেষণার বিষয়। প্রাণিবিদ্যায় cell culture dynamics এবং genetic code sequencing এও এই মডেল ব্যাবহার করা হয়।

কবিতা লেখায় এর গ্রহণযোগ্যতা প্রশ্নসাপেক্ষ। গাণিতিক ভাবে এই মডেল কে সাপোর্ট দেয়া যায়, এবং আশা করা যায় ডায়নামিক মারকভ মডেল দিয়ে ভবিষ্যতে কোন প্রদত্ত টেক্সট এর সাহায্য ছাড়াই কবিতা লেখা যাবে। মানুষ এটা মেনে নেবে নাকি জানি না। তবে সবার আগে জানতে হবে কবিতা বলতে আমরা কি বুঝি, বা আমার মূল প্রশ্নঃ কবিতার মূল উপাদানগুলো কি কি? অনেক সময় একটা theme সংক্রান্ত কিছু ব্যাকরণ মেনে চলা শব্দের চয়নকেও কবিতা বলা যেতে পারে।

আমি যদি আসলেই কাউকে বলতাম যে কবিতাটা আমার লেখা, তাহলে মানুষ কিন্তু প্রায় বিশ্বাস করে ফেলত (অনেকটা টুরিং এর এ.আই. টেস্টের মত ব্যাপার). কিছু বন্ধুকে জিজ্ঞেস করে দেখেছি, যারা মোটামোটি কবিতা পড়ে। প্রায় সবাইই ধরে নিয়েছে যে এটা (প্রথম কবিতাটা) আমি লিখেছি। কিছু চ্যাট লগ দেখলে বোঝা যেতে পারেঃ

: tui likhchos?
me: ho beta
: khaisere mama
pura nazrul type
hoise
me: hehehe
: seriously
: tui likhsos?
me: ho
kemon hoise?
: aissala
  bhaloi to mone hoy
  kar jonne likhsos?
me: hehehe
ki mone hoy?
me: just tell me what you think
: tumi tomar mar theke fragrance pao
she's the flower
you're the shourov
me: hmm
 khub e high thought er bepar mone hocche!

কিন্তু আমার ধারণা শুরুতেই যদি বলতাম যে এটা প্রোগ্রাম থেকে লিখেছি, সবাই সাথে সাথে ভুল ধরা শুরু করতো। আমরা সাধারণত কোন এক্সপার্ট কেউ কথা বললে সেটা মেনে নেই, তর্ক কম করি। অনেক বড় বড় বোদ্ধারা যখন কিছু বলে সেটাকে প্রশ্ন কম করি, কিন্তু একই কথা সাধারণ বা নগণ্য কেউ বললে মেনে নিতে পারি না।

আমার দিক থেকে এই প্রোগ্রামের আপাতত দুইটা ব্যাবহার দেখতে পাচ্ছি। একটা হচ্ছে আধুনিক যুগের বাংলা মেটাল ব্যান্ডদের জন্য। তাদের গানের কথা সাধারণত বোঝা যায় কম, এবং যত কম বোঝা যায় এবং যত কঠিন শব্দ ব্যাবহার করা যায় ততই ভাব। কাজেই বেচারাদের কষ্ট করে ডিকশনারি ঘেঁটে আর গানের কথা লেখার দরকার কি, এমনিতেই তো বাংলা প্রায় পারেই না। আমাকে বললে আমি ফ্রি তে তাদের গান পাঠায় দিব। বানাতে কয়েক সেকন্ড সময় লাগবে শুধু। আরেকটা ব্যাবহার হচ্ছে আধুনিক তরুণীদের মুগ্ধ করতে। আমাকে অনেকেই বলে মেয়েরা নাকি গম্ভীর কবিতা শুনলে পটে যায়। এই প্রোগ্রাম দিয়ে আর যাইই হোক, মেয়ে পটানতে সুবিধা হইতে পারে। 🙂

বিশেষ দ্রষ্টব্যঃ কোড

ইনপুট প্রোসেসিং এবং ডাটা স্ট্রাকচার সংক্রান্ত ঝামেলা বাদ দিলে মূল মারকভ মডেল কোড খুব ছোট এবং সাধারণ।


generateSentence[n_, size_, prtmain_, initword_] := Module[
 {prevch = {}, res = {}, choices = {}, posch = 0, i},
 posch = RandomChoice[Position[prtmain[[;; , 1]], initword]];
 For[i = 1, i <= size, i++,
 res = AppendTo[res, prtmain[[posch[[1]], 1]]];
 (* search for temp in the rest and pick a random one *)
 posch =
 RandomChoice[
 Position[prtmain[[;; , 1 ;; n]],
 prtmain[[posch[[1]], 2 ;; n + 1]]]];
 choices =
 AppendTo[choices,
 Length[Position[prtmain[[;; , 1 ;; n]],
 prtmain[[posch[[1]], 2 ;; n + 1]]]]]
 ];
 Return[{res, choices}]
 ]

poem = {};
For[i = 1, i <= Length[result], i++,
 poem = AppendTo[poem, StringJoin[
 Insert[result[[i, 1]], " ",
 Table[{j}, {j, 2, Length[result[[i, 1]]]}]],
 RandomChoice[{"...", "।", "।।", "!", "\n", ","}],
 "\n"
 ]
 ]
 ]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s