Download evaluate.py from JayceAnova/Benchmark-Singel-v2: direct link, hf CLI and curl.
- Browser
- Download file 1.94 kB
-
https://huggingface.co/JayceAnova/Benchmark-Singel-v2/resolve/main/evaluate.py
- Command line
-
hf download hf://JayceAnova/Benchmark-Singel-v2/evaluate.py
-
curl -L -o evaluate.py https://huggingface.co/JayceAnova/Benchmark-Singel-v2/resolve/main/evaluate.py
1.94 kB
| import math | |
| def get_topk_results(predictions, scores, targets, k, all_items=None): | |
| # target: ['<a-5><b-248><c-226><d-145>'] | |
| results = [] | |
| B = len(targets) | |
| predictions = [_.split("Response:")[-1] for _ in predictions] | |
| predictions = [_.strip().replace(" ","") for _ in predictions] | |
| # prediction: ['<a-9><b-70><c-10><d-21>', '<a-5><b-88><c-103><d-74>', '<a-29><b-70><c-36><d-113>'] | |
| if all_items is not None: | |
| for i, seq in enumerate(predictions): | |
| if seq not in all_items: | |
| scores[i] = -1000 | |
| for b in range(B): | |
| batch_seqs = predictions[b * k: (b + 1) * k] | |
| batch_scores = scores[b * k: (b + 1) * k] | |
| pairs = [(a, b) for a, b in zip(batch_seqs, batch_scores)] | |
| sorted_pairs = sorted(pairs, key=lambda x: x[1], reverse=True) | |
| target_item = targets[b] | |
| one_results = [] | |
| for sorted_pred in sorted_pairs: | |
| if sorted_pred[0] == target_item: | |
| one_results.append(1) | |
| else: | |
| one_results.append(0) | |
| results.append(one_results) | |
| # result: [[0, 0, 0]] | |
| return results | |
| def get_metrics_results(topk_results, metrics): | |
| res = {} | |
| for m in metrics: | |
| if m.lower().startswith("hit"): | |
| k = int(m.split("@")[1]) | |
| res[m] = hit_k(topk_results, k) | |
| elif m.lower().startswith("ndcg"): | |
| k = int(m.split("@")[1]) | |
| res[m] = ndcg_k(topk_results, k) | |
| else: | |
| raise NotImplementedError | |
| return res | |
| def ndcg_k(topk_results, k): | |
| ndcg = 0.0 | |
| for row in topk_results: | |
| res = row[:k] | |
| one_ndcg = 0.0 | |
| for i in range(len(res)): | |
| one_ndcg += res[i] / math.log(i + 2, 2) | |
| ndcg += one_ndcg | |
| return ndcg | |
| def hit_k(topk_results, k): | |
| hit = 0.0 | |
| for row in topk_results: | |
| res = row[:k] | |
| if sum(res) > 0: | |
| hit += 1 | |
| return hit | |