কোন অ্যালগরিদম কোনও বানান পরীক্ষককে পরামর্শ দেয়?


114

শব্দের পরামর্শ সহ একটি বানান পরীক্ষক প্রয়োগ করার সময় সাধারণত কোন অ্যালগরিদম ব্যবহার করা হয়?

প্রথমে আমি ভেবেছিলাম যে অভিধানের প্রতিটি শব্দ থেকে লেভেনস্টেইনের দূরত্ব এবং শীর্ষ ফলাফলগুলি প্রত্যাবর্তন করে প্রতিটি নতুন শব্দ টাইপ করা (অভিধানে না পাওয়া গেলে) এটি পরীক্ষা করা বুদ্ধিমান হতে পারে । তবে এটি পুরো অক্ষরটি বারবার মূল্যায়ন করার পরে এটি অত্যন্ত অদক্ষ হবে বলে মনে হচ্ছে।

এটি সাধারণত কীভাবে করা হয়?

উত্তর:


203

পিটার নরভিগের একটি ভাল রচনা আছে কীভাবে কোনও বানান সংশোধক কার্যকর করতে হয়। এটি মূলত একটি নির্ধারিত সম্পাদনার দূরত্ব সহ প্রার্থী স্ট্রিং ব্যবহার করে এমন এক শক্তিশালী বাহিনীর পন্থা। ( ব্লুম ফিল্টার এবং দ্রুত প্রার্থী হ্যাশিং ব্যবহার করে আপনি কীভাবে বানান সংশোধনকারীর কার্যকারিতা উন্নত করতে পারেন তার কয়েকটি টিপস এখানে রইল ))

একটি বানান পরীক্ষকের প্রয়োজনীয়তা দুর্বল। আপনার কেবলমাত্র এটি খুঁজে পাবেন যে কোনও শব্দ অভিধানে নেই। আপনি একটি বানান পরীক্ষক তৈরি করতে ব্লুম ফিল্টার ব্যবহার করতে পারেন যা কম স্মৃতিশক্তি গ্রহণ করে। একটি ইংরেজী অভিধানের জন্য 64kb ব্যবহার করে জন বেন্টলে দ্বারা প্রোগ্রামিং পার্লগুলিতে একটি প্রাচীন সংস্করণ প্রকাশিত হয়েছে।

একটি বিকে-ট্রি একটি বিকল্প পদ্ধতি। একটি সুন্দর নিবন্ধ এখানে

লেভেনস্টেস্টিন দূরত্ব হ'ল কোনও বানান পরীক্ষকের জন্য সঠিক সম্পাদনার দূরত্ব নয়। এটি কেবল সন্নিবেশ, মুছে ফেলা এবং প্রতিস্থাপন জানে। স্থানান্তর অনুপস্থিত এবং 1 টি অক্ষর স্থানান্তরিত করার জন্য 2 উত্পাদন করে (এটি 1 মোছা এবং 1 সন্নিবেশ)। ডামেরাউ – লেভেনস্টাইন দূরত্ব হ'ল সম্পাদনার দূরত্ব।


2
অপেক্ষাকৃত অজানা বিকে-ট্রি রেফারেন্সের জন্য +1। গুগলের মতো সংস্থাগুলি এভাবেই রিয়েল-ওয়ার্ল্ড [টিএম] পরিমাণের ডেটা নিয়ে কাজ করছে।
NoozNooz42

2
সেখানে বি কে গাছের অনেক ভালো ব্যাখ্যা এখানে
ইয়ান বয়ড

17

আমি সফলতার সাথে ব্যবহার করেছি তবে কোথাও বর্ণিত কখনও দেখিনি এমন পরামর্শ উত্পন্ন করার জন্য একটি কৌশল হ'ল "খারাপ" হ্যাশ ফাংশন ব্যবহার করে প্রাক-গণনা পরামর্শগুলি (অভিধান তৈরি করার সময়)।

ধারণাটি হ'ল লোকেরা যে ধরনের বানান ত্রুটি তৈরি করে সেগুলি দেখে এবং হ্যাশ ফাংশনগুলি ডিজাইন করা যা তার সঠিক বানান হিসাবে একই বালতিতে একটি ভুল বানান নির্ধারণ করে।

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

এই বিশেষ হ্যাশ ফাংশনটি ব্যবহার করে আপনার অভিধানের সমস্ত শব্দ একটি সহায়ক সূচীতে (হ্যাশ টেবিল) sertোকান। এই টেবিলের বালতিগুলিতে দীর্ঘতর সংঘর্ষের তালিকা থাকবে কারণ হ্যাশ ফাংশনটি "খারাপ", তবে সেই সংঘর্ষের তালিকাগুলি মূলত প্রাক-গণিত পরামর্শ।

