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 a choice is less than or equal to the threshold, the choice should be considered a match. The function should return a list of all matches.
  assert find_matches("apple", ["apples", "applet", "appetite"], 2)==["apples", "applet"]
  assert find_matches("banana", ["bananas", "bannanana", "bandana"], 3)==["bananas", "bannanana"]
  assert find_matches("pear", ["pears", "pair", "pear"], 1)==["pears", "pear"]
  assert find_matches("orange", ["oranges", "organ", "ornge"], 2)==["oranges"]
  assert find_matches("", ["apple", "banana", "pear"], 0)==["apple", "banana", "pear"]
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]
      
      matches = []
      for choice in choices:
          if levenshtein_distance(query, choice) <= threshold:
              matches.append(choice)
      return matches