নিকটতম স্ট্রিং ম্যাচ পাচ্ছেন


397

পরীক্ষার স্ট্রিংয়ের সাথে একাধিক স্ট্রিংয়ের তুলনা করার জন্য এবং এর সাথে সাদৃশ্যযুক্ত স্ট্রিংটি ফেরত দেওয়ার জন্য আমার একটি উপায় দরকার:

TEST STRING: THE BROWN FOX JUMPED OVER THE RED COW

CHOICE A   : THE RED COW JUMPED OVER THE GREEN CHICKEN
CHOICE B   : THE RED COW JUMPED OVER THE RED COW
CHOICE C   : THE RED FOX JUMPED OVER THE BROWN COW

(যদি আমি এটি সঠিকভাবে করে থাকি) "টেস্ট STRING" এর নিকটতম স্ট্রিংটি "পছন্দ সি" হওয়া উচিত। এই কাজ করতে সবচেয়ে সহজ পদ্ধিতি হল উপায় কি?

আমি এটি VB.net, লুয়া এবং জাভাস্ক্রিপ্ট সহ একাধিক ভাষায় প্রয়োগের পরিকল্পনা করছি। এই মুহুর্তে, সিউডো কোড গ্রহণযোগ্য। আপনি যদি কোনও নির্দিষ্ট ভাষার জন্য উদাহরণ সরবরাহ করতে পারেন তবে এটিরও প্রশংসা হয়!


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

3
জাভা, রুবি, পাইথন, পিএইচপি ইত্যাদি: Levenshtein বিভিন্ন ভাষায় দূরত্ব সোর্স কোড en.wikibooks.org/wiki/Algorithm_Implementation/Strings/...
joelparkerhenderson

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

চরিত্রের গোষ্ঠীকরণ, বা শব্দের দলবদ্ধকরণ করুন। এটি স্কোর দিন।
কেসি

উত্তর:


952

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

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

আমি যে বাস্তবায়নটি নিয়ে এসেছি তা তুলনামূলকভাবে সহজ ছিল এবং দুটি বাক্যাংশের দৈর্ঘ্যের, প্রতিটি বাক্যাংশের মধ্যে পরিবর্তনের সংখ্যা এবং প্রতিটি শব্দের লক্ষ্য প্রবেশের মধ্যে খুঁজে পাওয়া যায় কিনা তার একটি ভারী তুলনা জড়িত।

নিবন্ধটি একটি ব্যক্তিগত সাইটে রয়েছে তাই আমি এখানে প্রাসঙ্গিক বিষয়বস্তু যুক্ত করার জন্য যথাসাধ্য চেষ্টা করব:


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

ভূমিকা

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

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

বাস্তবায়ন

এর পিছনে তত্ত্বটি পড়ার পরে, আমি প্রয়োগ করেছি এবং এটিটিকে অনুকূল করার উপায় খুঁজে পেয়েছি। আমার কোডটি ভিবিএ-তে কেমন দেখাচ্ছে:

'Calculate the Levenshtein Distance between two strings (the number of insertions,
'deletions, and substitutions needed to transform the first string into the second)
Public Function LevenshteinDistance(ByRef S1 As String, ByVal S2 As String) As Long
    Dim L1 As Long, L2 As Long, D() As Long 'Length of input strings and distance matrix
    Dim i As Long, j As Long, cost As Long 'loop counters and cost of substitution for current letter
    Dim cI As Long, cD As Long, cS As Long 'cost of next Insertion, Deletion and Substitution
    L1 = Len(S1): L2 = Len(S2)
    ReDim D(0 To L1, 0 To L2)
    For i = 0 To L1: D(i, 0) = i: Next i
    For j = 0 To L2: D(0, j) = j: Next j

    For j = 1 To L2
        For i = 1 To L1
            cost = Abs(StrComp(Mid$(S1, i, 1), Mid$(S2, j, 1), vbTextCompare))
            cI = D(i - 1, j) + 1
            cD = D(i, j - 1) + 1
            cS = D(i - 1, j - 1) + cost
            If cI <= cD Then 'Insertion or Substitution
                If cI <= cS Then D(i, j) = cI Else D(i, j) = cS
            Else 'Deletion or Substitution
                If cD <= cS Then D(i, j) = cD Else D(i, j) = cS
            End If
        Next i
    Next j
    LevenshteinDistance = D(L1, L2)
End Function

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

মান ওয়ার্ডস, ভ্যালুফ্রেস এবং স্প্লিট ফাংশন:

Public Function valuePhrase#(ByRef S1$, ByRef S2$)
    valuePhrase = LevenshteinDistance(S1, S2)
End Function

