দুটি স্ট্রিং ম্যাচ করুন তবে একটি ডিগ্রি ত্রুটির অনুমতি দিন


10

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

এক্স সংখ্যক অক্ষর স্ট্রিংয়ের সাথে মেলে না, সেখানে একটি ক্রমের কতগুলি রান রয়েছে তার একটি সীমা থাকা উচিত। দুটি স্ট্রিং দেওয়া আমি সম্ভবত 5 টি অক্ষর আলাদা হতে দেবো, তবে একটানা 2 টির বেশি নয়।

আমি এই দুটি স্ট্রিংয়ের তুলনা করার জন্য একটি প্রস্তাবিত অ্যালগরিদম খুঁজছি, অথবা এর জন্য ইতিমধ্যে এর একটি সুপরিচিত সমাধান রয়েছে।


4
Levenshtein দূরত্ব , কিছু তাকান হতে পারে যদিও '2 বেশী পরপর' সুনির্দিষ্ট যে আলগোরিদিম অংশ নয়। দেখুন পৃষ্ঠাটি একটি হয়েছে অনেক অন্যান্য সম্পর্কিত আলগোরিদিম হতে পারে আপনি যা খুঁজছেন করছে।

@ মিশেলটি যদি আমার মতো এমন কিছু থাকে তবে তা অবশ্যই আমার প্রয়োজনের সাথে খাপ খায়। ধন্যবাদ।
প্রতিক্রিয়াশীল

@ মিশেলটি আমি এটি> dotnetperls.com/levenshtein খুঁজে পেয়েছি আপনার উত্তর দেওয়া উচিত যে এটি আমার সমস্যার সমাধান করেছে।
প্রতিক্রিয়াশীল

আপনি সাউন্ডেক্সের মিলটি দেখতে চাইবেন। en.wikedia.org/wiki/Soundex
গিলবার্ট লে ব্ল্যাঙ্ক

উত্তর:


12

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

এর উদাহরণ হ'ল kitten-> sittingযার সম্পাদনার দূরত্ব তিনটি

  1. k itten -> s itten ('কে' এর বিকল্প 's')
  2. সিট এন -> সিট আই এন ('ই' এর বিকল্প 'আমি')
  3. সিটিন -> সিটিন জি (শেষে 'জি' যুক্ত করুন)

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

লেভেনস্টাইন দূরত্বটি সুপরিচিত এবং এটি খুঁজে পাওয়া খুব কঠিন নয় (আমি একবার ওরাকলটিতে একটি ফাংশন হিসাবে এটির বাস্তবায়ন সন্ধান করার কারণ ছিলাম - এটি সমস্ত ডেটা টানতে এবং তারপরে কোয়েরি কোডের পাশ চালানোর চেয়ে অনেক দ্রুত ছিল)। Rosettacode এর implemntations একটি বৃন্দ (54) আছে Levenshtein দূরত্ব (- আপনি জাভা, এ বর্ণন করছেন নোট কিছু কিছু ভাষায় স্ট্রিং গ্রন্থাগার কোথাও অংশ হিসাবে এই আছে Apache কমন্স ল্যাঙ )। উইকিবুকগুলিতে ৩১ টি বাস্তবায়ন রয়েছে এবং দু'একটিতেই এক নজরে একই ভাষার জন্য একই কোড দেখায় না।

এটি যেভাবে কাজ করে তা এটি একটি ম্যাট্রিক্স তৈরি করে যা দুটি স্ট্রিংয়ের মধ্যকার সম্পর্কের সাথে মিলে যায়:

 .kitten
.0123456
s1123456
i2212345
t3321234
t4432123
i5543223
n6654332
g7765443

.সারি ও কলাম করার ব্যপারে আপনি দ্বারা 'শুধু' একটি খালি স্ট্রিং থেকে প্রতিটি অক্ষর ঢোকাতে লক্ষ্য স্ট্রিং পেতে পারেন। এটি আদর্শ ক্ষেত্রে নয়, তবে এটি অ্যালগরিদম বীজ করার জন্য রয়েছে।

মানটি যদি সেই জায়গার একই হয় ('আমি' == 'আমি'), মানটি বাম পর্যন্ত তির্যক মানের সমান। দুটি স্পট যদি পৃথক ('s'! = 'কে') হয় তবে মানটি সর্বনিম্ন:

  • তির্যক উপর এবং বামে + 1 (একটি বিকল্প)
  • সরাসরি উপরে + 1 (একটি সন্নিবেশ)
  • সরাসরি বাম +1 (একটি মুছে ফেলা)

সম্পাদনা দূরত্বের ফেরতের মানটি ম্যাট্রিক্সের নীচের ডানদিকে মান।

আপনি যদি সর্বনিম্নের সাথে নীচের ডান থেকে উপরের বাম দিকে অনুসরণ করেন তবে আপনি সম্পাদনাগুলি দেখতে পাবেন:

 .kitten
.0.   .
s.1   .
i  1  .
t   1 .
t    1.
i.....2
n      2
g......3

মনে রাখবেন যে এটি বরং মেমরি নিবিড় পদ্ধতির। পূর্ণ ম্যাট্রিক্স তৈরি না করে এটিকে মেমোরি স্কোপ হ্রাস করা যায় - সমস্ত অ্যালগরিদম যত্নশীল ডেটা একটি উপসেট এবং এটি কেবল পূর্ববর্তী সারিটি সংরক্ষণ করে স্থান থেকে N*Mস্থান পর্যন্ত হ্রাস করা যেতে পারে 2*max(N,M)(এবং বর্তমানের উপর কী গণনা করা হয়েছে) সারি)। কোড প্রকল্প দেখায় এটি কীভাবে করা যায় (ডাউনলোড করার জন্য সি # কোড সহ)।

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