স্ট্রিং মিলের জন্য আপনি কোন অ্যালগরিদম সেরা ব্যবহার করবেন?


23

আমি ঠিকানার ভিত্তিতে বিভিন্ন ওয়েব পৃষ্ঠায় অনন্যভাবে সামগ্রী সনাক্ত করতে একটি প্লাগইন ডিজাইন করছি।

সুতরাং আমার একটি ঠিকানা থাকতে পারে যা দেখতে দেখতে পাওয়া যায়:

1 someawesome street, anytown, F100 211

পরে আমি এই ঠিকানাটি কিছুটা ভিন্ন বিন্যাসে পেতে পারি।

1 someawesome street, F100 211,

বা সম্ভবত হিসাবে অস্পষ্ট

someawesome street F100

এগুলি প্রযুক্তিগতভাবে একই ঠিকানা, তবে একই স্তরের মিল। আমি ক) দেখতে চাই যে প্রতিটি অবস্থানের জন্য চেহারা সম্পাদনের জন্য একটি অনন্য শনাক্তকারী তৈরি করা এবং খ) যখন খুব অনুরূপ ঠিকানাটি প্রদর্শিত হবে তখন চিত্র বের করুন।

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


"লেভেনস্টেইন দূরত্ব" কোনও অ্যালগরিদম নয়।
gnasher729

আপনি কিছু বেসিক পার্সিংয়ের পরিচয় না দিলে কাঁচা লেভেনস্টেইন দূরত্ব এত সুন্দর হবে না। আপনার রাস্তার নাম, শহরের নাম ইত্যাদি হতে পারে এবং রাস্তার নাম বা জিপ কোড হতে পারে এমন শব্দগুলি অন্তত সনাক্ত করার চেষ্টা করা উচিত। তারপরে সম্ভবত এগুলিতে আসল স্থান / রাস্তার নাম দ্বারা খাওয়ানো কিছু পরিসংখ্যানমূলক ফাজি ম্যাচারের সাথে লেভেনস্টেইন প্রয়োগ করুন। কোনও সহজ জিনিস নয় :)

7
@ গ্যাশনার: তবে লেভেনস্টাইন দূরত্বকে গণনা করে এমন একটি ফাংশন হল একটি অ্যালগরিদম। এই জাতীয় কোনও ক্রিয়াকলাপ ছাড়াই লেভেনস্টাইন দূরত্ব নিছক বৌদ্ধিক কৌতূহল।
রবার্ট হার্ভে

আমি উদাহরণগুলির সাথে এখানে খুব ব্যবহারিক ব্যাখ্যা পেয়েছি: অ্যালগরিটিহমের তুলনা । উপসংহারে, তারা লেওস্টেস্টিনের অ্যালগোরিদম স্ট্রিংয়ের দৈর্ঘ্যের উপর নির্ভরশীল বলে জারো-উইঙ্কলারের মিলটি ব্যবহার করার পরামর্শ দেয় , সুতরাং এটি তুলনা করা কার্যকর নয়।
সান্দ্রা Meneses

উত্তর:


14

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

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

আমি মনে করি না পুরো স্ট্রিংগুলিতে দূরত্ব প্রয়োগ করা ভাল ধারণা কারণ সময়টির সাথে তুলনা করে স্ট্রিংয়ের দৈর্ঘ্যের সাথে আকস্মিক বৃদ্ধি ঘটে। তবে আরও খারাপ, যখন জিপের মতো ঠিকানা উপাদানগুলি সরানো হয়, সম্পূর্ণ ভিন্ন ঠিকানাগুলি আরও ভাল মেলে ( অনলাইন লেভেনস্টাইন ক্যালকুলেটর ব্যবহার করে মাপা ):

1 someawesome street, anytown, F100 211       (reference) 
1 someawesome st.,anytown                     (difference of 15, same address)     
1 otherplaces street,anytown,F100211          (difference of 13, different ddress) 
1 sameawesome street, othertown, CA98200      (difference of 13, different ddress)
anytown, 1 someawesome street                 (28 different same address)
anytown, F100 211, 1 someawesome street       (37 different same address)

এই প্রভাবগুলি ছোট রাস্তার নামের জন্য আরও খারাপ হতে থাকে।

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

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


