কম্পিউটারের দ্বারা ব্যবহারকারী দ্বারা সরবরাহিত উদাহরণগুলির দ্বারা নিয়মিত প্রকাশটি "শেখানো" সম্ভব কি?


95

কম্পিউটারের দ্বারা ব্যবহারকারী দ্বারা সরবরাহিত উদাহরণগুলির দ্বারা নিয়মিত অভিব্যক্তি "শেখা" সম্ভব কি?

স্পষ্ট করা:

  • আমি নিয়মিত ভাব প্রকাশ করতে চাই না
  • আমি এমন একটি প্রোগ্রাম তৈরি করতে চাই যা কোনও ব্যবহারকারীর দ্বারা ইন্টারেক্টিভভাবে সরবরাহ করা উদাহরণগুলির থেকে নিয়মিত প্রকাশটি "শেখায়", সম্ভবত কোনও পাঠ্য থেকে অংশগুলি নির্বাচন করে বা শুরু করে বা চিহ্নিতকারীগুলিকে নির্বাচন করে।

এটা কি সম্ভব? আমি কি গুগল করতে পারি এমন কোন অ্যালগরিদম, কীওয়ার্ড ইত্যাদি রয়েছে?

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


4
আমি অবাক হয়েছি কেউ রেজেক্স :: প্রিফুফ
ট্রিপলি

উত্তর:


44

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


44

হ্যাঁ, এটি সম্ভব, আমরা উদাহরণ থেকে পাঠ্য তৈরি করতে পারি (পাঠ্য -> পছন্দসই নিষ্কাশন)। এটি একটি কার্যকর অনলাইন সরঞ্জাম যা কাজটি করে: http://regex.inginf.units.it/

রিজেক্স জেনারেটর ++ অনলাইন সরঞ্জাম একটি জিপি অনুসন্ধান অ্যালগরিদম ব্যবহার করে প্রদত্ত উদাহরণগুলি থেকে একটি রেগেক্স তৈরি করে। জিপি অ্যালগরিদম বহুমুখী ফিটনেস দ্বারা চালিত যা উচ্চতর পারফরম্যান্স এবং সহজ সমাধান কাঠামোর (ওকামের রেজার) দিকে নিয়ে যায়। এই সরঞ্জামটি মেশিন লার্নিং ল্যাব, ট্রাইস্ট ইউনিভার্সিটি (ইউনিভার্সিটি ডিগ্রি স্টাডি ডি ট্রাইস্টে) দ্বারা একটি ডিমেস্টেটিভ অ্যাপ্লিকেশন। ভিডিও টিউটোরিয়ালটি এখানে দেখুন

এটি একটি গবেষণা প্রকল্প যাতে আপনি এখানে ব্যবহৃত অ্যালগরিদমগুলি সম্পর্কে পড়তে পারেন ।

দেখ! :-)

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

"The product code is 467-345A" -> "467-345A"
"The item 789-345B is broken"  -> "789-345B"

উদাহরণস্বরূপ একজন (মানব) লোক বলতে পারে: "আইটেম কোডগুলি \ d ++ - 345 [এবি]" এর মতো জিনিস

আইটেম কোডটি যখন বেশি অনুমোদিত তবে আমরা অন্যান্য উদাহরণ সরবরাহ করি নি, সমস্যাটি ভালভাবে বোঝার জন্য আমাদের কাছে প্রমাণ নেই। নিম্নলিখিত উত্সটিতে মানব উত্পন্ন সমাধান \ d ++ - 345 [AB] প্রয়োগ করার সময়, এটি ব্যর্থ হয়:

"On the back of the item there is a code: 966-347Z"

ম্যাচটি কী এবং কাঙ্ক্ষিত ম্যাচটি কী নয় তা আরও ভাল করে বর্ণনা করার জন্য আপনাকে অন্যান্য উদাহরণ সরবরাহ করতে হবে: --ie:

"My phone is +39-128-3905 , and the phone product id is 966-347Z" -> "966-347Z"

ফোন নম্বরটি কোনও পণ্য আইডি নয়, এটি একটি গুরুত্বপূর্ণ প্রমাণ হতে পারে।


