-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathofficial_evaluation.py
86 lines (76 loc) · 2.65 KB
/
official_evaluation.py
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
import sys
if len(sys.argv) != 2:
print('Usage: python official_evaluation.py <path to tsv file>')
file_name = open(sys.argv[1], 'r')
precisions = []
recalls = []
eof = False
while True:
sentence_word = []
sentence_real = []
sentence_predicted = []
while True:
line = file_name.readline()
if not line:
eof = True
break
elif line == '\n':
break
line = line.split()
sentence_word.append(line[0])
sentence_real.append(line[1])
sentence_predicted.append(line[2])
i = 0
bound = len(sentence_predicted)
while i < bound:
if sentence_predicted[i] == '1':
start = i
finish = i+1
predicted_span_length = len(sentence_word[start])
while finish < bound and sentence_predicted[finish] == '1':
predicted_span_length += len(sentence_word[finish]) + 1
finish += 1
# span je [start, finish>
real_span_length = 0
if sentence_real[start] == '1':
real_span_length += len(sentence_word[start])
for j in range(start+1,finish):
if sentence_real[j] == '1':
real_span_length += len(sentence_word[j])
if sentence_real[j-1] == '1':
real_span_length += 1
i = finish
precisions.append(real_span_length / predicted_span_length)
else:
i += 1
i = 0
bound = len(sentence_real)
while i < bound:
if sentence_real[i] == '1':
start = i
finish = i+1
real_span_length = len(sentence_word[start])
while finish < bound and sentence_real[finish] == '1':
real_span_length += len(sentence_word[finish]) + 1
finish += 1
# span je [start, finish>
predicted_span_length = 0
if sentence_predicted[start] == '1':
predicted_span_length += len(sentence_word[start])
for j in range(start+1,finish):
if sentence_predicted[j] == '1':
predicted_span_length += len(sentence_word[j])
if sentence_predicted[j-1] == '1':
predicted_span_length += 1
i = finish
recalls.append(predicted_span_length / real_span_length)
else:
i += 1
if eof:
break
P = sum(precisions) / len(precisions) if len(precisions) > 0 else 1
R = sum(recalls) / len(recalls) if len(recalls) > 0 else 1
F1 = (2*P*R) / (P + R)
print(P)
print(R)
print(F1)