তুলনার আগে উভয় তুলনা স্ট্রিং বাছাই সম্পর্কে? আমি খুঁজে পেয়েছি যে এটি স্থানান্তরণে সহায়তা করতে পারে।
ওপেনভনক

2

লেভেনস্টাইন দূরত্ব শব্দের জন্য ভাল

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

অথবা আপনি বিনামূল্যে Lucene ব্যবহার করতে পারেন। আমি মনে করি তারা কোসাইন মিল রয়েছে।


1

প্রথমত, আপনাকে ঠিকানার জন্য ওয়েবপৃষ্ঠাটি বিশ্লেষণ করতে হবে, RegEx এমন একটি লিখেছেন যা RegEx ব্যবহার করে ঠিকানাগুলি পার্স করা খুব কঠিন হতে পারে। আপনার সম্ভাব্য সম্বোধন ফর্ম্যাটগুলির একটি তালিকা এবং এগুলির সাথে মেলে দুর্দান্ত এক বা একাধিক অভিব্যক্তিগুলির তালিকাটি শেষ করতে হবে। আমি ঠিকানা পার্সিংয়ের সাথে খুব বেশি পরিচিত নই, তবে আমি এই প্রশ্নটি একবারে দেখার পরামর্শ দিচ্ছি যা অনুরূপ চিন্তার রেখাটি অনুসরণ করে: ফ্রিফর্ম পাঠ্যের জন্য সাধারণ ঠিকানা পার্সার।

লেভেনস্টাইন দূরত্ব দরকারী তবে কেবলমাত্র আপনি তার অংশগুলিতে পৃথক করার পরে। নিম্নলিখিত ঠিকানাগুলি বিবেচনা করুন। 123 someawesome st.এবং 124 someawesome st.এই ঠিকানাগুলি সম্পূর্ণ ভিন্ন অবস্থানে, কিন্তু তাদের Levenshtein দূরত্ব শুধুমাত্র 1. এই এছাড়াও ভালো কিছু প্রয়োগ করা যেতে পারে 8th st.এবং 9th st.একই রাস্তার নামগুলি সাধারণত একই ওয়েব পেজ প্রদর্শিত না, কিন্তু এটা যে শোনা নয়। কোনও স্কুলের ওয়েবপৃষ্ঠায় উদাহরণস্বরূপ রাস্তা জুড়ে লাইব্রেরির ঠিকানা থাকতে পারে, বা চার্চটি কয়েক ব্লক নীচে। এর অর্থ হ'ল লেভেনস্টাইন দূরত্বের একমাত্র ডেটাটি 2 ডেটা পয়েন্টের মধ্যে দূরত্ব যেমন রাস্তায় এবং শহরের মধ্যে দূরত্ব easily

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

StreetNumber < Street < City < State < Country

এটি খুব কমই ঘটে, যদি ঠিকানাটি এক ক্ষেত্র থেকে অন্য একটি সংলগ্ন ক্ষেত্রে ছেড়ে যায়। আপনি প্রায়শই কোনও রাস্তায় দেশ বা স্ট্রিট নাম্বার নগরটি দেখতে পাচ্ছেন না।


2
রাস্তার ঠিকানাগুলি নিয়মিত নয় এবং নিয়মিত প্রকাশের মাধ্যমে নির্ভরযোগ্যভাবে পার্স করা যায় না cept তারা নিখরচায় পাঠ্যে এম্বেড থাকলে অবশ্যই তাদের সঠিকভাবে চিহ্নিত করা যায় না। আপনি কোথায় খুঁজছেন তা যদি আপনি ইতিমধ্যে জানেন তবে আপনি অবশ্যই বিভিন্ন সাধারণ ফর্ম্যাটের সাথে মেলে কয়েকটি পৃথক নিয়মিত প্রকাশ লিখতে পারেন।
অকেজো

@ ইউসলেস এটি সত্য। এটি তাত্ত্বিকভাবে কার্যকর, তবে আমি এটিতে যে পরিমাণ কাজের দরকার তা হ্রাস করেছি। বিশেষত যখন সম্ভাব্যতর উন্নত বিকল্পগুলি উপলব্ধ থাকে। আমি এই প্রতিফলিত করতে আমার উত্তর সংশোধন করেছি।
ইউসেনা

1