4
এটি শীর্ষ উত্তর হওয়া উচিত। এটি সম্ভব, এবং এটি এটি দেখায়। উত্সটি এখানে উপলব্ধ: github.com/MaLeLabTs/RegexGenerator
rjurney

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

4
এটি জিনিস করার সঠিক উপায়। আমার উদাহরণটি সমস্যাটিকে ধারণাগতভাবে ব্যাখ্যা করার একমাত্র উপায়। কখনও কখনও কোনও স্পেসিফিকেশন থাকে না, বা লোকটি কেবল নিজের দ্বারা নিয়মিত প্রকাশ (জ্ঞানের অভাব) লিখতে সক্ষম হয় না।
ফাবিয়ানো তারলাও

আরও সুনির্দিষ্ট এবং দ্ব্যর্থহীন :-) হতে, "এই জিনিসগুলি করার সঠিক উপায়" -> "আপনি ঠিক বলেছেন, কাজগুলি করার আপনার সর্বোত্তম উপায়, সম্ভব হলে আপনার সর্বদা স্পেসিফিকেশন থেকে শুরু করা উচিত"
ফ্যাবিও তারালাও

4
নিবন্ধ "উদাহরণ থেকে টেক্সট নিষ্কাশন জন্য রেগুলার এক্সপ্রেশন ইনফিরেনস" অ্যালগরিদম একটি বিস্তারিত ব্যাখ্যা রয়েছে machinelearning.inginf.units.it/publications/...
mimmuz

36

কোনও কম্পিউটার প্রোগ্রাম কেবলমাত্র বৈধ ম্যাচের তালিকার ভিত্তিতে অর্থবহ নিয়মিত অভিব্যক্তি তৈরি করতে সক্ষম হবে না । আমাকে দেখাতে দাও কেন।

ধরুন আপনি 111111 এবং 999999 উদাহরণ সরবরাহ করেছেন, কম্পিউটারটি কি উত্পন্ন করা উচিত:

  1. এই দুটি উদাহরণের সাথে মিলে যাওয়া একটি রেজেক্স: (111111|999999)
  2. 6 টি অভিন্ন অঙ্কের সাথে মিলে যাওয়া একটি রেজেক্স (\d)\1{5}
  3. 6 টি এবং নাইনগুলির সাথে মিলে যাওয়া একটি রেজেক্স [19]{6}
  4. যে কোনও 6 সংখ্যার সাথে মিলে যাওয়া একটি রেজেক্স \d{6}
  5. উপরোক্ত তিনটির যে কোনও একটি, শব্দের সীমানা সহ, যেমন \b\d{6}\b
  6. প্রথম তিনটির যে কোনওটি পূর্বের বা অঙ্কের পরে নেই, যেমন (?<!\d)\d{6}(?!\d)

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

আপনি যদি সমস্ত সম্ভাব্য ম্যাচের তালিকা তৈরি করতে না চান তবে আপনার উচ্চ-স্তরের বিবরণ প্রয়োজন। নিয়মিত মত প্রকাশের জন্য ঠিক এটিই ডিজাইন করা হয়েছে। 6-সংখ্যার দীর্ঘ তালিকা সরবরাহের পরিবর্তে আপনি প্রোগ্রামটি কেবল "কোনও ছয় অঙ্ক" মেলাতে বলুন। নিয়মিত প্রকাশের বাক্য গঠনতে এটি this d {6 becomes হয়ে যায়}

নিয়মিত প্রকাশের মতো নমনীয় এমন উচ্চ-স্তরের বর্ণনা সরবরাহের যে কোনও পদ্ধতিও নিয়মিত প্রকাশের মতো জটিল complex RegexBuddy এর মতো সমস্ত সরঞ্জামগুলি হ'ল উচ্চ-স্তরের বিবরণ তৈরি করা ও পরীক্ষা করা আরও সহজ করে তোলে। সরাসরি অবিশ্বাস্য নিয়মিত প্রকাশের বাক্য গঠন ব্যবহার করার পরিবর্তে, রেজেক্সবাডি আপনাকে সরল ইংলিশ বিল্ডিং ব্লক ব্যবহার করতে সক্ষম করে। তবে এটি আপনার জন্য উচ্চ-স্তরের বর্ণনা তৈরি করতে পারে না, কারণ এটি কখন আপনার উদাহরণগুলিকে সাধারণীকরণ করা উচিত এবং কখন তা করা উচিত নয় তা জাদুকরভাবে জানতে পারে না।