এখন, যখন আপনি কোনও ভুল বানানযুক্ত শব্দটি খুঁজে পান, আপনি বালতিটির জন্য সংঘর্ষের তালিকাটি সন্ধান করুন যা ভুল সূচকটি মানচিত্রের সূচকগুলিতে ম্যাপ করে। তা দা: আপনার একটি পরামর্শের তালিকা আছে! আপনাকে যা করতে হবে তা হ'ল শব্দটিকে র‌্যাঙ্ক করা।

অনুশীলনে, অন্য ধরণের ত্রুটি যেমন ট্রান্সপোজড হরফ, একক / ডাবল লেটার এবং এমনকি ফোনেটিক ভুল বানান ধরার জন্য সরলবাদী সাউন্ডেক্স-এর মতো হ্যান্ড ফাংশনগুলির সাথে আপনাকে কয়েকটি সহায়ক ইনডেক্স প্রয়োজন need অনুশীলনে, আমি দীর্ঘতর পথ যেতে সরল উচ্চারণের সন্ধান পেয়েছি এবং তুচ্ছ টাইপগুলি সন্ধান করার জন্য ডিজাইন করা কিছুকে মূলত অপ্রচলিত করেছি।

সুতরাং এখন আপনি সহায়িকা সূচকের প্রতিটিতে ভুল বানান সন্ধান করুন এবং র‌্যাঙ্কিংয়ের আগে সংঘর্ষের তালিকাগুলিকে একত্রিত করুন।

মনে রাখবেন সংঘর্ষের তালিকায় কেবল শব্দ রয়েছে যা অভিধানে রয়েছে। বিকল্প বানান তৈরি করার চেষ্টা করার পদ্ধতির সাথে (পিটার নরভিগ প্রবন্ধে যেমন) আপনি হাজার হাজার প্রার্থী পেতে পারেন যা আপনাকে অভিধানের বিপরীতে ফিল্টার করতে হবে। প্রাক-গণিত পদ্ধতির সাহায্যে আপনি কয়েক শতাধিক প্রার্থী পেতে পারেন এবং আপনি জানেন যে তারা সবাই সঠিকভাবে বানান করেছেন, তাই আপনি সরাসরি র‌্যাঙ্কিংয়ে যেতে পারেন ip

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


ফারুকের সিমস্পেল অ্যালগরিদম রেফারেন্স করার জন্য ধন্যবাদ। উভয় অ্যালগরিদম সম্ভাব্য টাইপগুলি প্রাক-গণনা করা এবং দ্রুত অনুসন্ধানের জন্য একটি হ্যাশ টেবিল ব্যবহার করার সময়, মূল পার্থক্যটি হ'ল সিমস্পেল একটি নির্দিষ্ট সম্পাদনা দূরত্ব পর্যন্ত সমস্ত সম্ভাব্য বানান ত্রুটি সনাক্ত করার গ্যারান্টি দেয় (এই ক্ষেত্রে সিমস্পেল পিটার নরভিগের অ্যালগরিদমের সমতুল্য, ঠিক .6..6 আকারের দ্রুততার অর্ডার), যখন আপনার অ্যালগরিদম হিউরিস্টিক পদ্ধতির ব্যবহার করছে যা সমস্ত তাত্ত্বিকভাবে সম্ভাব্য বানান ত্রুটির একটি সীমাবদ্ধ উপসর্গ সনাক্ত করতে পারে (সুতরাং আপনার প্রাক-গণনার ব্যয় কম হতে পারে)।
উল্ফ গার্বে

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

অবশ্যই, সম্ভাব্য টাইপগুলি (এবং সেইগুলিতে সীমাবদ্ধ) সম্পর্কে অভিজ্ঞতামূলক জ্ঞানকে কাজে লাগিয়ে আপনি প্রাক-গণনার সময় এবং স্থান সংরক্ষণ করেন। তবে সমস্ত সম্ভাব্য বানান ত্রুটিগুলি coverাকতে সিমস্পেলকে কেবলমাত্র তার একটি ক্ষুদ্র ভগ্নাংশের প্রাক-গণনা করতে হবে। একটি 5 অক্ষরের শব্দের 3 টি সর্বাধিক সম্পাদনের দূরত্বের মধ্যে প্রায় 3 মিলিয়ন সম্ভাব্য বানান ত্রুটি রয়েছে, তবে সিমস্পেলের সাহায্যে আপনার প্রাক-গণনা করতে হবে এবং কেবল 25 টি মুছে ফেলতে হবে। এটি বানান সংশোধনের বাইরে অস্পষ্ট / সাদৃশ্য অনুসন্ধানের জন্য গুরুত্বপূর্ণ যেখানে কোনও অভিজ্ঞতাজ্ঞান নেই।
ওল্ফ গার্বি

