Spaces:
Running
Running
| """ | |
| 高级评估指标 - Distinct-n、Repetition Rate、Token Entropy 等 | |
| """ | |
| import sys | |
| import torch | |
| import math | |
| from collections import Counter | |
| sys.path.insert(0, '.') | |
| def distinct_n(generated_texts, n=1): | |
| """ | |
| 计算 Distinct-n(多样性指标) | |
| Args: | |
| generated_texts: 生成的文本列表(token IDs) | |
| n: n-gram 的 n | |
| Returns: | |
| float: Distinct-n 分数(0-1,越高越好) | |
| """ | |
| total_ngrams = 0 | |
| unique_ngrams = 0 | |
| for text in generated_texts: | |
| # 转换为 n-gram | |
| ngrams = [tuple(text[i:i+n]) for i in range(len(text) - n + 1)] | |
| if len(ngrams) == 0: | |
| continue | |
| # 计数 | |
| total_ngrams += len(ngrams) | |
| unique_ngrams += len(set(ngrams)) | |
| if total_ngrams == 0: | |
| return 0.0 | |
| # Distinct-n = unique_ngrams / total_ngrams | |
| return unique_ngrams / total_ngrams | |
| def repetition_rate(generated_texts, n=3): | |
| """ | |
| 计算重复率(Repetition Rate) | |
| Args: | |
| generated_texts: 生成的文本列表(token IDs) | |
| n: n-gram 的 n | |
| Returns: | |
| float: 重复率(0-1,越低越好) | |
| """ | |
| total_ngrams = 0 | |
| repeated_ngrams = 0 | |
| for text in generated_texts: | |
| # 转换为 n-gram | |
| ngrams = [tuple(text[i:i+n]) for i in range(len(text) - n + 1)] | |
| if len(ngrams) == 0: | |
| continue | |
| # 计数 | |
| counter = Counter(ngrams) | |
| total_ngrams += len(ngrams) | |
| repeated_ngrams += sum(count for count in counter.values() if count > 1) | |
| if total_ngrams == 0: | |
| return 0.0 | |
| # Repetition Rate = repeated_ngrams / total_ngrams | |
| return repeated_ngrams / total_ngrams | |
| def average_length(generated_texts): | |
| """ | |
| 计算平均序列长度 | |
| Args: | |
| generated_texts: 生成的文本列表(token IDs) | |
| Returns: | |
| float: 平均序列长度 | |
| """ | |
| if len(generated_texts) == 0: | |
| return 0.0 | |
| total_length = sum(len(text) for text in generated_texts) | |
| return total_length / len(generated_texts) | |
| def token_entropy(generated_texts, vocab_size): | |
| """ | |
| 计算 Token 熵(Entropy) | |
| Args: | |
| generated_texts: 生成的文本列表(token IDs) | |
| vocab_size: 词汇表大小 | |
| Returns: | |
| float: Token 熵(越高表示多样性越好) | |
| """ | |
| # 合并所有 token | |
| all_tokens = [token for text in generated_texts for token in text] | |
| if len(all_tokens) == 0: | |
| return 0.0 | |
| # 计算概率分布 | |
| counter = Counter(all_tokens) | |
| total_tokens = len(all_tokens) | |
| # 计算熵 | |
| entropy = 0.0 | |
| for token, count in counter.items(): | |
| prob = count / total_tokens | |
| entropy -= prob * math.log(prob, 2) | |
| # 归一化到 0-1(最大熵 = log2(vocab_size)) | |
| max_entropy = math.log(vocab_size, 2) | |
| if max_entropy == 0: | |
| return 0.0 | |
| return entropy / max_entropy | |
| def evaluate_advanced(generated_texts, vocab_size, n=1): | |
| """ | |
| 评估高级指标 | |
| Args: | |
| generated_texts: 生成的文本列表(token IDs) | |
| vocab_size: 词汇表大小 | |
| n: n-gram 的 n | |
| Returns: | |
| dict: 高级指标字典 | |
| """ | |
| metrics = {} | |
| # Distinct-n | |
| metrics["distinct_n"] = distinct_n(generated_texts, n) | |
| # Repetition Rate | |
| metrics["repetition_rate"] = repetition_rate(generated_texts, n) | |
| # Average Length | |
| metrics["avg_length"] = average_length(generated_texts) | |
| # Token Entropy | |
| metrics["token_entropy"] = token_entropy(generated_texts, vocab_size) | |
| return metrics | |
| if __name__ == "__main__": | |
| print("=" * 60) | |
| print("Fusion-LLM 高级评估指标测试") | |
| print("=" * 60) | |
| print() | |
| # 创建示例生成文本 | |
| generated_texts = [ | |
| [1, 2, 3, 4, 5], | |
| [1, 2, 3, 6, 7], | |
| [1, 2, 8, 9, 10], | |
| ] | |
| vocab_size = 100 | |
| # 评估 | |
| metrics = evaluate_advanced(generated_texts, vocab_size, n=1) | |
| # 打印结果 | |
| print("[METRICS] 高级评估指标:") | |
| print(f" Distinct-1: {metrics['distinct_n']:.4f}") | |
| print(f" Repetition Rate: {metrics['repetition_rate']:.4f}") | |
| print(f" Average Length: {metrics['avg_length']:.2f}") | |
| print(f" Token Entropy: {metrics['token_entropy']:.4f}") | |
| print() | |
| print("[PASS] 高级评估指标测试通过") | |
| sys.exit(0) | |