জাভাস্ক্রিপ্টের অস্পষ্ট অনুসন্ধান যা বোঝায়


104

আমি একটি অ্যারের ফিল্টার করার জন্য একটি अस्पष्ट অনুসন্ধান জাভাস্ক্রিপ্ট লাইব্রেরি খুঁজছি। আমি fuzzyset.js এবং fuse.js ব্যবহার করার চেষ্টা করেছি , তবে ফলাফলগুলি ভয়াবহ (এমন কোনও ডেমো রয়েছে যা আপনি লিঙ্কযুক্ত পৃষ্ঠাগুলিতে চেষ্টা করতে পারেন)।

লেভেনস্টেইন দূরত্বে কিছু পঠন করার পরে, ব্যবহারকারীরা টাইপ করার সময় তারা কী খুঁজছেন তার দুর্বলতা হিসাবে এটি আমাকে আঘাত করে। যারা জানেন না তাদের জন্য, সিস্টেমটি গণনা করে যে দুটি স্ট্রিং ম্যাচ করার জন্য কতগুলি সন্নিবেশ , মুছে ফেলা এবং বিকল্পগুলি প্রয়োজন।

এক সুস্পষ্ট ত্রুটি, যা Levenshtein-Demerau মডেল সংশোধন করা হয়েছে, যে উভয় blub এবং দোষ সমানভাবে অনুরূপ বলে মনে করা হয় কন্দ (প্রতিটি দুই বদল প্রয়োজন)। এটা তোলে হয় পরিষ্কার, তবে, যে বাল্ব আরো অনুরূপ blub চেয়ে দোষ , এবং মডেল আমি শুধু উল্লেখ স্বীকার যে জন্য অনুমতি দিয়ে transpositions

আমি টেক্সট সমাপ্তির প্রেক্ষাপটে এই ব্যবহার করতে চান তাই যদি আমি একটি অ্যারে আছে, ['international', 'splint', 'tinder']এবং আমার প্রশ্নের সাথে হয় int- এ , আমি মনে করি আন্তর্জাতিক তার থেকে উঁচু পদে কর্তব্য বন্ধফলক , যদিও সাবেক 10 একটি স্কোর (উচ্চতর = খারাপ) আছে বনাম পরের 3।

সুতরাং আমি যা খুঁজছি (এবং এটি বিদ্যমান না থাকলে তা তৈরি করবে), এটি একটি লাইব্রেরি যা নিম্নলিখিতগুলি করে:

  • বিভিন্ন পাঠ্যের ম্যানিপুলেশনগুলি ওজন করে
  • প্রতিটি ম্যানিপুলেশন যেখানে কোনও শব্দে উপস্থিত হয় তার উপর নির্ভর করে ওজনগুলি (প্রথম দিকের ম্যানিপুলেশনগুলি দেরীতে ম্যানিপুলেশনগুলির চেয়ে বেশি ব্যয়বহুল)
  • প্রাসঙ্গিকতার অনুসারে বাছাই করা ফলাফলের তালিকা দেয়

কেউ কি এরকম কিছু পেয়েছেন? আমি বুঝতে পেরেছি যে স্ট্যাকওভারফ্লো সফ্টওয়্যার সুপারিশের জন্য জিজ্ঞাসা করার জায়গা নয়, তবে উপরোক্ত ক্ষেত্রে অন্তর্নিহিত (আর নয়!) হ'ল: আমি কি এটি সঠিকভাবে সম্পর্কে ভাবছি?


সম্পাদনা করুন

আমি বিষয়টিতে একটি ভাল কাগজ (পিডিএফ) পেয়েছি । কিছু নোট এবং অংশ:

অ্যাফাইন সম্পাদনা-দূরত্ব ফাংশন সন্নিবেশ বা মোছার ক্রমটিতে তুলনামূলকভাবে কম দাম নির্ধারণ করে

Monger-Elkan দূরত্ব ফাংশন (Monge & Elkan 1996), যা নির্দিষ্ট ব্যয়ের পরামিতি সহ স্মিথ-ওয়াটারম্যান দূরত্ব ফাংশন (ডার্বান এট আল। 1998) এর একটি স্বরূপ

জন্য স্মিথ-মাঝি দূরত্ব (wikipedia) তিনি , "এর পরিবর্তে মোট ক্রম দেখার, স্মিথ-মাঝি অ্যালগরিদম সব সম্ভব লেন্থ বিভাগগুলি তুলনা এবং মিল পরিমাপ অপ্টিমাইজ করে।" এটি এন-গ্রাম পদ্ধতির।

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

