এটি আমি যে গবেষণা প্রকল্পের মধ্য দিয়ে যাচ্ছি তার মধ্যে একটি। প্রয়োজনীয়তাটি প্রায় আপনার মতোই এবং সমস্যাটি সমাধান করার জন্য আমরা দুর্দান্ত অ্যালগরিদম তৈরি করেছি।
ইনপুট
ইনপুটটি ইংরেজী শব্দ বা বাক্যাংশগুলির অন্তহীন স্ট্রিম (আমরা তাদের হিসাবে উল্লেখ করি tokens
)।
আউটপুট
- আউটপুট শীর্ষ এন টোকেন আমরা এখন পর্যন্ত দেখেছি (আমরা দেখেছি সমস্ত টোকেন থেকে!)
- Dayতিহাসিক উইন্ডোতে আউটপুট শীর্ষ এন টোকেন, বলুন, গত দিন বা গত সপ্তাহে।
এই গবেষণার একটি অ্যাপ্লিকেশন হ'ল টুইটার বা ফেসবুকে হট টপিক বা বিষয়ের প্রবণতা খুঁজে পাওয়া। আমাদের ওয়েবসাইটে একটি ক্রোলার রয়েছে যা ওয়েবসাইটে ক্রল করে, যা শব্দের একটি প্রবাহ তৈরি করে, যা সিস্টেমে ফিড করবে will এরপরে সিস্টেমটি সামগ্রিকভাবে বা historতিহাসিকভাবে শীর্ষ ফ্রিকোয়েন্সি এর শব্দ বা বাক্যগুলি আউটপুট দেবে। গত দু'সপ্তাহ ধরে ভাবুন, "বিশ্বকাপ" শব্দটি টুইটারে বহুবার প্রকাশিত হবে। "পল দি অক্টোপাস "ও তাই করে। :)
পূর্ণসংখ্যা মধ্যে স্ট্রিং
সিস্টেমের প্রতিটি শব্দের জন্য একটি পূর্ণসংখ্যা আইডি রয়েছে। যদিও ইন্টারনেটে প্রায় অসীম সম্ভাব্য শব্দ রয়েছে তবে প্রচুর শব্দের সংশ্লেষের পরে নতুন শব্দ খুঁজে পাওয়ার সম্ভাবনা কম এবং নিম্নতর হয়। আমরা ইতিমধ্যে 4 মিলিয়ন বিভিন্ন শব্দ খুঁজে পেয়েছি এবং প্রত্যেকটির জন্য একটি অনন্য আইডি নির্ধারণ করেছি। এই পুরো ডেটা সেটটি প্রায় 300MB মেমরি গ্রহণ করে হ্যাশ টেবিল হিসাবে মেমরিতে লোড করা যায়। (আমরা আমাদের নিজস্ব হ্যাশ টেবিলটি প্রয়োগ করেছি Java জাভা বাস্তবায়ন বিশাল মেমরির ওভারহেড নেয়)
প্রতিটি বাক্যটি তখন পূর্ণসংখ্যার অ্যারে হিসাবে চিহ্নিত করা যায়।
এটি গুরুত্বপূর্ণ, কারণ স্ট্রিংয়ের চেয়ে বাছাই এবং সংখ্যার তুলনা অনেক দ্রুত
সংরক্ষণাগার ডেটা
সিস্টেম প্রতিটি টোকেনের জন্য সংরক্ষণাগার ডেটা রাখে। মূলত এটি জোড়া (Token, Frequency)
। যাইহোক, ডেটা সংরক্ষণ করে এমন টেবিলটি এত বিশাল হবে যে আমাদের টেবিলটি শারীরিকভাবে ভাগ করতে হবে। একবার পার্টিশন প্রকল্পটি টোকেনের এনজিগ্রামের উপর ভিত্তি করে তৈরি হয়। টোকেনটি যদি একক শব্দ হয় তবে এটি 1 গ্রাম। যদি টোকেনটি দ্বি-শব্দের বাক্যাংশ হয় তবে এটি 2 গ্রাম। এবং এই যায়। প্রায় 4gram এ আমাদের প্রায় 1 বিলিয়ন রেকর্ড রয়েছে, প্রায় 60 গিগাবাইটের টেবিলের আকার রয়েছে।
আগত স্ট্রিমগুলি প্রক্রিয়াজাতকরণ
মেমরি সম্পূর্ণরূপে ব্যবহার না হওয়া অবধি সিস্টেম আগত বাক্যগুলিকে শোষণ করবে (হ্যাঁ, আমাদের একটি মেমোরি ম্যানেজার দরকার)। এন বাক্যগুলি গ্রহণ এবং স্মৃতিতে সঞ্চয় করার পরে, সিস্টেমটি বিরতি দেয় এবং প্রতিটি বাক্যকে শব্দ এবং বাক্যাংশগুলিতে টোকেনাইজ করতে শুরু করে। প্রতিটি টোকেন (শব্দ বা বাক্যাংশ) গণনা করা হয়।
অত্যন্ত ঘন ঘন টোকেনগুলির জন্য, এগুলি সর্বদা স্মৃতিতে রাখা হয়। কম ঘন ঘন টোকেনের জন্য, তারা আইডিগুলির ভিত্তিতে বাছাই করা হয় (মনে রাখবেন আমরা স্ট্রিংটিকে পূর্ণসংখ্যার অ্যারেতে অনুবাদ করি), এবং একটি ডিস্ক ফাইলে সিরিয়ালাইজ করা হয়।
(তবে, আপনার সমস্যার জন্য, যেহেতু আপনি কেবল শব্দের গণনা করছেন, তবে আপনি সমস্ত শব্দ-ফ্রিকোয়েন্সি মানচিত্র কেবল মেমরিতে রেখে দিতে পারেন carefully স্ট্রিংগুলি উপস্থাপন করুন), এবং এটি অনেকটা গ্রহণযোগ্য।
এদিকে, আরও একটি প্রক্রিয়া থাকবে যা একবার এটি সিস্টেম দ্বারা উত্পন্ন কোনও ডিস্ক ফাইল সন্ধান করার পরে সক্রিয় হয় এবং তারপরে এটি মার্জ করা শুরু করে। যেহেতু ডিস্ক ফাইলটি বাছাই করা হয়েছে, একত্রীকরণটি মার্জ সাজানোর মতো একই প্রক্রিয়া গ্রহণ করবে। কিছু ডিজাইনেরও এখানে যত্ন নেওয়া দরকার, যেহেতু আমরা অনেক বেশি এলোমেলো ডিস্ক সন্ধান করতে চাই। ধারণাটি হ'ল একই সাথে পঠন (মার্জ প্রক্রিয়া) / রাইটিং (সিস্টেম আউটপুট) এড়ানো এবং আলাদা ডিস্কে লেখার সময় মার্জ প্রক্রিয়াটি একটি ডিস্ক ফর্মটি পড়তে দেয়। এটি লকিং বাস্তবায়নের মতো।
দিনের সমাপ্তি
দিনের শেষে, সিস্টেমে মেমোরিতে সংরক্ষিত ফ্রিকোয়েন্সি সহ অনেকগুলি ঘন ঘন টোকন থাকবে এবং কয়েকটি অন্যান্য ডিস্ক ফাইলগুলিতে সঞ্চিত অন্যান্য কম ঘন ঘন টোকন থাকবে (এবং প্রতিটি ফাইল সাজানো থাকে)।
সিস্টেমটি ইন-মেমরি মানচিত্রটিকে একটি ডিস্ক ফাইলে ফ্লাশ করে (এটি সাজান)। এখন, সমস্যাটি বাছাই করা ডিস্ক ফাইলের একটি সেট মার্জ হয়ে যায়। অনুরূপ প্রক্রিয়া ব্যবহার করে, আমরা শেষে একটি বাছাই করা ডিস্ক ফাইল পাবেন।
তারপরে, চূড়ান্ত কাজটি হ'ল বাছাই করা ডিস্ক ফাইলটি সংরক্ষণাগার ডাটাবেসে মার্জ করা। সংরক্ষণাগার ডাটাবেসের আকারের উপর নির্ভর করে, অ্যালগরিদম নীচের মতো কাজ করে যদি এটি যথেষ্ট বড় হয়:
for each record in sorted disk file
update archive database by increasing frequency
if rowcount == 0 then put the record into a list
end for
for each record in the list of having rowcount == 0
insert into archive database
end for
স্বজ্ঞাততাটি হ'ল কিছু সময়ের পরে, সন্নিবেশের সংখ্যাটি আরও ছোট হয়ে উঠবে। আরও এবং আরও বেশি অপারেশন কেবল আপডেট করা হবে। এবং এই আপডেটটি সূচক দ্বারা দন্ডিত হবে না।
আশা করি এই পুরো ব্যাখ্যাটি সাহায্য করবে। :)
what is the most frequent item in the subsequence [2; 2; 3; 3; 3; 4; 4; 4; 4; 5; 5] of your sequence?