|
import os |
|
from collections import Counter |
|
import math |
|
|
|
|
|
def calculate_topk_upper_bound(file_path, k=5): |
|
""" |
|
Calculates the upper bound for top-k accuracy based on the tokenized text file. |
|
|
|
Args: |
|
file_path (str): Path to the input text file. |
|
k (int): Top-k accuracy value to compute. |
|
|
|
Returns: |
|
float: The upper bound for top-k accuracy. |
|
""" |
|
try: |
|
|
|
with open(file_path, "r", encoding="utf-8", errors="ignore") as f: |
|
text = f.read() |
|
|
|
tokens = text.split() |
|
|
|
|
|
token_counts = Counter(tokens) |
|
total_tokens = len(tokens) |
|
|
|
if total_tokens == 0: |
|
return 0 |
|
|
|
|
|
token_probabilities = {token: count / total_tokens for token, count in token_counts.items()} |
|
|
|
|
|
entropy = -sum(p * math.log2(p) for p in token_probabilities.values()) |
|
|
|
|
|
sorted_tokens = sorted(token_probabilities.items(), key=lambda x: x[1], reverse=True) |
|
top_k_prob = sum(prob for _, prob in sorted_tokens[:k]) |
|
|
|
|
|
print(f"Entropy: {entropy:.4f} bits") |
|
print(f"Top-{k} Accuracy Upper Bound: {top_k_prob:.4f}") |
|
return top_k_prob |
|
except Exception as e: |
|
print(f"Error: {e}") |
|
return None |
|
|
|
|
|
|
|
file_path = os.path.expanduser( |
|
"~/torch_datasets/github-python/corpus/data/corpus_processed.txt" |
|
) |
|
|
|
top_k_accuracy = calculate_topk_upper_bound(file_path, k=5) |
|
if top_k_accuracy is not None: |
|
print(f"Upper Bound for Top-5 Accuracy: {top_k_accuracy:.4f}") |
|
|