উইঙ্কলারের কারণে এর এক বৈকল্পিক (1999) এছাড়াও দীর্ঘতম সাধারণ উপসর্গের দৈর্ঘ্য পি ব্যবহার করে

(মনে হচ্ছে প্রাথমিকভাবে সংক্ষিপ্ত স্ট্রিংগুলির জন্য উদ্দেশ্য)

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

উপসংহার:

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


দুর্দান্ত প্রশ্ন। আমি অনুরূপ কিছু করতে চাই, কিন্তু একই স্ট্রিং তুলনা বিবেচনা সঙ্গে। আপনি কি কখনও আপনার স্ট্রিং তুলনাগুলির একটি জাভাস্ক্রিপ্ট বাস্তবায়ন খুঁজে পেয়েছেন / তৈরি করেছেন? ধন্যবাদ
নিকোলাস

4
@ নিকোলাস আমি ছোট কোয়েরি স্ট্রিংগুলির জন্য অ্যাকাউন্টে অ্যাকাউন্টে ফিজি সেট.জেএসকে সহজেই চিহ্নিত করেছি এবং যদিও এটি ভারিত স্ট্রিং ম্যানিপুলেশনের জন্য অ্যাকাউন্ট না, তবে স্ট্রিংয়ের সমাপ্তির জন্য আমার পছন্দসই প্রয়োগের জন্য ফলাফলগুলি বেশ ভাল। দেখুন রেপো
willlma

ধন্যবাদ আমি ইহা চেস্টা করব. আমি এই স্ট্রিংটি তুলনা ফাংশনটিও পেয়েছি: github.com/zdyn/jaro-winkler-js । খুব ভাল কাজ করা বলে মনে হচ্ছে।
নিকোলাস

4
: এই একটি ব্যবহার করে দেখুন subtexteditor.github.io/fuzzysearch.js
michaelday

4
@ মাইকেলের দিন যা টাইপসগুলিকে আমলে নেয় না। ডেমোতে, টাইপিং kroleফিরে আসে না Final Fantasy V: Krile, যদিও আমি এটি করতে চাই। ফলাফলটিতে একই ক্রমে উপস্থিত থাকার জন্য এটির ক্যোয়ারীর সমস্ত অক্ষর প্রয়োজন, যা বেশ স্বল্পদৃষ্টির। মনে হয় ভাল अस्पष्ट অনুসন্ধানের একমাত্র উপায় হ'ল সাধারণ টাইপের ডেটাবেস।
উইল্লমা

উত্তর:


22

ভাল প্রশ্ন! তবে আমার ধারণাটি হ'ল লেভেনস্টেইন-ডেমেরাউ পরিবর্তনের চেষ্টা করার পরিবর্তে, আপনি একটি ভিন্ন অ্যালগরিদম চেষ্টা করতে বা দুটি অ্যালগরিদম থেকে ফলাফলগুলি একত্রিত / ভার করে নেওয়া ভাল।

এটি আমাকে আঘাত করে যে "প্রারম্ভিক উপসর্গ" এর সঠিক বা নিকটতম ম্যাচগুলি লেভেনস্টেইন-ডেমেরাউ কোনও নির্দিষ্ট ওজন দেয় না - তবে আপনার আপাতদৃষ্টিতে ব্যবহারকারীদের প্রত্যাশা।

আমি "লেভেনস্টেইনের থেকে ভাল" অনুসন্ধান করেছি এবং অন্যান্য জিনিসগুলির মধ্যে এটি পেয়েছি:

http://www.joyofdata.de/blog/compistance-of-string-distance-algorithms/

এটি বেশ কয়েকটি "স্ট্রিং দূরত্ব" ব্যবস্থার কথা উল্লেখ করে। তিনটি যা আপনার প্রয়োজনের সাথে বিশেষভাবে প্রাসঙ্গিক বলে মনে হয়েছিল তা হ'ল:

  1. দীর্ঘতম সাধারণ সাবস্ট্রিংয়ের দূরত্ব: ফলাফলগুলি সাবস্ট্রিংগুলি অভিন্ন না হওয়া পর্যন্ত উভয় স্ট্রিংয়ে ন্যূনতম সংকেত সরিয়ে ফেলতে হবে।

  2. কি-গ্রাম দূরত্ব: উভয় স্ট্রিংয়ের এন-গ্রাম ভেক্টরগুলির মধ্যে পরম পার্থক্যের যোগফল।

  3. জ্যাকার্ডের দূরত্ব: 1 ভাগ করা এন-গ্রাম এবং সমস্ত পর্যবেক্ষণ করা এন-গ্রামের ভাগফলকে দেখায়।