Public Function valueWords#(ByRef S1$, ByRef S2$)
    Dim wordsS1$(), wordsS2$()
    wordsS1 = SplitMultiDelims(S1, " _-")
    wordsS2 = SplitMultiDelims(S2, " _-")
    Dim word1%, word2%, thisD#, wordbest#
    Dim wordsTotal#
    For word1 = LBound(wordsS1) To UBound(wordsS1)
        wordbest = Len(S2)
        For word2 = LBound(wordsS2) To UBound(wordsS2)
            thisD = LevenshteinDistance(wordsS1(word1), wordsS2(word2))
            If thisD < wordbest Then wordbest = thisD
            If thisD = 0 Then GoTo foundbest
        Next word2
foundbest:
        wordsTotal = wordsTotal + wordbest
    Next word1
    valueWords = wordsTotal
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' SplitMultiDelims
' This function splits Text into an array of substrings, each substring
' delimited by any character in DelimChars. Only a single character
' may be a delimiter between two substrings, but DelimChars may
' contain any number of delimiter characters. It returns a single element
' array containing all of text if DelimChars is empty, or a 1 or greater
' element array if the Text is successfully split into substrings.
' If IgnoreConsecutiveDelimiters is true, empty array elements will not occur.
' If Limit greater than 0, the function will only split Text into 'Limit'
' array elements or less. The last element will contain the rest of Text.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function SplitMultiDelims(ByRef Text As String, ByRef DelimChars As String, _
        Optional ByVal IgnoreConsecutiveDelimiters As Boolean = False, _
        Optional ByVal Limit As Long = -1) As String()
    Dim ElemStart As Long, N As Long, M As Long, Elements As Long
    Dim lDelims As Long, lText As Long
    Dim Arr() As String

    lText = Len(Text)
    lDelims = Len(DelimChars)
    If lDelims = 0 Or lText = 0 Or Limit = 1 Then
        ReDim Arr(0 To 0)
        Arr(0) = Text
        SplitMultiDelims = Arr
        Exit Function
    End If
    ReDim Arr(0 To IIf(Limit = -1, lText - 1, Limit))

    Elements = 0: ElemStart = 1
    For N = 1 To lText
        If InStr(DelimChars, Mid(Text, N, 1)) Then
            Arr(Elements) = Mid(Text, ElemStart, N - ElemStart)
            If IgnoreConsecutiveDelimiters Then
                If Len(Arr(Elements)) > 0 Then Elements = Elements + 1
            Else
                Elements = Elements + 1
            End If
            ElemStart = N + 1
            If Elements + 1 = Limit Then Exit For
        End If
    Next N
    'Get the last token terminated by the end of the string into the array
    If ElemStart <= lText Then Arr(Elements) = Mid(Text, ElemStart)
    'Since the end of string counts as the terminating delimiter, if the last character
    'was also a delimiter, we treat the two as consecutive, and so ignore the last elemnent
    If IgnoreConsecutiveDelimiters Then If Len(Arr(Elements)) = 0 Then Elements = Elements - 1

    ReDim Preserve Arr(0 To Elements) 'Chop off unused array elements
    SplitMultiDelims = Arr
End Function

মিলের পরিমাপ

এই দুটি মেট্রিক ব্যবহার করে এবং তৃতীয়টি যা কেবল দুটি স্ট্রিংয়ের মধ্যকার দূরত্বের গণনা করে, আমার বেশ কয়েকটি ভেরিয়েবল রয়েছে যা আমি সর্বোচ্চ সংখ্যক ম্যাচ অর্জনের জন্য একটি অপ্টিমাইজেশন অ্যালগরিদম চালাতে পারি। অস্পষ্ট স্ট্রিং ম্যাচিং হ'ল নিজেই, একটি अस्पष्ट বিজ্ঞান, এবং তাই স্ট্রিংয়ের মিলটি পরিমাপ করার জন্য রৈখিক স্বাধীন মেট্রিক্স তৈরি করে এবং আমরা একে অপরের সাথে মেলে থাকতে চাই এমন স্ট্রিংগুলির একটি পরিচিত সেট পেয়ে আমরা আমাদের নির্দিষ্ট শৈলীর জন্য পরামিতিগুলি খুঁজে পেতে পারি that স্ট্রিং, সেরা अस्पष्ट ম্যাচের ফলাফল দিন give

