class IngredientMatcher(object):
    """
    matches cocktail recipes ingredients to their matches from the flavor handbook
    """
    def __init__(self, comp_ing_dict):
        self.decomposer = IngredientDecomposer()
        self.sanitized_comp_ing_dict = {k.decode('utf-8'): v for k, v in comp_ing_dict.iteritems()}
        self.match_dict = {}

    def make_match_dict(self, unique_ing_list):
        return {k: self.match_ingredients([k]) for k in unique_ing_list}

    def match_ingredients(self, recipe):
        """
        Makes a fuzzy match between ingredients in a recipe and in the ingredient:compound dict
        :param recipe: ingredients to match
        :param comp_ing_dict: compound ingredient dict
        :return:
        """
        matches = []
        for ing in recipe:
            component_matches = self.decomposer.get_component_ingredients(ing)
            if component_matches:
                return self.match_ingredients(component_matches)
            match_list = process.extractBests(ing, self.sanitized_comp_ing_dict.keys(),
                                              scorer=fuzz.ratio, score_cutoff=98)
            matches += [match[0] for match in match_list]
            match_list = process.extractBests(ing, self.sanitized_comp_ing_dict.keys(),
                                              scorer=fuzz.token_sort_ratio,
                                              score_cutoff=85)
            matches += [match[0] for match in match_list]
            if not matches:
                sub_ing = ing.split()
                for i in sub_ing:
                    match_list = process.extractBests(i, self.sanitized_comp_ing_dict.keys(),
                                                      scorer=fuzz.ratio, score_cutoff=88)
                    matches += [match[0] for match in match_list]
        return list(set(matches))

    def lookup_match(self, ingredient):
        return self.match_dict[ingredient]
 def __init__(self, comp_ing_dict):
     self.decomposer = IngredientDecomposer()
     self.sanitized_comp_ing_dict = {k.decode('utf-8'): v for k, v in comp_ing_dict.iteritems()}
     self.match_dict = {}