হতে পারে আপনি এই মেট্রিকগুলির একটি ভারিত সংমিশ্রণ (বা সর্বনিম্ন) ব্যবহার করতে পারেন লেভেনস্টেইনের সাথে - সাধারণ সাবস্ট্রিং, সাধারণ এন-গ্রাম বা জ্যাকার্ড সকলেই অনুরূপ স্ট্রিংগুলিকে পছন্দ করবে - অথবা সম্ভবত জ্যাকার্ড ব্যবহারের চেষ্টা করবেন?

আপনার তালিকা / ডাটাবেসের আকারের উপর নির্ভর করে এই অ্যালগরিদমগুলি মাঝারি ব্যয়বহুল হতে পারে। अस्पष्ट অনুসন্ধানের জন্য আমি প্রয়োগ করেছিলাম, আমি ডিবি থেকে "পুনরুদ্ধার কী" হিসাবে এন-গ্রামের একটি কনফিগারযোগ্য সংখ্যার ব্যবহার করেছি এবং তারপরে অগ্রাধিকার ক্রমে সাজানোর জন্য ব্যয়বহুল স্ট্রিং-ডিস্টেন্স পরিমাপ চালিয়েছি।

আমি এসকিউএলে ফাজি স্ট্রিং সন্ধানে কিছু নোট লিখেছি। দেখা:


67

আমি বিদ্যমান fuzzy গ্রন্থাগারগুলি fuse.js এর মতো ব্যবহার করার চেষ্টা করেছি এবং সেগুলি ভয়াবহ বলেও পেয়েছি, তাই আমি এমন একটি লিখেছিলাম যা মূলত উত্সাহ অনুসন্ধানের মতো আচরণ করে। https://github.com/farzher/fuzzysort

এটি কেবলমাত্র টাইপোগুলিকেই হ'ল ট্রান্সপোস এটি বেশ কঠিন ব্যাপার (1k বড়, 0 বিষয়) , খুব দ্রুত , এবং সহজেই আপনার কেস পরিচালনা:

fuzzysort.go('int', ['international', 'splint', 'tinder'])
// [{highlighted: '*int*ernational', score: 10}, {highlighted: 'spl*int*', socre: 3003}]


4
আমি Fuse.js থেকে অসন্তুষ্ট ছিলাম এবং আপনার লাইব্রেরিটি চেষ্টা করেছিলাম - দুর্দান্ত কাজ করে! ভাল হয়েছে :)
ডেভ

4
এই লাইব্রেরিতে আমি যে সমস্যার মুখোমুখি হয়েছি তা হ'ল শব্দটি সম্পূর্ণ হয়ে গেলেও ভুল বানান উদাহরণস্বরূপ, সঠিক শব্দটি যদি "এক্সআরপি" হয় এবং আমি যদি "এক্সআরটি" অনুসন্ধান করি তবে এটি আমাকে একটি স্কোর দেয় না
পাইরেটএপ

4
@ পাইরেটঅ্যাপ হ্যাঁ, আমি ভুল বানানগুলি পরিচালনা করি না (কারণ উত্সাহের সন্ধানটি করে না)। মানুষ এখন অভিযোগ করছে আমি এখন এটি দেখার চেষ্টা করছি। আপনি আমাকে উদাহরণস্বরূপ এমন ব্যবহারের মামলাগুলি সরবরাহ করতে পারেন যেখানে এই অনুসন্ধানটি
গিথুব

4
আপনারা যারা এই lib সম্পর্কে অবাক হচ্ছেন তাদের জন্য এখন এটি স্পেল চেকটিও কার্যকর হয়েছে! আমি এই লিবিজটি ফিউজ এবং অন্যদের চেয়ে প্রস্তাব দিই
পাইরেটএপ

4
@ ইউজার 4815162342 আপনার নিজের এটি কোড করতে হবে। এই থ্রেডটি চেকআউট করুন, এটির একটি কোড নমুনা রয়েছে github.com/farzher/fuzzysort/issues/19
Farzher