নিয়মিত ভাব প্রকাশের জন্য ব্যবহারকারী দ্বারা প্রদত্ত গাইডলাইন সহ নমুনা পাঠ্য ব্যবহার করে এমন একটি সরঞ্জাম তৈরি করা অবশ্যই সম্ভব। এ জাতীয় সরঞ্জাম ডিজাইনের শক্ত অংশটি হ'ল এটি কীভাবে ব্যবহারকারীকে প্রয়োজনীয় গাইডেন্সিং তথ্য জিজ্ঞাসা করে, সরঞ্জামটিকে নিয়মিত প্রকাশের চেয়ে নিজেরাই শেখা কঠিন না করে এবং সাধারন রেজেক্স চাকরিতে বা সাধারণ নিয়মিত অভিব্যক্তিতে সীমাবদ্ধ না করে।


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

কোনও সরঞ্জাম যদি প্রশ্ন জিজ্ঞাসা করে, তবে প্রশ্নের উত্তর এবং প্রদত্ত উত্তরগুলির সংমিশ্রণটি উচ্চ-স্তরের বর্ণনা গঠন করে। এই জাতীয় সরঞ্জামগুলির গুণমান মূলত এটির জিজ্ঞাসা করা প্রশ্নগুলির উপর নির্ভর করে।
জান গোয়েভার্টস

এটি বোকা কারণ আপনি যদি অন্য একটি উদাহরণ সরবরাহ করেন তবে আপনি সেই সম্ভাবনার কিছুটি ঘায়েল করতে পারেন। আরও একটি উদাহরণ আরও আগাছা ছড়িয়ে দেয়।
ক্রিস

4
@ ক্রিস: আপনি কতগুলি নমুনা সরবরাহ করেন তা নির্বিশেষে নীতিটি অবশেষ। এটি কেবল সম্ভাবনার পরিবর্তন করে। উদাহরণস্বরূপ, 123456 যোগ করা # 2 থেকে (\ d) \ 1 {5} | 123456 এবং # 3 থেকে [19] {6} | 123456 এ পরিবর্তন করে। বা এটি # 3 থেকে [1-69] {6} এ পরিবর্তন করতে পারে} এমনকি এটি এমনও হতে পারে যে কাঙ্ক্ষিত প্যাটার্নটি 6 টি অভিন্ন অঙ্ক বা 6 ডিজিটের সাথে মেলে যেখানে প্রতিটি অঙ্ক পূর্ববর্তী অঙ্কের চেয়ে একটি বেশি। এমনকি আপনি যদি 6-সংখ্যার 10,000 টি নমুনা সরবরাহ করেন তবে প্রোগ্রামটি ব্যবহারকারীর অতিরিক্ত নির্দেশনা ছাড়াই # 1, # 4, # 5 বা # 6 এর মধ্যে পার্থক্য করতে পারে না।
জান গোয়েভার্টস

আমি মনে করি যে এই সমস্যাটি সহজেই সমাধান করা হয়েছে: প্রোগ্রামটি যথাসম্ভব সাধারণ হওয়ার চেষ্টা করেছে (কারণের মধ্যে) এবং তারপরে আপনাকে অন্যান্য জিনিসগুলির উদাহরণ দেয় যা এটি মেলবে বলে মনে করে। প্রস্তাবিত মিলগুলিকে কেবল 'হ্যাঁ' এবং 'না' বলার মাধ্যমে আপনি এটি আসলে ক্যাপচারের চেষ্টা করছেন তার সীমা বুঝতে এটি সহায়তা করতে পারে। আমি একটি টেক্সট সম্পাদকের একটি সরঞ্জাম দেখতে পছন্দ করব যা এই ধারণাটি ব্যবহার করে এবং বর্তমানে উন্মুক্ত ফাইল থেকে প্রস্তাবিত ম্যাচগুলি।
জন ম্যাকক্লাং

