আমার কাছে পাঠ্য দলিল রয়েছে যা মূলত আইটেমের তালিকা থাকে।
প্রতিটি আইটেম বিভিন্ন ধরণের বিভিন্ন টোকেনের একটি গ্রুপ: ফার্স্টনাম, লাস্টনেম, জন্ম তারিখ, ফোন নম্বর, শহর, পেশা, ইত্যাদি etc. একটি টোকেন শব্দের একটি গ্রুপ group
আইটেম বিভিন্ন লাইনে থাকা থাকতে পারে।
কোনও দস্তাবেজের আইটেমগুলির প্রায় একই টোকেন সিনট্যাক্স রয়েছে তবে অগত্যা তাদের অবশ্যই একইরকম হতে হবে না same
এগুলি আইটেমগুলির পাশাপাশি আইটেমগুলির মধ্যে কিছু বেশি / কম টোকেন হতে পারে।
FirstName LastName BirthDate PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber
Occupation UnrecognizedToken
FirstName LastName PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber
City Occupation
লক্ষ্যটি ব্যবহৃত ব্যাকরণ সনাক্তকরণ, উদাহরণস্বরূপ
Occupation City
এবং শেষ পর্যন্ত সমস্ত আইটেম সনাক্ত করুন, এমনকি তারা ভেবেছিলেন যে তারা ঠিক মেলে না।
সংক্ষিপ্ত এবং পঠনযোগ্য থাকার জন্য, সেই টোকেন প্রকারগুলি নির্দিষ্ট করার জন্য আসুন পরিবর্তে কিছু এল, এ, বি, সি, ডি, ... ব্যবহার করুন।
যেমন
A B C
D F
A B C
D E F
F
A B C
D E E F
A C B
D E F
A B D C
D E F
A B C
D E F G
এখানে আমরা দেখতে পাচ্ছি যে আইটেম সিনট্যাক্সটি
A B C
D E F
কারণ এটি একের সাথে সেরা সিকোয়েন্সের সাথে মেলে।
সিনট্যাক্স (টোকেনের ধরণ এবং অর্ডার) এক নথি থেকে অন্য দস্তাবেজে অনেকগুলি পরিবর্তিত হতে পারে। যেমন অন্য কোনও নথিতে সেই তালিকা থাকতে পারে
D A
D A
D
D A
B
D A
লক্ষ্যটি হ'ল এই সিনট্যাক্সটি সম্পর্কে পূর্বের জ্ঞান ছাড়াই বের করা ।
এখন থেকে, একটি নতুন লাইন পাশাপাশি একটি টোকেন হিসাবে বিবেচিত হয়। তারপরে একটি দস্তাবেজ টোকেনের 1-মাত্রিক ক্রম হিসাবে উপস্থাপিত হতে পারে:
এখানে পুনরাবৃত্তি ক্রম হবে A B C B
কারণ এটি টোকেন যা সর্বনিম্ন বিবাদ সৃষ্টি করে।
এর কিছুটা জটিল করা যাক। এখন থেকে প্রতিটি টোকেনের কোনও নির্ধারিত প্রকার নেই। বাস্তব বিশ্বে আমরা কিছু টোকেনের ধরণের সম্পর্কে সর্বদা 100% নিশ্চিত নই। পরিবর্তে, আমরা এটিকে একটি নির্দিষ্ট ধরণের থাকার সম্ভাবনা দিয়ে থাকি।
A 0.2 A 0.0 A 0.1
B 0.5 B 0.5 B 0.9 etc.
C 0.0 C 0.0 C 0.0
D 0.3 D 0.5 D 0.0
এখানে আমি কী অর্জন করতে চাই তার একটি বিমূর্ত গ্রাফিক:
সমাধান হিসাবে বিবেচিত A: টোকেনগুলির এক প্যাচ কনভলিউশন
এই সমাধানটি টোকেনের কয়েকটি প্যাচগুলির সাথে একটি সমাবর্তন প্রয়োগ করে এবং সর্বনিম্ন দ্বন্দ্ব তৈরি করে এমন একটি গ্রহণ করে।
এখানে শক্ত অংশটি পর্যবেক্ষণের ক্রম বরাবর সম্ভাব্য প্যাচগুলি সন্ধান করা। এটির জন্য কয়েকটি ধারণা, তবে খুব সন্তোষজনক কিছু নয়:
টোকেনগুলির মধ্যে রূপান্তরটির একটি মার্কভ মডেল তৈরি করুনখসড়া: যেহেতু একটি মার্কভ মডেলের কোনও স্মৃতি নেই, তাই আমরা ক্রান্তির আদেশ হারাব। উদাহরণস্বরূপ যদি পুনরাবৃত্তি ক্রম হয় A B C B D
, আমরা সি-> বি এর আগে A-> বি ঘটে যায় তা হারিয়ে ফেলি।
এটি ডিএনএ / আরএনএতে নিউক্লিওব্যাসগুলি (জিটিএসি) বিশ্লেষণের জন্য জীববিজ্ঞানে ব্যাপকভাবে ব্যবহৃত হয়েছে বলে মনে হয়। খসড়া: প্রত্যয় গাছগুলি হুবহু টোকেনের (যেমন অক্ষর) মিলের জন্য ভাল। আমাদের কাছে সঠিক ক্রম বা সঠিক টোকেন নেই।
পাশবিক বলপ্রতিটি আকারের প্রতিটি সমন্বয় চেষ্টা করুন। আসলে কাজ করতে পারে তবে কিছুটা সময় (দীর্ঘ) লাগবে।
বি হিসাবে বিবেচিত সমাধান: প্রত্যয়গুলির লেভেনস্টেইন দূরত্বের একটি সারণী তৈরি করুন
স্বজ্ঞাততাটি হ'ল প্রতিটি প্রত্যয় থেকে প্রতিটি প্রত্যয় থেকে দূরত্ব গণনা করার সময় কিছু দূরত্বের স্থানীয় মিনিমা থাকতে পারে।
দূরত্বের কার্যটি লেভেনস্টেইন দূরত্ব, তবে প্রতিটি টোকেনের জন্য নির্দিষ্ট ধরণের পরিবর্তে নির্দিষ্ট ধরণের হওয়ার সম্ভাবনা বিবেচনায় নিতে আমরা ভবিষ্যতে এটি কাস্টমাইজ করতে সক্ষম হব।
এই প্রদর্শনীতে সরল থাকার জন্য, আমরা নির্দিষ্ট ধরণের টোকেন ব্যবহার করব এবং টোকেনগুলির মধ্যে দূরত্ব গণনা করতে ক্লাসিক লেভেনস্টাইন ব্যবহার করব।
যেমন এর ইনপুট ক্রম আছে ABCGDEFGH ABCDEFGH ABCDNEFGH
।
আমরা প্রতিটি প্রত্যয়ের দূরত্বকে প্রতিটি প্রত্যয় দিয়ে গণনা করি (সমান আকারের হয়েছি):
for i = 0 to sequence.lengh
for j = i to sequence.lengh
# Create the suffixes
suffixA = sequence.substr(i)
suffixB = sequence.substr(j)
# Make the suffixes the same size
chunkLen = Math.min(suffixA.length, suffixB.length)
suffixA = suffixA.substr(0, chunkLen)
suffixB = suffixB.substr(0, chunkLen)
# Compute the distance
distance[i][j] = LevenshteinDistance(suffixA, suffixB)
আমরা উদাহরণস্বরূপ নিম্নলিখিত ফলাফল পেয়েছি (সাদা ছোট দূরত্ব, কালো বড়):
এখন, এটি সুস্পষ্ট যে নিজের তুলনায় যে কোনও প্রত্যয়টির নਾਲ দূরত্ব থাকবে। তবে আমরা প্রত্যয়টি (সঠিক বা আংশিক) নিজের সাথে মিলে আগ্রহী নই, সুতরাং আমরা সেই অংশটি ক্রপ করি।
যেহেতু প্রত্যয়গুলি একই আকারে ক্রপ করা হয়, লম্বা স্ট্রিং তুলনা করা সর্বদা ছোট স্ট্রিংগুলির সাথে তুলনা করার চেয়ে একটি বড় দূরত্ব অর্জন করবে।
আমাদের ক্ষতিপূরণ করতে হবে ডান (+ পি) থেকে শুরু করে মসৃণ জরিমানার মাধ্যমে, বামে রৈখিকভাবে বিলীন হয়ে যাওয়া।
আমি এখনও নিশ্চিত নই যে কীভাবে একটি ভাল পেনাল্টি ফাংশন চয়ন করতে হবে যা সমস্ত ক্ষেত্রে উপযুক্ত হবে।
এখানে আমরা চরম ডানদিকে একটি (+ পি = 6) জরিমানা প্রয়োগ করি, 0 থেকে বামদিকে বিবর্ণ হয়ে।
এখন আমরা পরিষ্কারভাবে 2 টি পরিষ্কার তির্যক রেখা উত্সাহ দেখতে পাচ্ছি। সেই অনুক্রমে 3 টি আইটেম (আইটেম 1, আইটেম 2, আইটেম 3) রয়েছে। দীর্ঘতম রেখাটি আইটেম 1 বনাম আইটেম 2 এবং আইটেম 2 বনাম আইটেম 3 এর মধ্যে মিলটি উপস্থাপন করে। দ্বিতীয় দীর্ঘতমটি আইটেম 1 বনাম আইটেম 3 এর মধ্যে মিলটি উপস্থাপন করে।
এখন আমি সেই ডেটা ব্যবহারের সর্বোত্তম উপায় সম্পর্কে নিশ্চিত নই। এটি কি সর্বোচ্চ তির্যক রেখা নেওয়ার মতো সহজ?
ধরা যাক এটিই আছে।
আসুন প্রতিটি টোকেন থেকে শুরু হওয়া তির্যক রেখার গড় মান গণনা করি। আমরা নিম্নলিখিত ছবিতে ফলাফল দেখতে পাচ্ছি (ম্যাট্রিক্সের নীচে ভেক্টর):
স্পষ্টত 3 স্থানীয় মিনিমা রয়েছে, যা প্রতিটি আইটেমের শুরুতে মেলে। দুর্দান্ত লাগছে!
এবার ক্রমে আরও কিছু অপূর্ণতা যুক্ত করা যাক:
ABCGDEFGH ABCDEFGH TROLL ABCDEFGH
স্পষ্টতই এখন, আমাদের তিরুনিক গড়ের ভেক্টর গন্ডগোল করে ফেলেছে এবং আমরা এটির আর ব্যবহার করতে পারি না ...
আমার ধারণাটি হ'ল এটি কোনও কাস্টমাইজড দূরত্ব ফাংশন (লেভেনস্টেইনের পরিবর্তে) দ্বারা সমাধান করা যেতে পারে, যেখানে পুরো ব্লকের সন্নিবেশ এতটা শাস্তিযোগ্য হতে পারে না। এটাই আমি নিশ্চিত নই।
উপসংহার
অন্বেষিত সমঝোতা-ভিত্তিক সমাধানগুলির কোনওটিই আমাদের সমস্যার সাথে খাপ খায় না বলে মনে হয়।
লেভেনস্টাইন-দূরত্ব-ভিত্তিক সমাধানটি আশাব্যঞ্জক বলে মনে হচ্ছে, বিশেষত কারণ এটি সম্ভাবনা-ভিত্তিক-ধরনের টোকেনগুলির সাথে সামঞ্জস্যপূর্ণ। তবে এর ফলাফল কীভাবে কাজে লাগানো যায় সে সম্পর্কে আমি এখনও নিশ্চিত নই।
আপনার যদি কোনও সম্পর্কিত ক্ষেত্রে অভিজ্ঞতা থাকে এবং আমাদের কয়েক ঘন্টা ভাল ইঙ্গিত দিতে বা এক্সপ্লোর করার জন্য অন্যান্য কৌশল থাকে তবে আমি খুব কৃতজ্ঞ হব। আগাম অনেক ধন্যবাদ।