প্রাথমিকভাবে, মেট্রিকের লক্ষ্য হ'ল সঠিক মিলের জন্য কম অনুসন্ধানের মান এবং ক্রমবর্ধমান অনুমতিপ্রাপ্ত ব্যবস্থাগুলির জন্য অনুসন্ধানের মান বাড়ানো। একটি অযৌক্তিক ক্ষেত্রে, ভাল সংজ্ঞায়িত ক্রমানুসারে একটি সেট ব্যবহার করে সংজ্ঞা দেওয়া মোটামুটি সহজ ছিল এবং চূড়ান্ত সূত্রটি ইঞ্জিনিয়ারিং করা হয়েছিল যাতে তারা পছন্দসই হিসাবে অনুসন্ধানের মূল্যবোধের ফলাফল বাড়িয়ে তোলে।

ফাজি স্ট্রিং ম্যাচিং পারমুটেশন

উপরের স্ক্রিনশটটিতে, আমি অনুসন্ধান শব্দ এবং ফলাফলের মধ্যে আমার বোধকৃত পার্থক্যের জন্য সুন্দরভাবে বোধ করেছি এমন কিছু নিয়ে আসার জন্য আমার তাত্পর্যপূর্ণ টুইটটি করেছি। Value Phraseউপরের স্প্রেডশিটে আমি যে বৌদ্ধিক ব্যবহার করেছি তা ছিল =valuePhrase(A2,B2)-0.8*ABS(LEN(B2)-LEN(A2))। আমি দুটি "বাক্যাংশ" এর দৈর্ঘ্যের পার্থক্যের 80% দ্বারা লেভেনস্টিন দূরত্বের কার্যকারিতা কার্যকরভাবে হ্রাস করেছিলাম। এইভাবে, "বাক্যাংশগুলি" যার একই দৈর্ঘ্য রয়েছে সম্পূর্ণ শাস্তি ভোগ করে, তবে "বাক্যাংশগুলি" যার মধ্যে 'অতিরিক্ত তথ্য' থাকে (দীর্ঘ) তবে এগুলি বাদ দিয়ে বেশিরভাগ ক্ষেত্রে একই অক্ষরগুলি হ্রাস পায় শাস্তি ভোগ করে। আমি Value Wordsফাংশনটি যেমনটি ব্যবহার করেছি এবং তারপরে আমার চূড়ান্ত SearchValহিউরিস্টিক হিসাবে সংজ্ঞায়িত হয়েছিল=MIN(D2,E2)*0.8+MAX(D2,E2)*0.2- একটি ওজনযুক্ত গড়। দুটি স্কোরগুলির মধ্যে যেটি কম ছিল তার ওজন ৮০%, এবং উচ্চতর স্কোরের ২০% got এটি কেবলমাত্র একটি তাত্পর্যপূর্ণ ছিল যা ভাল ম্যাচের হার পাওয়ার জন্য আমার ব্যবহারের ক্ষেত্রে উপযুক্ত। এই ওজনগুলি এমন এক জিনিস যা তাদের পরীক্ষার ডেটা দিয়ে সেরা ম্যাচের হার পাওয়ার জন্য কোনও টুইট করতে পারে।

অস্পষ্ট স্ট্রিং মান মান বাক্যাংশ

অস্পষ্ট স্ট্রিং মান শব্দের মিল

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

অ্যাপ্লিকেশন अस्पष्ट মিলের অপ্টিমাইজেশনের অনুমতি দিতে, আমি প্রতিটি মেট্রিকের ওজন করি। যেমন, अस्पष्ट স্ট্রিং ম্যাচের প্রতিটি অ্যাপ্লিকেশন প্যারামিটারগুলিকে আলাদাভাবে ওজন করতে পারে। যে সূত্রটি চূড়ান্ত স্কোরকে সংজ্ঞায়িত করে তা হ'ল মেট্রিক্স এবং তাদের ওজনের একটি সহজ সংমিশ্রণ:

value = Min(phraseWeight*phraseValue, wordsWeight*wordsValue)*minWeight
      + Max(phraseWeight*phraseValue, wordsWeight*wordsValue)*maxWeight
      + lengthWeight*lengthValue

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

ফাজি স্ট্রিং ম্যাচিং অপটিমাইজড মেট্রিক

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

এই বিশেষ মিলের ক্ষেত্রে, স্ট্রিংগুলির দৈর্ঘ্য অপ্রাসঙ্গিক, কারণ আমরা সংক্ষিপ্তসারগুলি প্রত্যাশা করি যা দীর্ঘ শব্দগুলির প্রতিনিধিত্ব করে, সুতরাং দৈর্ঘ্যের সর্বোত্তম ওজন -0.3, যার অর্থ আমরা দৈর্ঘ্যের পরিবর্তিত স্ট্রিংগুলিকে শাস্তি দিই না। আমরা এই সংক্ষিপ্ত বিবরণগুলির প্রত্যাশায় স্কোর হ্রাস করি, শব্দহীন ম্যাচগুলিকে আটকানোতে আংশিক শব্দের মিলের জন্য আরও জায়গা দেই যার জন্য স্ট্রিংটি সংক্ষিপ্ত হওয়ায় কম বিকল্পের প্রয়োজন হয়।