7

অ্যালগরিদম

  1. ইনপুট হিসাবে একটি ভুল বানানযুক্ত শব্দ নিন।
  2. পাঠ্য ফাইলে তাদের ফ্রিকোয়েন্সি সহ ইংরেজী শব্দের তালিকা সংরক্ষণ করুন।
  3. তার্নারি অনুসন্ধান ট্রিতে সমস্ত উপলভ্য ইংরেজী শব্দ (পাঠ্য ফাইলে সংরক্ষিত) পাশাপাশি তাদের ফ্রিকোয়েন্সিগুলি (ইংরেজি ভাষায় শব্দটি প্রায়শই কীভাবে ব্যবহৃত হয় তার পরিমাপ) withোকান।
  4. এখন টার্নারি অনুসন্ধানের গাছের পাশ দিয়ে যান -
    • টার্নারি অনুসন্ধান বৃক্ষের মুখোমুখি প্রতিটি শব্দের জন্য, ভুলভাবে বানানযুক্ত শব্দ থেকে তার লেভেনস্টিন দূরত্ব গণনা করুন।
    • যদি লেভেনস্টেইন দূরত্ব <= 3, শব্দটিকে একটি অগ্রাধিকার কাতারে সংরক্ষণ করুন।
    • যদি দুটি শব্দের একই সম্পাদনার দূরত্ব থাকে তবে উচ্চতর ফ্রিকোয়েন্সি সহ একটি গ্রেটার হয়। অগ্রাধিকার সারিতে শীর্ষ 10 আইটেম মুদ্রণ করুন।

অপ্টিমাইজেশান

  1. বর্তমান শব্দ থেকে ইনপুট শব্দের সাবস্ট্রিংয়ের সম্পাদনার দূরত্ব যদি 3 এর চেয়ে বেশি হয় তবে আপনি বর্তমান নোডের সাবট্রিগুলিতে শব্দগুলি একাদিক করতে পারেন।
    আপনি গিথুব প্রকল্পের আরও বিস্তারিত ব্যাখ্যা এবং উত্স কোড খুঁজে পেতে পারেন ।

হুঁ, এই ক্ষেত্রে 'গ্রেটার' থেকে 'বৃহত্তর' পর্যন্ত লেভেনস্টেইনের দূরত্ব যথেষ্ট হবে না, কারণ 'গ্রেটার' অভিধানের শব্দও। ;-)
টনি ব্রাসুনাস

1
@ টনিব্রেসুনাস, হ্যাঁ আপনি ঠিক বলেছেন। তবে প্রোগ্রামটি আসলে 'গ্রেটার' এর ক্ষেত্রে ইনপুট হিসাবে 10 টি শব্দের একটি তালিকা ফিরিয়ে দেবে এবং এটি 0 দুরত্বের দূরত্ব সহ 'গ্রেটার' এবং 1 এর সম্পাদনার দূরত্বের সাথে আরও 'বৃহত্তর' প্রস্তাব করবে যা কিছুটা সহায়ক হতে পারে। ;)
অমরজিৎআনন্দ

যদি একজন প্রার্থীর দূরত্ব হয় 2, তবে এটি খুব ঘন ঘন এবং অন্য প্রার্থীর দূরত্ব 1 থাকে তবে অত্যন্ত বিরল, আপনি কীভাবে দুজনকে র‌্যাঙ্ক করবেন? উপরোক্ত পদ্ধতির ক্ষেত্রে বিরল আইটেমটি সর্বদা জিততে পারে, এটি কি সঠিক ফলাফল?
স্পিড প্লেন

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

3

অভিধানে প্রতিটি শব্দের জন্য আপনাকে সম্পাদনের সঠিক দূরত্ব জানতে হবে না। সীমাবদ্ধতার মান পৌঁছানোর পরে আপনি অ্যালগরিদম থামাতে পারেন এবং শব্দটি বাদ দিতে পারেন। এটি আপনার প্রচুর কম্পিউটিং সময় সাশ্রয় করবে।


1

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

ইউনিক্স সিস্টেমে ম্যাক ইলরয়ের লিখিত একটি প্রোগ্রাম ব্যবহার করে। বিকল্প উপায় হ'ল একটি ট্রাই ব্যবহার করা যা বিশাল ফাইলগুলির ক্ষেত্রে কার্যকর হতে পারে।

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

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