File size: 4,499 Bytes
9a07014
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
"""
高级评估指标 - 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)