শব্দটি ওজন ১.০ এবং বাক্যাংশের ওজন মাত্র ০.০, যার অর্থ আমরা একটি স্ট্রিং থেকে হারিয়ে যাওয়া পুরো শব্দকে শাস্তি দিয়ে থাকি এবং পুরো বাক্যাংশটি অক্ষত থাকার জন্য আরও মূল্যবান বলে মনে করি। এটি দরকারী কারণ এই স্ট্রিংগুলির একটিতে প্রচলিত একটি শব্দ রয়েছে (বিপদ) যেখানে আসলে যা গুরুত্বপূর্ণ তা হল সংমিশ্রণটি (অঞ্চল এবং বিপদ) বজায় রাখা হয় কিনা।

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

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

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

ফাজি স্ট্রিং ম্যাচিং বেঞ্চমার্ক

আরও অ্যাপ্লিকেশন

এই সমাধানটি যে কোনও জায়গায় ব্যবহার করার সম্ভাবনা রয়েছে যেখানে ব্যবহারকারী কোনও কম্পিউটার সিস্টেমের কাছে স্ট্রিংগুলির সেটগুলিতে একটি স্ট্রিং সনাক্ত করতে চান যেখানে কোনও নিখুঁত মিল নেই। (স্ট্রিংগুলির জন্য আনুমানিক ম্যাচের ভিউলআপের মতো)।


সুতরাং এগুলি থেকে আপনার কী গ্রহণ করা উচিত তা হ'ল লেভেনস্টেইন দূরত্বের অ্যালগরিদমের প্রয়োগের সাথে আপনি সম্ভবত উচ্চ স্তরের হিউরিস্টিক্সের সংমিশ্রণটি (অন্য বাক্যাংশের একটি বাক্যাংশ থেকে উভয় বাক্যাংশের দৈর্ঘ্য ইত্যাদি) ব্যবহার করতে চান) যেহেতু "সেরা" ম্যাচটি কোনটি সিদ্ধান্ত নেওয়াকে হিউরিস্টিক (ফাজি) দৃ determination়তা - আপনার মিলের সাথে মিল নির্ধারণ করতে যে কোনও মেট্রিকের জন্য ওজনের একটি সেট নিয়ে আসতে হবে।

হিউরিস্টিকস এবং ওজনগুলির উপযুক্ত সেট সহ, আপনার তুলনা প্রোগ্রামটি আপনার যে সিদ্ধান্ত নেবে তাড়াতাড়ি করে সিদ্ধান্ত নেবে।


13
বোনাস: যদি কেউ অতিরিক্ত ভারী মেট্রিকগুলি তাদের ভারিত তাত্ত্বিক যুক্তিতে অন্তর্ভুক্ত করতে চায়, (যেহেতু আমি কেবল 3 সরবরাহ করেছি যা সমস্ত লিনিয়ারলিস্ট ইন্ডিপেন্ডেন্ট ছিল না) - এখানে উইকিপিডিয়াতে একটি সম্পূর্ণ তালিকা রয়েছে: en.wikedia.org/wiki/String_metric
আলেন

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

1
@ আলাইন এটি একটি আকর্ষণীয় পদ্ধতির! আমি আপনার ধারণার সাথে কিছুটা খেলছি (সি ++ এ) তবে একটি পয়েন্ট বুঝতে পারছি না, এর মান valuePhrase। যদি আমি আপনার কোডটিতে ঠিক দেখতে পাই তবে এটি লেভেনস্টাইন দূরত্বের ফাংশনের ফেরতের মান। কীভাবে এটি 'abcd efgh' অনুসন্ধান সারণীতে ডাবল / ফ্লোট মান? লেভেনস্টাইন দূরত্ব একটি পূর্ণসংখ্যা মান এবং আমি আপনার কোডে আরও গণনা দেখতে পাচ্ছি না যা এটিকে একটি ভাসা করে তোলে। আমি কী মিস করি?
আন্দ্রেয়াস ডাব্লু। ওয়াইল্যাচ