9

হ্যাঁ, এটি অবশ্যই "সম্ভাব্য"; এখানে সিউডো কোডটি রয়েছে:

string MakeRegexFromExamples(<listOfPosExamples>, <listOfNegExamples>)
{
   if HasIntersection(<listOfPosExamples>, <listOfNegExamples>)
     return <IntersectionError>

   string regex = "";
   foreach(string example in <listOfPosExamples>)
   {
      if(regex != "")
      {
         regex += "|";
      }
      regex += DoRegexEscaping(example);
   }
   regex = "^(" + regex + ")$";

   // Ignore <listOfNegExamples>; they're excluded by definition

   return regex;
}

সমস্যাটি হ'ল এখানে অসীম সংখ্যক রেইগেক্স রয়েছে যা উদাহরণগুলির তালিকার সাথে মিলবে। এই কোডটি সেটটিতে সর্বাধিক সহজ / বোকামি রেজেক্স সরবরাহ করে, মূলত ইতিবাচক উদাহরণগুলির তালিকার কোনও কিছুর সাথে মেলে (এবং নেতিবাচক উদাহরণগুলির সাথে অন্য কিছুই নয়)।

আমি অনুমান করি যে আসল চ্যালেঞ্জটি হ'ল সংক্ষিপ্ততম রেজেক্সের সন্ধান করা যা সমস্ত উদাহরণের সাথে মিলে যায় তবে তারপরেও ব্যবহারকারীকে ফলাফলটি সঠিকভাবে "সঠিক ছিল" তা নিশ্চিত করতে খুব ভাল ইনপুট সরবরাহ করতে হবে।


4
এটি ইতিবাচক এবং নেতিবাচক নমুনাগুলি প্রবেশ করে যখন আকর্ষণীয় হতে শুরু করে । রেজেক্সকে ইতিবাচক নমুনাগুলির সাথে মিল রাখতে হবে এবং নেতিবাচকগুলির সাথে মেলে না।
ব্যবহারকারী 55400

@ ব্লিস্টার - আসলে এটি বেশ সহজ। কেবল নির্মিত রিজেেক্সে নেতিবাচক উদাহরণের কোনওটি রাখবেন না এবং সেগুলি প্রত্যাখ্যান করা হবে। মনে রাখবেন, কোডটি যেটি তৈরি করে তা কেবল ইতিবাচক উদাহরণের সাথে মেলে; নেতিবাচক উদাহরণ (এবং অন্য কিছু) সংজ্ঞা দ্বারা বাদ দেওয়া হয়!
ড্যানিয়েল লেচেমিন্যান্ট

ড্যানিয়েল ঠিক বলেছেন। উচ্চ-স্তরের বর্ণনা ব্যতীত বিকল্পগুলির একটি তালিকা হ'ল উদাহরণের তালিকা থেকে ধারাবাহিকভাবে এবং নির্ভুলভাবে অনুমান করা যায়।
জান গোয়েভার্টস

6

আমি বিশ্বাস করি শব্দটি "অন্তর্ভুক্তি"। আপনি একটি নিয়মিত ব্যাকরণ প্ররোচিত করতে চান।

আমি মনে করি না উদাহরণের একটি সীমাবদ্ধ সেট (ইতিবাচক বা নেতিবাচক) দিয়ে এটি সম্ভব। তবে, আমি যদি সঠিকভাবে স্মরণ করি তবে এটি করা যেতে পারে যদি কোনও ওরাকল থাকে যার সাথে পরামর্শ করা যেতে পারে। (মূলত আপনি প্রোগ্রামটি সন্তুষ্ট না হওয়া পর্যন্ত ব্যবহারকারীকে হ্যাঁ / কোনও প্রশ্ন জিজ্ঞাসা করতে দেবেন d)