18

আমি কয়েকবার ব্যবহার করেছি এমন একটি কৌশল এখানে ... এটি বেশ ভাল ফলাফল দেয়। আপনি যা চেয়েছিলেন তা সবই করে না। এছাড়াও, তালিকাটি যদি বিশাল হয় তবে এটি ব্যয়বহুল হতে পারে।

get_bigrams = (string) ->
    s = string.toLowerCase()
    v = new Array(s.length - 1)
    for i in [0..v.length] by 1
        v[i] = s.slice(i, i + 2)
    return v

string_similarity = (str1, str2) ->
    if str1.length > 0 and str2.length > 0
        pairs1 = get_bigrams(str1)
        pairs2 = get_bigrams(str2)
        union = pairs1.length + pairs2.length
        hit_count = 0
        for x in pairs1
            for y in pairs2
                if x is y
                    hit_count++
        if hit_count > 0
            return ((2.0 * hit_count) / union)
    return 0.0

দুটি স্ট্রিং পাস করুন string_similarityযার মধ্যে কোনও সংখ্যা ফিরে আসবে 0এবং 1.0সেগুলির তুলনায় কতটা একই। এই উদাহরণটি লো-ড্যাশ ব্যবহার করে

ব্যবহারের উদাহরণ ....

query = 'jenny Jackson'
names = ['John Jackson', 'Jack Johnson', 'Jerry Smith', 'Jenny Smith']

results = []
for name in names
    relevance = string_similarity(query, name)
    obj = {name: name, relevance: relevance}
    results.push(obj)

results = _.first(_.sortBy(results, 'relevance').reverse(), 10)

console.log results

এছাড়াও .... একটি ঝাঁকুনি আছে

আপনার কনসোলটি খোলা আছে বা আপনি কিছু দেখতে পাবেন না তা নিশ্চিত করুন :)


4
ধন্যবাদ, আমি ঠিক তাই খুঁজছিলাম এটি কেবল আরও ভাল যদি এটি প্লেইন
জেএস হয়

4
ফাংশন get_bigram (স্ট্রিং) {var s = স্ট্রিং.টোলওয়ারকেস () var ভি = এস.স্প্লিট (''); (var i = 0; i <v.leight; i ++) {v [i] = s.slice (i, i + 2); } ফেরত ভি; } ফাংশন স্ট্রিং_সিমারিটি (str1, str2) {যদি (str1.length> 0 && str2.length> 0) pairs var જોડીઓ1 = get_bigram (str1); var જોડીઓ 2 = get_bigram (str2); var ইউনিয়ন = જોડીઓ 1. দৈর্ঘ্য + জোড়া 2. দৈর্ঘ্য; var হিট = 0; (var x = 0; x <જોડીઓ 1. দৈর্ঘ্য; x ++) for এর জন্য (var y = 0; y <জোড়া 2. দৈর্ঘ্য; y ++) {যদি (জোড় 1 [x] == জোড়া 2 [y]) হিট_কাউন্ট ++; }} যদি (হিট> ০) রিটার্ন ((২.০ * হিট) / ইউনিয়ন); } ০.০} ফিরিয়ে দিন
জয়

আপনি যে কীগুলিতে কয়েকটি কীতে সন্ধান করতে চাইবেন সেগুলিতে এটি কীভাবে ব্যবহার করবেন?
ব্যবহারকারী3808307

এতে কয়েকটি সমস্যা রয়েছে: 1) এটি স্ট্রিংয়ের শুরু এবং শেষের অক্ষরগুলিকে আন্ডারওয়েট করে। 2) বিগ্রামের তুলনা হ'ল ও (এন ^ 2)। 3) বাস্তবতার কারণে মিলের স্কোর 1 এরও বেশি হতে পারে। এটি স্পষ্টতই কোনও অর্থবোধ করে না। আমি নীচে আমার উত্তরে এই সমস্ত সমস্যা ঠিক করেছি।
এমজিসাম

9

অস্পষ্ট ম্যাচের জন্য এটি আমার সংক্ষিপ্ত এবং কমপ্যাক্ট ফাংশন:

function fuzzyMatch(pattern, str) {
  pattern = '.*' + pattern.split('').join('.*') + '.*';
  const re = new RegExp(pattern);
  return re.test(str);
}