1
@ AndreasW.Wylach দুর্দান্ত পর্যবেক্ষণ। আমি যে ভিবিএ দেখিয়েছি তা কেবল লেভেনস্টাইন দূরত্ব গণনা করার জন্য, তবে আমার স্প্রেডশিটে =valuePhrase(A2,B2)-0.8*ABS(LEN(B2)-LEN(A2))আমি যে তাত্ত্বিক ব্যবহার করেছি তা হ'ল আমি দুটি "বাক্যাংশ" এর দৈর্ঘ্যের পার্থক্যের ৮০% দ্বারা লেভেনস্টাইন দূরত্বের শাস্তি হ্রাস করছিলাম। এইভাবে, "বাক্যাংশগুলি" যা একই দৈর্ঘ্যযুক্ত সম্পূর্ণ শাস্তি ভোগ করে, তবে "শব্দগুচ্ছ" যার মধ্যে 'অতিরিক্ত তথ্য' থাকে (দীর্ঘ) তবে এগুলি বাদ দিয়ে বেশিরভাগ ক্ষেত্রেই একই অক্ষরগুলি হ্রাস পেনাল্টি ভোগ করে।
আলাইন

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

88

এই সমস্যাটি বায়োইনফরমেটিক্সে সর্বদা আপ থাকে। উপরে গৃহীত উত্তর (যা উপায় দ্বারা দুর্দান্ত ছিল) বায়োইনফর্ম্যাটিক্সে নিডলম্যান-উইংস (দুটি স্ট্রিং তুলনা করুন) এবং স্মিথ-ওয়াটারম্যান (দীর্ঘতর স্ট্রিংয়ের মধ্যে একটি আনুমানিক সাবস্ট্রিং সন্ধান করুন) নামে পরিচিত al তারা দুর্দান্ত কাজ করে এবং কয়েক দশক ধরে ওয়ার্কহর্স হয়।

তবে আপনার যদি তুলনা করার জন্য এক মিলিয়ন স্ট্রিং থাকে?এটি একটি ট্রিলিয়ন জোড় তুলনা, যার প্রতিটি ও (এন * মি)! আধুনিক ডিএনএ সিকোয়েন্সারগুলি সহজেই একটি বিলিয়ন সংক্ষিপ্ত ডিএনএ সিকোয়েন্স তৈরি করে, প্রতিটি প্রায় 200 ডিএনএ "অক্ষর" দীর্ঘ। সাধারণত, আমরা খুঁজে পেতে চাই, যেমন প্রতিটি স্ট্রিংয়ের জন্য, মানব জিনোমের বিরুদ্ধে সেরা মিল (3 বিলিয়ন অক্ষর)। স্পষ্টতই, সুই-উইনস্চ অ্যালগোরিদম এবং এর আত্মীয়রা এটি করবে না।

এই তথাকথিত "সারিবদ্ধ সমস্যা" সক্রিয় গবেষণার একটি ক্ষেত্র। সর্বাধিক জনপ্রিয় অ্যালগরিদমগুলি যুক্তিসঙ্গত হার্ডওয়্যার (বলুন, আটটি কোরি এবং 32 গিগাবাইট র‌্যাম) কয়েক ঘন্টার মধ্যে 1 বিলিয়ন সংক্ষিপ্ত স্ট্রিং এবং মানব জিনোমের মধ্যে অক্ষত ম্যাচগুলি সন্ধান করতে সক্ষম।

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

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

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

তবে স্টোরেজ সমস্যা হতে পারে। 3 বিলিয়ন অক্ষরের লক্ষ্যমাত্রার একটি সূচীতে 3 বিলিয়ন পয়েন্টার এবং 3 বিলিয়ন কে-লম্বা শব্দ রাখা দরকার। এটি বেশ কয়েকটি দশগিগা র‍্যামের চেয়ে কম র‌্যামে ফিট করা শক্ত বলে মনে হয়। তবে আশ্চর্যরূপে আমরা বুড়ো-হুইলারের রূপান্তরটি ব্যবহার করে সূচকটি ব্যাপকভাবে সংকুচিত করতে পারি এবং এটি এখনও দক্ষতার সাথে অনুসন্ধানযোগ্য হবে। মানব জিনোমের একটি সূচক 4 জিবি র্যামের চেয়ে কম ফিট করতে পারে। এই ধারণা যেমন জনপ্রিয় ক্রম aligners ভিত্তিতে Bowtie এবং BWA

বিকল্পভাবে, আমরা প্রত্যয় অ্যারে ব্যবহার করতে পারি , যা কেবলমাত্র পয়েন্টারগুলিকে সঞ্চয় করে, তবুও লক্ষ্য স্ট্রিংয়ের সমস্ত প্রত্যয়ের একসাথে সূচক উপস্থাপন করে (মূলত, কে এর সমস্ত সম্ভাব্য মানের জন্য একযোগে সূচক; বুরোস-হুইলারের রূপান্তরটির ক্ষেত্রেও এটি একই সত্য) )। যদি আমরা 32-বিট পয়েন্টার ব্যবহার করি তবে মানব জিনোমের একটি প্রত্যয় অ্যারে সূচক 12 গিগাবাইট র‍্যাম লাগবে।

