Finding closest answer to string

How would I find out the closest answer to a string? For example, how would I find the string that resembles “House” in a table of strings {Home, Egg, Neck} (output should be “Home”). I’m not very experienced in working with strings so any advice or pointers would be highly appreciated!

Luau is not that advanced to find similarities between words. You need to store the two words in a dictionary and then loop through it, getting the key and the value which are House and Home.

Using a string similarity algorithm is one method for locating the string in a table of strings that most closely resembles a target string. For calculating the similarity between two strings, a variety of algorithms are available, including:

The Levenshtein distance algorithm determines how many insertions, deletions, or substitutions are necessary to change one string into another. The similarities between the strings increase with decreasing distance.

The size of the intersection of two sets—in this case, the sets are the sets of characters in each string—dividend the size of the union of the sets—is determined by the Jaccard algorithm. The strings are more similar the higher the index.

Similarity in cosine: This formula determines the cosine of the angle between two vectors (in this case, the vectors are the character frequencies in each string). The similarity of the strings increases with the proximity of the vectors.

You can loop through the table and use the selected algorithm to determine how similar each string in the table is to the target string in order to use one of these methods to locate the string in the table of strings that matches the target string the closest. The string with the highest similarity rating can then be kept track of and returned as the closest match.

Here is an example of how you might implement this approach using the Levenshtein distance algorithm in Lua:

-- Function to calculate the Levenshtein distance between two strings
function levenshtein(str1, str2)
  -- Initialize a matrix to store the distances between substrings
  local matrix = {}

  -- Initialize the first row and column of the matrix
  for i = 0, #str1 do
    matrix[i] = {[0] = i}
  end
  for j = 0, #str2 do
    matrix[0][j] = j
  end

  -- Loop through the strings and fill in the matrix
  for i = 1, #str1 do
    for j = 1, #str2 do
      local cost = (str1:sub(i, i) == str2:sub(j, j) and 0 or 1)
      matrix[i][j] = math.min(matrix[i-1][j] + 1, matrix[i][j-1] + 1, matrix[i-1][j-1] + cost)
    end
  end

  -- Return the final value in the matrix (the distance between the two strings)
  return matrix[#str1][#str2]
end

-- Function to find the closest match to a target string in a table of strings
function closest_match(target, strings)
  -- Initialize variables to store the closest match and its distance
  local closest, distance = nil, math.huge

  -- Loop through the strings and find the one with the smallest distance
  for _, str in pairs(strings) do
    local d = levenshtein(target, str)
    if d < distance then
      closest, distance = str, d
    end
  end

  -- Return the closest match
  return closest
end

-- Example usage
local strings = {"Home", "Egg", "Neck"}
local target = "House"
local closest = closest_match(target, strings)
print(closest) -- Output: "Home"
6 Likes

Ah right, thanks for the help.

yo what the hell bro you’ve got such a big brain wtf

Holy thanks for that dude, I appreciate it!

LOL PLEASE THAT MADE ME LAUGH :rofl::rofl::rofl:

no i mean actually bro like computers are usually dumb you give them instructions to do stuff and like i would never think of such algorithm man

lol. I programmed a while now, you’ll also find yourself here soon. :smiley:

Hope it helped you!

Summary

This text will be hidden

Sorry for asking so late but would you mind explaining your code? I tried to understand it but I think it’s a little too advanced for me to fully understand on my own, hope you don’t mind!

Levenshtein and closest match are the two functions that the code defines.

When two strings are compared, the Levenshtein function determines how many single-character modifications (insertions, deletions, or replacements) are necessary to transform one string into the other. By filling in a matrix that stores the separations between the two strings’ substrings, it does this. The final value of the matrix, which measures the separation between the two entire strings, is what the function returns.

A target string and a table of strings are passed to the closest match function, which returns the string in the table with the least Levenshtein distance to the target string. This is accomplished by iteratively looping through the strings in the table and determining the separation between each string and the target string using the Levenshtein function. The closest match is then returned when the loop is over by keeping track of it and its distance.

The closest match function is also demonstrated in the code, with the target text being “House” and the table of strings being “Home,” “Egg,” and “Neck.” “Home” will be the result of the example because it matches the target string the closest.

I see, thank you for the in depth reply - I appreciate it!

1 Like

You can make a search query with this method correct?

You can put all the distances and strings in a table and sort the table by distance from smallest to largest, then show on a scrolling frame, for example, the search results in order of relevance.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.