কয়েক মিলিয়ন রেকর্ডে আংশিক নামের মিল


10

নাম মেলানোর জন্য আমরা একটি ওয়েব ভিত্তিক অ্যাপ্লিকেশন তৈরি করেছি। এটি অংশগুলিতে নামগুলি ভেঙে পরিচালনা করে এবং প্রতিটি অংশের সাউন্ডেক্স মান একটি ডাটাবেসে সংরক্ষণ করা হয়। Levenshtein দূরত্ব মেট্রিক একটি প্রদত্ত নাম বিরুদ্ধে শব্দ শতাংশ ম্যাচিং সেইসাথে বানান প্রয়োগ করতে ব্যবহৃত হয়।

রানটাইমের সময়, আমরা সমস্ত রেকর্ড মেমোরিতে লোড করি এবং লেভেনস্টেনের দূরত্বটি সমস্ত সাউন্ডেক্সের মানগুলিতে এবং সমস্ত নামের সমস্ত অংশের বানান প্রয়োগ করি।

এটি প্রথমে কাজ করছিল কারণ সেখানে সর্বাধিক 20 হাজার নাম ছিল, কিন্তু এখন আমাদের ক্লায়েন্টের একজনের 30 মিলিয়ন নাম রয়েছে। প্রতিটি অনুরোধের জন্য মেমরিতে এই বিশাল তালিকাটি লোড করা এবং এই ধরণের ম্যাচ প্রয়োগ করা অনেক মেমরি এবং সম্পাদনের সময় ব্যবহার করে একটি করুণ হ'ল পদ্ধতি approach

আমরা সাউন্ড এবং বানানের শতকরা মিলের সাথে নিকট ভবিষ্যতে 30 মিলিয়ন রেকর্ড বা তার বেশি ডেটাবেস অনুসন্ধানের জন্য পরামর্শগুলি সন্ধান করছি।

মূল কার্যকারিতা

শেষ ব্যবহারকারী মিলে যায় এবং ন্যূনতম শতাংশে নাম প্রবেশ করায়। আমাদের ডাটাবেসে সেই সমস্ত নাম দেখানোর কথা রয়েছে যার জন্য নামের কোনও অংশ প্রদত্ত নামের কোনও অংশের সাথে প্রদত্ত শতাংশের সাথে মিলিয়ে যায়। শতাংশের সাথে মেলে যদি পুরো নামটি মিলানো হয় না তবে কোনও অংশই সাফল্য। উদাহরণ স্বরূপ.

Given Name: Helen Hunt
Name in DB: Holly Hunter 

উভয় নামের উভয় অংশই হুবহু মিলছে না কিছু পরিমাণ পর্যন্ত, আসুন আমরা 80% ধরে নিই, সুতরাং ব্যবহারকারী যদি ৮০% প্রবেশ করে তবে ডিবিতে নামটি অবশ্যই মিলের নাম হিসাবে প্রদর্শিত হবে।


1
আপনি কি এসকিউএল সার্ভার ব্যবহার করছেন? আমি দেখছি আপনি এটি এপ.নেগরে ট্যাগ করেছেন। কোনও সিএলআর সমাবেশের সম্ভাবনা ভেবে যা নেটওয়ার্ক ট্র্যাফিককে বাধা দেয় এবং এসকিউএল সার্ভারকে মেমরিটি পরিচালনা করতে দেয়।
রাবারচিকেনলিডার

@ উইন্ডআরভেন আমরা এসকিউএল সার্ভার এবং ওরাকল উভয়ই ব্যবহার করছি
বিজন

1
গুগল সমাধান করে এমন কি একই ওয়েব ক্রলিং সমস্যা নয়?
candied_orange

@ বিজন কোথায় নাম সংরক্ষণ করা হয়? তারা এসকিউএল সার্ভারে সঞ্চয় করা হয়?
রাবারচিকেনলিডার

আপনি কি খোঁজছেন? প্রদত্ত ক্যোয়ারির সাথে মেলে শীর্ষ 100 নাম?
ডক ব্রাউন

উত্তর:


6