উপরের লিঙ্কগুলিতে প্রচুর পরিমাণে তথ্য এবং প্রাথমিক গবেষণা কাগজগুলির লিঙ্ক রয়েছে। ইল্যান্ডের লিঙ্কটি একটি পিডিএফ এ যায় যার সাথে জড়িত ধারণাগুলির চিত্রিত করে দরকারী চিত্রগুলি রয়েছে এবং কীভাবে সন্নিবেশ এবং মুছে ফেলা যায় তা দেখায়।

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


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

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

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

30

আমি প্রতিযোগিতা করি যে পছন্দ बीটি পরীক্ষার স্ট্রিংয়ের কাছাকাছি, কারণ এটি মূল স্ট্রিং থেকে কেবলমাত্র 4 টি অক্ষর (এবং 2 মুছে ফেলা)। আপনি সিটিকে কাছাকাছি দেখতে পাচ্ছেন কারণ এতে বাদামি এবং লাল উভয়ই রয়েছে। তবে এর বৃহত্তর সম্পাদনার দূরত্ব হবে।

লেভেনস্টাইন দূরত্ব নামে একটি অ্যালগরিদম রয়েছে যা দুটি ইনপুটগুলির মধ্যে সম্পাদনার দূরত্বকে পরিমাপ করে।

এখানে সেই অ্যালগরিদমের জন্য একটি সরঞ্জাম।

  1. 15 এর দূরত্ব হিসাবে পছন্দগুলি A পছন্দ করে।
  2. 6 এর দূরত্ব হিসাবে বি পছন্দগুলি পছন্দ করুন।
  3. 9 এর দূরত্ব হিসাবে পছন্দ সি পছন্দ করে নিন।

সম্পাদনা: দুঃখিত, আমি লেভেনস্টাইন সরঞ্জামে স্ট্রিংগুলি মিশ্রিত করে চলেছি। উত্তরগুলি সংশোধন করার জন্য আপডেট করা হয়েছে।


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

18

উত্তরোত্তর জন্য লুয়া বাস্তবায়ন:

function levenshtein_distance(str1, str2)
    local len1, len2 = #str1, #str2
    local char1, char2, distance = {}, {}, {}
    str1:gsub('.', function (c) table.insert(char1, c) end)
    str2:gsub('.', function (c) table.insert(char2, c) end)
    for i = 0, len1 do distance[i] = {} end
    for i = 0, len1 do distance[i][0] = i end
    for i = 0, len2 do distance[0][i] = i end
    for i = 1, len1 do
        for j = 1, len2 do
            distance[i][j] = math.min(
                distance[i-1][j  ] + 1,
                distance[i  ][j-1] + 1,
                distance[i-1][j-1] + (char1[i] == char2[j] and 0 or 1)
                )
        end
    end
    return distance[len1][len2]
end

14

আপনি এই ব্লগ পোস্টে আগ্রহী হতে পারে।

http://seatgeek.com/blog/dev/fuzzywuzzy-fuzzy-string-matching-in-python

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

http://pypi.python.org/pypi/python-Levenshtein/


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

12

আপনি এই লাইব্রেরি সহায়ক হতে পারে! http://code.google.com/p/google-diff-match-patch/

এটি বর্তমানে জাভা, জাভাস্ক্রিপ্ট, ডার্ট, সি ++, সি #, উদ্দেশ্য সি, লুয়া এবং পাইথনে উপলভ্য

এটি বেশ ভাল কাজ করে। আমি আমার লুয়া প্রকল্পগুলির কয়েকটিতে এটি ব্যবহার করি।

এবং আমি মনে করি না এটি অন্য ভাষায় পোর্ট করা খুব কঠিন হবে!


2

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

আমরা যখন এটির জিজ্ঞাসায় এক বা একাধিক টাইপ থাকতে পারে তখন আমরা এটি শিল্পীদের একটি বিশাল সংগ্রহ এবং গানের শিরোনামের বিপরীতে ব্যবহার করেছি এবং এটি বেশ ভালভাবে কাজ করেছে (এবং লক্ষণীয়ভাবে লক্ষ লক্ষ লক্ষ স্ট্রিংয়ে সংগ্রহগুলি বিবেচনা করে)।