যদিও আপনি সম্ভবত বেশিরভাগ ক্ষেত্রে যা চান তা না হলেও এটি আমার পক্ষে ছিল।
schmijos

আপনি আদেশ অগ্রাহ্য করতে পারেন? fuzzyMatch('c a', 'a b c')ফিরে true
আসা

5

আপনি পরমাণুর https://github.com/atom/fuzzaldrin/ lib এ একবার দেখতে পারেন ।

এটি এনপিএম এ উপলব্ধ, সহজ এপিআই রয়েছে এবং আমার পক্ষে ঠিক আছে।

> fuzzaldrin.filter(['international', 'splint', 'tinder'], 'int');
< ["international", "splint"]

আমি এটমের লাইব্রেরিতেও সাফল্য পেয়েছি, যার একটি সাধারণ এপিআই এবং বিদ্যুৎ দ্রুত =) রয়েছে। github.com/cliffordfajardo/cato
cacoder

2

নভেম্বর 2019 আপডেট। আমি বেশ সুন্দর শালীন আপগ্রেড পেতে ফিউজ পেয়েছি। তবে আমি এটি বুলের (যেমন, ওআর, ওআর, ইত্যাদি অপারেটর) ব্যবহার করতে পারি না এবং ফলাফলগুলি ফিল্টার করার জন্য আমি API অনুসন্ধান ইন্টারফেসটি ব্যবহার করতে পারি না।

আমি আবিষ্কার করেছি nextapps-de/flexsearch: https://github.com/nextapps-de/flexsearch এবং আমি বিশ্বাস করি যে এ পর্যন্ত আমি চেষ্টা করেছি এমন অন্যান্য জাভাস্ক্রিপ্ট অনুসন্ধান লাইব্রেরিগুলিকে ছাড়িয়ে গেছে এবং boolএর ফিল্টারিং অনুসন্ধান এবং পৃষ্ঠাগুলি সমর্থন করে।

আপনি আপনার অনুসন্ধানের ডেটা (যেমন সঞ্চয়স্থান) এর জন্য জাভাস্ক্রিপ্ট অবজেক্টগুলির একটি তালিকা ইনপুট করতে পারেন, এবং API মোটামুটি ভালভাবে নথিভুক্ত করা হয়েছে: https://github.com/nextapps-de/flexsearch#api-overview

এখন পর্যন্ত আমি 10,000 রেকর্ডের কাছাকাছি সূচি রেখেছি, এবং আমার অনুসন্ধানগুলি তত্ক্ষণাত্নের পাশে রয়েছে; অর্থাত্ প্রতিটি অনুসন্ধানের জন্য অদৃশ্য সময়ের পরিমাণ।


এই প্রকল্পটি ফুলে > 100kbউঠেছে ( ) এবং এতে অ-উপস্থিত থাকা ইস্যুগুলি এবং জনসংযোগগুলি প্রচুর পরিমাণে রয়েছে। আমি এই দুটি কারণে এটি ব্যবহার করব না।
vsync

2

এখানে @ ইন্টারন্যাশনাল এফএক্স দ্বারা প্রদত্ত সমাধানটি দেওয়া হয়েছে, তবে জেএসে (আমি এটি এত ভাগ করে নেওয়ার ক্ষেত্রে এটি ব্যবহার করেছি):

function get_bigrams(string){
  var s = string.toLowerCase()
  var v = s.split('');
  for(var i=0; i<v.length; i++){ v[i] = s.slice(i, i + 2); }
  return v;
}

function string_similarity(str1, str2){
  if(str1.length>0 && str2.length>0){
    var pairs1 = get_bigrams(str1);
    var pairs2 = get_bigrams(str2);
    var union = pairs1.length + pairs2.length;
    var hits = 0;
    for(var x=0; x<pairs1.length; x++){
      for(var y=0; y<pairs2.length; y++){
        if(pairs1[x]==pairs2[y]) hits++;
    }}
    if(hits>0) return ((2.0 * hits) / union);
  }
  return 0.0
}

2

আমি ইন্টার্নএলএফএক্স দ্বারা কফিস্ক্রিপ্ট বিগ্রাম সমাধানের সাথে সমস্যার সমাধান করেছি এবং এটিকে একটি জেনেরিক এন-গ্রাম দ্রবণ তৈরি করেছি (আপনি গ্রামটির আকারটি কাস্টমাইজ করতে পারেন)।

