TOP

LibreOffice के लिए फ़ज़ी लुकअप calc

FUZZYLOOKUP() विवरण

हम सभी सुप्रसिद्ध VLOOKUP() फ़ंक्शन को जानते हैं जो हमें विभिन्न तालिकाओं से डेटा को संयोजित करने में मदद करता है। हालाँकि, इस फ़ंक्शन में एक महत्वपूर्ण खामी है - यह समान मानों को संयोजित नहीं कर सकता है, अर्थात, यदि शब्द में कोई त्रुटि है, तो कोई मिलान नहीं होगा।

अनुमानित मानों को संयोजित करने में सक्षम होने के लिए, हम अपना स्वयं का फ़ंक्शन बना सकते हैं। चलिए इसे FuzzyLookup() कहते हैं।

आइए कल्पना करें कि हमारे पास दो सूचियाँ हैं। दोनों में लगभग समान तत्व हैं, लेकिन उन्हें थोड़ा अलग तरीके से लिखा जा सकता है। कार्य पहली सूची में प्रत्येक तत्व के लिए दूसरी सूची से सबसे समान तत्व ढूंढना है, अर्थात। निकटतम अधिकतम समान पाठ के लिए खोज लागू करें।

ऐसे में बड़ा सवाल यह है कि "समानता" की कसौटी पर क्या विचार किया जाए। केवल मेल खाने वाले वर्णों की संख्या? क्या लगातार मैचों की संख्या है? क्या कैरेक्टर केस या रिक्त स्थान पर विचार किया जाना चाहिए? किसी वाक्यांश में शब्दों की भिन्न-भिन्न व्यवस्था का क्या करें? कई विकल्प हैं और कोई एक समाधान नहीं है - प्रत्येक स्थिति के लिए कोई न कोई स्थिति दूसरों से बेहतर होगी।

हमारे मामले में, हम सबसे सरल विकल्प लागू करते हैं - वर्ण मिलानों की अधिकतम संख्या के आधार पर खोजें। यह सही नहीं है, लेकिन अधिकांश स्थितियों के लिए यह बहुत अच्छा काम करता है।


BASIC फ़ंक्शन के लिए कोड FuzzyLookup

FuzzyLookup फ़ंक्शन जोड़ने के लिए, Tools - Macros - Edit Macros... मेनू खोलें, Module1 चुनें और निम्नलिखित टेक्स्ट को मॉड्यूल में कॉपी करें:


Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String 
  'moonexcel.com.ua
  Dim Str       As String  
  Dim CellArray As Variant
  Dim StrArray  As Variant
  
  If IsMissing(SimThreshold) Then SimThreshold  = 0
  
  Str      = LCase(LookupValue)
  StrArray = Split(Str)
  StrExt   = UBound(StrArray)  
            
  For Each Cell In SrcTable
                          
    CellArray = Split(LCase(Cell))
    CellExt   = UBound(CellArray)    	    
    CellRate  = 0
	
    'हम खोज वाक्यांश में प्रत्येक शब्द की जाँच करते हैं
    For x = 0 To StrExt 
    
      StrWord = StrArray(x)	  
      If Len(StrWord) = 0 Then GoTo continue_x
	  MaxStrWordRate = 0
	  
      'हम मानों की मूल तालिका से अगले सेल में प्रत्येक शब्द की जाँच करते हैं
      For i = 0 To CellExt
        
        CellWord = CellArray(i)
		If Len(CellWord) = 0 Then GoTo continue_i
   
        FindCharNum = OccurrenceNum(StrWord, CellWord)
        StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
		
        If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
		continue_i:
      Next i		    
		    		    
      CellRate = CellRate + MaxStrWordRate
	  continue_x:
    Next x               
        
    'हम सबसे अच्छा मेल रखते हैं
    If CellRate > MaxCellRate Then    
      MaxCellRate = CellRate
      BestCell    = Cell          
       
      FindCharNum = OccurrenceNum(Str, Cell)
      SimRate     = FindCharNum / Max(Len(Str),Len(Cell))
    End If       
        
  Next Cell
    
  IF SimRate >= SimThreshold Then 
    IF SimThreshold = -1 Then
      ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
    ElseIf SimThreshold = -2 Then
      ReturnValue = Format(SimRate, "0.00")
    Else
      ReturnValue = BestCell
    End If
  Else 
    ReturnValue = ""
  End If    
  
  FuzzyLOOKUP = ReturnValue
End Function


Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
  For i = 1 To Len(SourceString)	         		        	        
    'हम प्रत्येक प्रतीक की घटना की तलाश कर रहे हैं
    Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)  
    'हम संयोगों का काउंटर बढ़ाते हैं
    If Position > 0 Then		  
      Count = Count + 1
      'पाए गए प्रतीक को हटा दें
      TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)   
    End If
  Next i    
  OccurrenceNum = Count
End Function


Function Max(ByVal value1 As Variant, ByVal value2 As Variant)  
  If value1 > value2 Then
	Result = value1
  Else
	Result = value2
  End If
  Max = Result
End Function

इसके बाद, Macro Editor को बंद करें और LibreOffice calc वर्कशीट पर वापस लौटें - अब आप हमारे नए FuzzyLookup() फ़ंक्शन का उपयोग कर सकते हैं।