অধিকতর, সোলারের সাহায্যে আপনি জেএসওএন এর মাধ্যমে চাহিদার ভিত্তিতে সূচকের বিরুদ্ধে অনুসন্ধান করতে পারেন, যাতে আপনি যে বিভিন্ন ভাষায় দেখছেন তার মধ্যে সমাধানটি পুনরায় উদ্ভাবন করতে হবে না।


1

এই ধরণের অ্যালগরিদমগুলির জন্য খুব, খুব ভাল উত্স হ'ল সিমেট্রিক্স: http://sourceforge.net/projects/simmetics/

দুর্ভাগ্যক্রমে অনেক দস্তাবেজযুক্ত দারুণ ওয়েবসাইটটি চলে গেছে :( এটি আবার ফিরে আসার ক্ষেত্রে এর আগের ঠিকানাটি এটি ছিল: http://www.dcs.shef.ac.uk/~sam/simmetics.html

ভোইলা ("ওয়েব্যাক মেশিন" এর সৌজন্যে): http://web.archive.org/web/20081230184321/http://www.dcs.shef.ac.uk/~sam/simmetics.html

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


1

দক্ষতার সাথে পাঠ্যের একটি বড় সেটকে জিজ্ঞাসা করতে আপনি সম্পাদনা দূরত্ব / উপসর্গ সম্পাদনা দূরত্বের ধারণাটি ব্যবহার করতে পারেন।

দূরত্ব ইডি সম্পাদনা করুন (x, y): পদটি x থেকে মেয়াদ y পর্যন্ত পাওয়ার জন্য ন্যূনতম সংখ্যার ট্রান্সফরম number

তবে প্রতিটি শব্দ এবং ক্যোয়ারী পাঠ্যের মধ্যে ইডি কম্পিউটিং হ'ল সংস্থান এবং সময় নিবিড়। অতএব প্রথমে প্রতিটি টার্মের জন্য ইডি গণনা করার পরিবর্তে আমরা কিউজিআরএডেক্স নামে একটি কৌশল ব্যবহার করে সম্ভাব্য মিলের শর্তাদি বের করতে পারি। এবং তারপরে এই নির্বাচিত পদগুলিতে ED গণনা প্রয়োগ করুন।

কিউগ্রাম সূচক কৌশলটির সুবিধা হ'ল এটি ফাজি অনুসন্ধানের জন্য সমর্থন করে।

কিউগ্রাম সূচককে অভিযোজন করার একটি সম্ভাব্য পন্থা হ'ল কিউগ্র্যাম ব্যবহার করে একটি উল্টানো সূচক তৈরি করা। সেখানে আমরা সেই শব্দটি সেই Qgram এর অধীনে, বিশেষ Qgram সহ সমস্ত শব্দ সঞ্চয় করি ( আপনি এর জন্য জাভাতে ট্রি ম্যাপ ডেটা স্ট্রাকচার ব্যবহার করতে পারেন। শর্তাদি সংরক্ষণের জন্য নিম্নলিখিতটি একটি ছোট উদাহরণ

কর্নেল: কর্ন এমবিয়া, কল ওম্বো, গ্যান কোল আ , তা কোল আমা

তারপরে জিজ্ঞাসা করার সময়, আমরা কোয়েরি পাঠ্য এবং উপলভ্য পদগুলির মধ্যে সাধারণ কিউগ্রামের সংখ্যা গণনা করি।

Example: x = HILLARY, y = HILARI(query term)
Qgrams
$$HILLARY$$ -> $$H, $HI, HIL, ILL, LLA, LAR, ARY, RY$, Y$$
$$HILARI$$ -> $$H, $HI, HIL, ILA, LAR, ARI, RI$, I$$
number of q-grams in common = 4

কুই-গ্রাম সংখ্যা সাধারণ = 4।

প্রচুর কিউগ্রামের সংখ্যার সাথে শর্তাবলীর জন্য, আমরা কোয়েরি শর্তের বিপরীতে ইডি / পিইডি গণনা করি এবং তারপরে শেষ ব্যবহারকারীকে এই শব্দটি প্রস্তাব করি।

আপনি নীচের প্রকল্পে এই তত্ত্বটির একটি বাস্তবায়ন পেতে পারেন ("কিউগ্রিমন্ডেক্স.জাভা" দেখুন)। নির্দ্বিধায় যে কোন প্রশ্ন জিজ্ঞাসা কর। https://github.com/Bhashitha-Gamage/City_Search

দূরত্ব সম্পাদনা করুন সম্পর্কে আরও অধ্যয়নের জন্য, উপসর্গ সম্পাদনা করুন দূরত্ব কিউগ্রাম সূচকটি অধ্যাপক ডাঃ হান্না বেস্টের নীচের ভিডিওটি দেখুন https://www.youtube.com/e એમ્બેડ/6pUg2wmGJRo (পাঠ 20:06 থেকে শুরু হবে)


1

ইনপুট ডেটা খুব বেশি হলে (লক্ষ লক্ষ স্ট্রিং বলুন) সমস্যাটি কার্যকর করা কঠিন। আমি এটিকে সমাধান করতে ইলাস্টিক অনুসন্ধান ব্যবহার করেছি used

দ্রুত শুরু: https://www.elastic.co/guide/en/elasticsearch/client/net-api/6.x/elasticsearch-net.html

কেবল ডিবিতে সমস্ত ইনপুট ডেটা sertোকান এবং আপনি যেকোন সম্পাদনার দূরত্বের ভিত্তিতে যে কোনও স্ট্রিং দ্রুত অনুসন্ধান করতে পারেন। এখানে একটি সি # স্নিপেট রয়েছে যা আপনাকে সম্পাদনা দূরত্ব (ছোট থেকে উচ্চতর) অনুসারে বাছাই করা ফলাফলগুলির একটি তালিকা দেয়

var res = client.Search<ClassName>(s => s
    .Query(q => q
    .Match(m => m
        .Field(f => f.VariableName)
        .Query("SAMPLE QUERY")
        .Fuzziness(Fuzziness.EditDistance(5))
    )
));

আপনি কোন গ্রন্থাগার ব্যবহার করছেন? এটি সহায়ক হতে আরও কিছু তথ্যের প্রয়োজন।
বেট করুন

0

প্রদত্ত শব্দের মধ্যে দূরত্ব গণনা করার জন্য এখানে আপনার কাছে গোলং পোক থাকতে পারে। আপনি সুর করতে পারেন minDistanceএবং differenceঅন্যান্য সুযোগ জন্য।

খেলার মাঠ: https://play.golang.org/p/NtrBzLdC3rE

package main

import (
    "errors"
    "fmt"
    "log"
    "math"
    "strings"
)

var data string = `THE RED COW JUMPED OVER THE GREEN CHICKEN-THE RED COW JUMPED OVER THE RED COW-THE RED FOX JUMPED OVER THE BROWN COW`

const minDistance float64 = 2
const difference float64 = 1

type word struct {
    data    string
    letters map[rune]int
}

type words struct {
    words []word
}

// Print prettify the data present in word
func (w word) Print() {
    var (
        lenght int
        c      int
        i      int
        key    rune
    )
    fmt.Printf("Data: %s\n", w.data)
    lenght = len(w.letters) - 1
    c = 0
    for key, i = range w.letters {
        fmt.Printf("%s:%d", string(key), i)
        if c != lenght {
            fmt.Printf(" | ")
        }
        c++
    }
    fmt.Printf("\n")
}

func (ws words) fuzzySearch(data string) ([]word, error) {
    var (
        w      word
        err    error
        founds []word
    )
    w, err = initWord(data)
    if err != nil {
        log.Printf("Errors: %s\n", err.Error())
        return nil, err
    }
    // Iterating all the words
    for i := range ws.words {
        letters := ws.words[i].letters
        //
        var similar float64 = 0
        // Iterating the letters of the input data
        for key := range w.letters {
            if val, ok := letters[key]; ok {
                if math.Abs(float64(val-w.letters[key])) <= minDistance {
                    similar += float64(val)
                }
            }
        }

        lenSimilarity := math.Abs(similar - float64(len(data)-strings.Count(data, " ")))
        log.Printf("Comparing %s with %s i've found %f similar letter, with weight %f", data, ws.words[i].data, similar, lenSimilarity)
        if lenSimilarity <= difference {
            founds = append(founds, ws.words[i])
        }
    }

    if len(founds) == 0 {
        return nil, errors.New("no similar found for data: " + data)
    }

    return founds, nil
}

func initWords(data []string) []word {
    var (
        err   error
        words []word
        word  word
    )
    for i := range data {
        word, err = initWord(data[i])
        if err != nil {
            log.Printf("Error in index [%d] for data: %s", i, data[i])
        } else {
            words = append(words, word)
        }
    }
    return words

}

func initWord(data string) (word, error) {
    var word word

    word.data = data
    word.letters = make(map[rune]int)
    for _, r := range data {
        if r != 32 { // avoid to save the whitespace
            word.letters[r]++
        }

    }
    return word, nil
}
func main() {
    var ws words
    words := initWords(strings.Split(data, "-"))
    for i := range words {
        words[i].Print()
    }
    ws.words = words

    solution, _ := ws.fuzzySearch("THE BROWN FOX JUMPED OVER THE RED COW")
    fmt.Println("Possible solutions: ", solution)

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