আপনি স্ট্রিং মিল অ্যালগরিদম সম্পর্কে জিজ্ঞাসা করেন তবে আপনার স্ট্রিংগুলি ঠিকানা। আমি গুগল প্লেস অনুসন্ধানের মতো কোনও অবস্থানের এপিআইগুলিতে ঠিকানাগুলি জমা দেব এবং formatted_addressতুলনার বিন্দু হিসাবে এটি ব্যবহার করব । এটি সবচেয়ে সঠিক পদ্ধতির মতো বলে মনে হচ্ছে।

ঠিকানাগুলির স্ট্রিংগুলির জন্য যা কোনও এপিআই এর মাধ্যমে অবস্থিত করা যায় না, আপনি তারপরে আবার মিলের অ্যালগরিদমে ফিরে যেতে পারেন।


1
+1 এটি আউটসোর্স করুন যাতে আপনার পক্ষে কাজটি করার জন্য বিশেষজ্ঞদের শক্তি পান। গুগল হতে হবে না কারণ সেখানে কয়েকটি পরিষেবা সরবরাহকারী রয়েছে। ঠিকানার ঠিকানা মিলানো যদি আপনার মূল ব্যবসা না হয় তবে এটি করার জন্য আপনার সময় নষ্ট করবেন না।
LoztInSpace

0

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

লাইন সম্পাদনার দূরত্ব, একটি ফাংশন হিসাবে, "এই দুটি শব্দের চেয়ে কতটা আলাদা" ফিরে আসতে পারে।

"ডগমা" এবং "কুকুর" এর মতো একটি শব্দ, আপনি 3 এর মান (3 অতিরিক্ত অক্ষরের জন্য) ফিরে পাবেন।

বা "বিড়াল" এবং "টুপি", 1 এর মান (একটি ভিন্ন চরিত্রের জন্য) ফিরে পান।

(সূত্র: https://en.wikedia.org/wiki/Edit_distance )


2
ওপির উল্লিখিত লেভেনস্টেইনের উপরে কী সুবিধা রয়েছে?
ক্রিস্টোফ

-1

প্রকৃতপক্ষে কিছু দূরত্ব ফাংশন ব্যবহার করা একটি ভাল পদ্ধতির মত বলে মনে হচ্ছে। তবে সমস্যাটি হল কোনও প্রদত্ত ঠিকানা থেকে নিকটতম স্ট্রিংটি সন্ধান করা, যা তুচ্ছ থেকে অনেক দূরে।

আপনি এখানে অ্যালগরিদমের বিস্তৃত বিভাগের বর্ণনা দিচ্ছেন। পরীক্ষা করে দেখুন নিয়ারেস্ট অনুসন্ধান

একটি মন্তব্যে উল্লিখিত হিসাবে, আপনি যদি ঠিকানার উপাদানগুলি (রাস্তার নাম, নম্বর, ইত্যাদি) আলাদা করার কোনও উপায় খুঁজে পান তবে এটি কাজটি আরও সহজ করে তুলবে।


-1

অ্যাড্রেস দিয়ে চেষ্টা করার জন্য লম্বেস্টকমনসউবসেসেন্স (অ্যাপাচি কমন্স-টেক্সট থেকে) অন্য পদ্ধতি হতে পারে। যদি আপনি " সাধারণ সাবকোয়েন্স দৈর্ঘ্য / সর্বাধিক (ঠিকানা দৈর্ঘ্য) " এর অনুপাত হিসাবে দুটির মিলকে সংজ্ঞায়িত করেন তবে আপনি সহনশীলতা প্রান্তিকতা প্রয়োগ করতে পারেন - উদাহরণস্বরূপ 0.8 যা ম্যাচ / কোনও মিলের সংজ্ঞা দেয় না। এইভাবে এটি আপনাকে " 1 অবিস্মরণীয় st।, যে কোনও শহরে " এবং " 1 অবিস্মরণীয় রাস্তায়,, যে কোনও শহরে " এর মতো ঠিকানাগুলি মেলাতে অনুমতি দেবে ।

এটি সুপার ফাস্ট অ্যালগরিদম নয়, তাই তুলনা কমাতে আপনি দ্রুত ব্যর্থব্যাকগুলি প্রয়োগ করতে চাইতে পারেন। উদাহরণটি হ'ল - জিপ কোডগুলি মেলে না, বা কেবলমাত্র অঙ্কের অঙ্কটি ভিন্ন হয় তবে তুলনা এড়ান।

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