আপনার যা প্রয়োজন তার সম্পূর্ণ বিবরণ না জেনে আপনি সম্ভবত নিম্নলিখিতগুলির মধ্যে একটি করতে চান:

স্পিঙ্ক্স ইনস্টল এবং কনফিগারেশনে কী জড়িত তা আমি পুরোপুরি জানি না; তবে, আমি ইমপ্রেশনের আওতায় আছি আপনি এটি একটি ডেটাবেজে নির্দেশ করতে পারেন, কোন ক্ষেত্রকে সূচী করতে হবে, কীভাবে ফলাফলকে ওজন করতে হবে এবং এটি আপনাকে মিলে যাওয়া রেকর্ডগুলির একটি আদেশিত তালিকা প্রদান করবে।

ব্যবহারকারী-মুখোমুখি বা মিশন সমালোচনামূলক জিনিসগুলির জন্য, একটি বিদ্যমান অনুসন্ধান সরঞ্জামটি ব্যবহার করুন।

যদি আপনি কেবল একাডেমিক বোধ করছেন ... এনজিআরএম দিয়ে খেলুন:

একটি এনজিআরএম অনুসন্ধান সারণীটি আপনার সম্ভাব্য মিলগুলির প্রাথমিক সেট হিসাবে কাজ করতে পারে এবং আপনি ফলগুলি ছাঁটাই এবং সাজানোর জন্য লেভেনস্টাইন দূরত্ব ব্যবহার করতে পারেন।

ধরে নিই যে আপনি অনুসন্ধান করতে চান people, আপনি এর মতো কিছু করতে পারেন:

_ people _________
personId: int
name: varchar
soundex_name: varchar

_ people_ngrams __
personId: int
ngramId: int

_ ngrams _________
ngramId: int
ngram: char(3)
count: int

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

search_ngrams = ngrammify(soundex(search_string));

notable_ngrams = select top 10 *
  from ngrams
  where ngram in (search_ngrams)
  order by count asc;

possible_matches = select top 1000 distinct people.*
  from people_ngrams, people
  where ngramId in (notable_ngrams);

best_matches = top 100 possible_matches
  ordered by Levenshtein_distance(match, soundex(search_string));

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

এখন, আমার ক্ষেত্রে, আমি কয়েক মিলিয়ন রেকর্ডের সাথে মিলে যাচ্ছি না, আমি প্রত্যেকে কয়েক হাজার রেকর্ডের ক্রম অনুসারে দুটি ডেটা সেটগুলির মধ্যে সবচেয়ে ভাল সম্ভাব্য সংশ্লেষগুলি নির্বাচন করতে চাইছিলাম। এবং, আমরা চেয়েছিলাম যে এটি মোটামুটি দ্রুত কাজ করবে - কয়েক মিনিটের মধ্যে। (দ্রুত, 100,000 * 100,000 কী?) এবং, আমরা সফল হয়েছি।

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

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

স্পিনক্স বা লুসিনের মতো ।


আমি স্ফিংস ২.২.১১-প্রকাশের রেফারেন্স ম্যানুয়ালটিতে কেবল अस्पष्ट অনুসন্ধান করেছি এবং মনে হচ্ছে এটি আংশিক শব্দের সাথে মিলে যাওয়ার সময় এটি সঠিক শব্দের সাথে মেলে। আমি এই সম্পর্কে ভুল হলে আমাকে সংশোধন করুন।
বাজন

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

@bjan ওহ, আমি এছাড়াও সম্পূর্ণভাবে সম্পর্কে ভুলে গেছি Lucene । আমি নিশ্চিত না যে এটি আপনার যা প্রয়োজন প্রয়োজন তা করে; তবে এটি বেশ রঞ্জক জনপ্রিয় এবং আপনি নিজের রোল করার আগে তা দেখার মতো। লুসিনের ডক্সে লেভেনস্টাইন স্ট্রিংয়ের দূরত্ব ব্যবহার করে অস্পষ্ট অনুসন্ধান এবং র‌্যাঙ্কিংয়ের উল্লেখ রয়েছে।
এসভিডজেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.