zeechimp commited on
Commit
610ec7b
·
verified ·
1 Parent(s): 34384f4

Create evaluate.py

Browse files
Files changed (1) hide show
  1. evaluate.py +76 -0
evaluate.py ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ evaluate.py
3
+
4
+ Reproduce the retrieval metrics.
5
+ """
6
+
7
+ import numpy as np
8
+ from collections import Counter
9
+
10
+ from hv_temporal_context import HVTemporalContext, DEFAULT_K
11
+ from train_temporal_context import load_turns, _fill, TOPIC_TEMPLATES
12
+
13
+
14
+ def generate_queries(seed=99, n_per_topic=4):
15
+ rng = np.random.default_rng(seed)
16
+ queries = []
17
+ for topic, tpl in TOPIC_TEMPLATES.items():
18
+ for _ in range(n_per_topic):
19
+ u = _fill(rng.choice(tpl["user"]), tpl["fills"], rng)
20
+ queries.append((topic, u))
21
+ rng.shuffle(queries)
22
+ return queries
23
+
24
+
25
+ def evaluate_similarity(model, queries, k=DEFAULT_K):
26
+ precisions = []
27
+ for true_topic, query in queries:
28
+ idx, _ = model.retrieve(query, k)
29
+ topics = [model.topics[i] for i in idx]
30
+ precisions.append(sum(1 for t in topics if t == true_topic) / len(topics))
31
+ return float(np.mean(precisions))
32
+
33
+
34
+ def evaluate_temporal(model, queries, k=DEFAULT_K, lambda_surprise=0.5):
35
+ precisions = []
36
+ for true_topic, query in queries:
37
+ idx, _ = model.retrieve_temporal(query, true_topic, k, lambda_surprise)
38
+ topics = [model.topics[i] for i in idx]
39
+ precisions.append(sum(1 for t in topics if t == true_topic) / len(topics))
40
+ return float(np.mean(precisions))
41
+
42
+
43
+ def evaluate_random(model, queries, k=DEFAULT_K, seed=0):
44
+ rng = np.random.default_rng(seed)
45
+ precisions = []
46
+ for true_topic, _ in queries:
47
+ idx = rng.choice(len(model.topics), size=k, replace=False)
48
+ topics = [model.topics[i] for i in idx]
49
+ precisions.append(sum(1 for t in topics if t == true_topic) / len(topics))
50
+ return float(np.mean(precisions))
51
+
52
+
53
+ def main(model_path="temporal_context_model"):
54
+ print("Loading model...")
55
+ model = HVTemporalContext.load(model_path)
56
+ print(f" {len(model.texts)} turns, "
57
+ f"{len(model.vocab_index)} vocabulary")
58
+
59
+ queries = generate_queries(seed=99, n_per_topic=4)
60
+
61
+ p_rand = evaluate_random(model, queries)
62
+ p_sim = evaluate_similarity(model, queries)
63
+ p_temp = evaluate_temporal(model, queries)
64
+
65
+ print()
66
+ print(f" {'method':<28} {'precision@5':>12}")
67
+ print(" " + "-" * 42)
68
+ print(f" {'random':<28} {p_rand:>12.3f}")
69
+ print(f" {'similarity':<28} {p_sim:>12.3f}")
70
+ print(f" {'position-conditional':<28} {p_temp:>12.3f}")
71
+ print()
72
+ print(f" gap over similarity: {p_temp - p_sim:+.3f}")
73
+
74
+
75
+ if __name__ == "__main__":
76
+ main()