এটি টাইপস্ক্রিপ্ট তবে আপনি টাইপ টিকাটি মুছে ফেলতে পারেন এবং এটি ভ্যানিলা জাভাস্ক্রিপ্ট হিসাবেও দুর্দান্ত কাজ করে।

/**
 * Compares the similarity between two strings using an n-gram comparison method. 
 * The grams default to length 2.
 * @param str1 The first string to compare.
 * @param str2 The second string to compare.
 * @param gramSize The size of the grams. Defaults to length 2.
 */
function stringSimilarity(str1: string, str2: string, gramSize: number = 2) {
  function getNGrams(s: string, len: number) {
    s = ' '.repeat(len - 1) + s.toLowerCase() + ' '.repeat(len - 1);
    let v = new Array(s.length - len + 1);
    for (let i = 0; i < v.length; i++) {
      v[i] = s.slice(i, i + len);
    }
    return v;
  }

  if (!str1?.length || !str2?.length) { return 0.0; }

  //Order the strings by length so the order they're passed in doesn't matter 
  //and so the smaller string's ngrams are always the ones in the set
  let s1 = str1.length < str2.length ? str1 : str2;
  let s2 = str1.length < str2.length ? str2 : str1;

  let pairs1 = getNGrams(s1, gramSize);
  let pairs2 = getNGrams(s2, gramSize);
  let set = new Set<string>(pairs1);

  let total = pairs2.length;
  let hits = 0;
  for (let item of pairs2) {
    if (set.delete(item)) {
      hits++;
    }
  }
  return hits / total;
}

উদাহরণ:

console.log(stringSimilarity("Dog", "Dog"))
console.log(stringSimilarity("WolfmanJackIsDaBomb", "WolfmanJackIsDaBest"))
console.log(stringSimilarity("DateCreated", "CreatedDate"))
console.log(stringSimilarity("a", "b"))
console.log(stringSimilarity("CreateDt", "DateCreted"))
console.log(stringSimilarity("Phyllis", "PyllisX"))
console.log(stringSimilarity("Phyllis", "Pylhlis"))
console.log(stringSimilarity("cat", "cut"))
console.log(stringSimilarity("cat", "Cnut"))
console.log(stringSimilarity("cc", "Cccccccccccccccccccccccccccccccc"))
console.log(stringSimilarity("ab", "ababababababababababababababab"))
console.log(stringSimilarity("a whole long thing", "a"))
console.log(stringSimilarity("a", "a whole long thing"))
console.log(stringSimilarity("", "a non empty string"))
console.log(stringSimilarity(null, "a non empty string"))

এটি টাইপস্ক্রিপ্ট খেলার মাঠে চেষ্টা করুন


0
(function (int) {
    $("input[id=input]")
        .on("input", {
        sort: int
    }, function (e) {
        $.each(e.data.sort, function (index, value) {
          if ( value.indexOf($(e.target).val()) != -1 
              && value.charAt(0) === $(e.target).val().charAt(0) 
              && $(e.target).val().length === 3 ) {
                $("output[for=input]").val(value);
          };
          return false
        });
        return false
    });
}(["international", "splint", "tinder"]))

জেএসফিল http://jsfiddle.net/guest271314/QP7z5/


0

আমার গুগল পত্রক অ্যাড-অন নামে পরিচিত ফ্লুকআপ দেখুন এবং এই ফাংশনটি ব্যবহার করুন:

Flookup (lookupValue, tableArray, lookupCol, indexNum, threshold, [rank])

প্যারামিটারের বিবরণগুলি হ'ল:

  1. lookupValue: আপনি যে মানটি সন্ধান করছেন
  2. tableArray: আপনি যে সারণীটি অনুসন্ধান করতে চান তা
  3. lookupCol: আপনি যে কলামটি অনুসন্ধান করতে চান তা
  4. indexNum: আপনি যে কলামটি থেকে ডেটা ফেরত পেতে চান
  5. threshold: শতাংশের সাদৃশ্য যার নীচে ডেটা ফেরত দেওয়া উচিত নয়
  6. rank: নবম সেরা ম্যাচ (যেমন প্রথম ম্যাচটি আপনার পছন্দ অনুসারে না হয়)

এটি আপনার প্রয়োজনীয়তাগুলি পূরণ করবে ... যদিও আমি পয়েন্ট 2 নম্বর সম্পর্কে নিশ্চিত নই।

সরকারী ওয়েবসাইটে আরও জানুন ।

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