-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_ndcg_standalone.py
More file actions
53 lines (45 loc) · 1.92 KB
/
test_ndcg_standalone.py
File metadata and controls
53 lines (45 loc) · 1.92 KB
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
import unittest
import math
class TestNDCG(unittest.TestCase):
def setUp(self):
self.retrieved = [0, 1, 2] # Результаты поиска системы
self.relevance_scores = [3, 1, 2] # Оценки релевантности
def test_ndcg_at_k(self):
"""Тест расчета метрики NDCG@k"""
def ndcg_at_k(retrieved, relevance_scores, k):
"""Вычисляет NDCG@k"""
# Рассчитываем DCG
dcg = 0.0
for i in range(k):
if i < len(retrieved):
rank = i + 1
doc_idx = retrieved[i]
rel = relevance_scores[doc_idx]
dcg += rel / math.log(rank + 1, 2)
# Рассчитываем IDCG (идеальное ранжирование)
ideal_sorted = sorted(relevance_scores, reverse=True)
idcg = 0.0
for i in range(k):
if i < len(ideal_sorted):
rank = i + 1
idcg += ideal_sorted[i] / math.log(rank + 1, 2)
return dcg / idcg if idcg > 0 else 0.0
# Тест 1: NDCG@1
self.assertAlmostEqual(
ndcg_at_k(self.retrieved, self.relevance_scores, 1),
1.0
)
# Тест 2: NDCG@2
expected_ndcg_2 = (3 + 1/math.log(3, 2)) / (3 + 2/math.log(3, 2))
self.assertAlmostEqual(
ndcg_at_k(self.retrieved, self.relevance_scores, 2),
expected_ndcg_2
)
# Тест 3: NDCG@3
expected_ndcg_3 = (3 + 1/math.log(3, 2) + 2/math.log(4, 2)) / (3 + 2/math.log(3, 2) + 1/math.log(4, 2))
self.assertAlmostEqual(
ndcg_at_k(self.retrieved, self.relevance_scores, 3),
expected_ndcg_3
)
if __name__ == '__main__':
unittest.main()