def test_normalize(self): data = [1.1, 2.4, 3.2, 4.6, 5.8, 6.5, 7.9, 8.1, 9.1, 10, None] mean = 5.87 max_value = max(filter(None, data)) min_value = min(filter(None, data)) calc_result = [float(v - mean) / (max_value - min_value) for v in data if v] calc_returned = ItemEvaluator.normalize(data) for index, value in enumerate(calc_result): self.assertLess(abs(calc_result[index] - calc_returned[index]), 1 / pow(10, 5))
def test_calc_more_is_better(self): data = self.__create_test_data() values = vector_manager.to_vector("reviews", data) max_value = max(filter(None, values)) min_value = min(filter(None, values)) calc_result = [(v - min_value) / (max_value - min_value) for v in values if v] calc_returned = ItemEvaluator.calc_more_is_better("reviews", data) for index, value in enumerate(calc_result): self.assertLess(abs(calc_result[index] - calc_returned[index]), 1 / pow(10, 5)) print(calc_result[index])
def test_calc_near_is_better(self): data = self.__create_test_data() values = vector_manager.to_vector("bpm", data) max_value = max(filter(None, values)) min_value = min(filter(None, values)) selected = EvaluateItem().set_params(100, 10, datetime(2010, 4, 1, 0, 0)) calc_result = [1 - abs(v - selected.bpm) / (max_value - min_value) for v in values if v] calc_returned = ItemEvaluator.calc_near_is_better("bpm", data, selected) for index, value in enumerate(calc_result): self.assertLess(abs(calc_result[index] - calc_returned[index]), 1 / pow(10, 5)) print(calc_result[index])
def test_calc_text_token_distance(self): item_count = 5 test_items = [EvaluateItem()] * item_count for i in range(item_count): if i == 0: test_items[i].tags = ["folk", "Rock", "Folk Rock", "Indie"] elif i == 1: test_items[i].tags = ["rock"] elif i == 2: test_items[i].tags = ["rock", "alternative rock"] elif i == 3: test_items[i].tags = ["magnet", "rock", "melodious chorus"] elif i == 4: test_items[i].tags = ["Rock", "Creature", "3d", "Mashup"] distances = ItemEvaluator.calc_text_token_distance("tags", test_items, test_items[0]) print(distances)
def test_make_pattern(self): data = self.__create_test_data() selected = EvaluateItem().set_params(100, 10, datetime(2013, 4, 1, 0, 0)) evaluator = ItemEvaluator() evaluator.set_rule("bpm", ItemEvaluator.calc_near_is_better) evaluator.set_rule("reviews", ItemEvaluator.calc_more_is_better) evaluator.set_rule("elapsed", ItemEvaluator.calc_less_is_better) patterns = evaluator.make_pattern(data, selected) for p in patterns: print(p) self.assertLess(abs(p.score - self.__calculate_pattern_percentage(p, selected, data)), 1 / pow(10, 5))
def test_get_attributes(self): item = EvaluateItem() attributes = ItemEvaluator.get_attributes(item) for a in attributes: print(a) self.assertEquals(5, len(attributes)) # 4 is the number of attribute except private.
def make_evaluator(cls, history=None): from .track_criticize_pattern import TrackCriticizePattern evaluator = ItemEvaluator(TrackCriticizePattern) evaluator.set_rule("elapsed", EvaluationType.LessIsBetter) evaluator.set_rule("genre_score", EvaluationType.NearIsBetter) evaluator.set_rule("bpm", EvaluationType.NearIsBetter) evaluator.set_rule("comment_count", EvaluationType.MoreIsBetter) evaluator.set_rule("download_count", EvaluationType.MoreIsBetter) evaluator.set_rule("playback_count", EvaluationType.MoreIsBetter) evaluator.set_rule("favoritings_count", EvaluationType.MoreIsBetter) evaluator.set_rule("tag_tokens", EvaluationType.TextTokens) # set weight by history evaluator.set_weight("comment_count", 1.5) evaluator.set_weight("playback_count", 2) evaluator.set_weight("favoritings_count", 2) return evaluator
def __get_ruled_evaluator(self): evaluator = ItemEvaluator() evaluator.set_rule("bpm", ItemEvaluator.calc_near_is_better) evaluator.set_rule("reviews", ItemEvaluator.calc_more_is_better) evaluator.set_rule("elapsed", ItemEvaluator.calc_less_is_better) return evaluator