হ্যাঁ, আমি এটিই করতে চাই, ইন্টারেক্টিভভাবে ব্যবহারকারীকে জিজ্ঞাসা করুন।
ড্যানিয়েল রিকোভস্কি

ইউভাল এফ এর উল্লেখগুলি মনে হয় যা আমার মনে ছিল, আমি সেগুলি একবার দেখার পরামর্শ দিই।
জে কোমিনেক

5

আপনি এই সাইটের সাথে খানিকটা খেলতে চাইতে পারেন, এটি বেশ দুর্দান্ত এবং মনে হচ্ছে এটি আপনি যা বলছেন তার অনুরূপ কিছু করে: http://txt2re.com


4

প্রোলোগের উপর ভিত্তি করে এই জাতীয় সমস্যার জন্য উত্সর্গীকৃত একটি ভাষা রয়েছে। একে প্রোগল বলে

অন্যরা যেমন উল্লেখ করেছেন, মূল ধারণাটি ইনডাকটিভ লার্নিং, প্রায়শই এআই সার্কেলগুলিতে আইএলপি ( ইনডাকটিভ লজিক প্রোগ্রামিং ) নামে পরিচিত ।

দ্বিতীয় লিঙ্কটি আইএলপি-র উইকি নিবন্ধ যা আপনি যদি বিষয়টি সম্পর্কে আরও জানতে আগ্রহী হন তবে প্রচুর দরকারী উত্স উপাদান রয়েছে।


2

@ ইউভাল সঠিক। আপনি গণনামূলক শিখন তত্ত্ব বা "সূক্ষ্ম সূচনা" এ খুঁজছেন।

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

এই সংজ্ঞা দ্বারা, আমি নিশ্চিত যে নিয়মিত ভাষা শেখা যায়। অন্যান্য সংজ্ঞা অনুসারে, এতটা না ...


2

আমি গুগল এবং সাইটসাইটে কিছু গবেষণা করেছি এবং এই কৌশলগুলি / কাগজপত্রগুলি পেয়েছি:

এছাড়াও ডানা অ্যাংলুইনের "ক্যোয়ারী এবং কাউন্টারেক্সেক্স থেকে নিয়মিত সেটগুলি শিখতে" আশাব্যঞ্জক বলে মনে হচ্ছে, তবে আমি কোনও পিএস বা পিডিএফ সংস্করণ খুঁজে পাচ্ছি না, কেবল উদ্ধৃতি এবং সেমিনারের কাগজপত্র পেয়েছি।

দেখে মনে হচ্ছে এটি তাত্ত্বিক স্তরের এমনকি একটি জটিল সমস্যা।


0

যদি কোনও ব্যক্তির পক্ষে নিয়মিত ভাব প্রকাশ করা সম্ভব হয় তবে কোনও প্রোগ্রামের জন্য এটি প্রাথমিকভাবে সম্ভব। তবে, সেই প্রোগ্রামটি শিখতে সক্ষম হতে সঠিকভাবে প্রোগ্রাম করা দরকার। ভাগ্যক্রমে এটি যুক্তির মোটামুটি সীমাবদ্ধ স্থান, সুতরাং এটি কোনও প্রোগ্রামকে বস্তু বা এর মতো কিছু দেখতে সক্ষম হতে শেখানোর মতো জটিল হবে না।


4
সত্য নয়, আপনার টিউরিং মেশিনগুলিতে অনস্বীকার্য সমস্যাগুলি দেখা উচিত।
স্টিফেন কুরিয়াল

ন্যায়সঙ্গত হওয়ার জন্য, আমি বলেছিলাম যে কোনও ব্যক্তি যদি কোনও রেগেক্স শিখতে পারেন, তবে একটি মেশিন পারেন। আমি সাধারণত এটি অর্থ ছিল না।
সিজেকে

@ স্কুরিয়াল আমি মনে করি না যে এমন সমস্যা আছে যা লোকেদের দ্বারা সমাধানযোগ্য হিসাবে প্রমাণিত তবে ট্যুরিং মেশিনে অনস্বীকার্য, সেখানে কি আছে?
সানি 88
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.