input: Write a function to generate a fuzzy search algorithm in Python that can match strings with near similarities. The function should take a query string, a list of choices, and a threshold for the Levenshtein distance. If the Levenshtein distance between the query and any choice is less than or equal to the threshold, the choice should be included in the list of matches. The function should return the list of matches.
  assert find_matches("apple", ["apple", "apples", "aple", "app"], 2)==["apple", "apples", "aple"]
  assert find_matches("banana", ["banana", "bannana", "ban", "band"], 1)==["banana", "ban"]
  assert find_matches("cat", ["cat", "bat", "cart", "cut"], 1)==["cat", "cart"]
  assert find_matches("", ["", "a", "b"], 0)==[""]
  assert find_matches("dog", ["doggy", "doggo", "dodge", "fog"], 3)==["doggy", "doggo", "dodge", "fog"]
output: def find_matches(query, choices, threshold):
      def levenshtein_distance(s1, s2):
          if len(s1) < len(s2):
              return levenshtein_distance(s2, s1)
          if len(s2) == 0:
              return len(s1)
          previous_row = range(len(s2) + 1)
          for i, c1 in enumerate(s1):
              current_row = [i + 1]
              for j, c2 in enumerate(s2):
                  insertions = previous_row[j + 1] + 1
                  deletions = current_row[j] + 1
                  substitutions = previous_row[j] + (c1 != c2)
                  current_row.append(min(insertions, deletions, substitutions))
              previous_row = current_row
          return previous_row[-1]
  
      return [choice for choice in choices if levenshtein_distance(query, choice) <= threshold]