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
|
def hope_and_fear kbest, action
max = -1.0/0
max_idx = -1
kbest.each_with_index { |k,i|
if action=='hope' && k.scores[:decoder] + k.scores[:per_sentence_bleu] > max
max_idx = i; max = k.scores[:decoder] + k.scores[:per_sentence_bleu]
end
if action=='fear' && k.scores[:decoder] - k.scores[:per_sentence_bleu] > max
max_idx = i; max = k.scores[:decoder] - k.scores[:per_sentence_bleu]
end
}
return max_idx
end
def gethopefear_rebol kbest, feedback, gold, max, corpus, own_reference=nil
hope = fear = nil; new_reference = nil
type1 = type2 = false
if feedback == true
# hope
hope = kbest[0]
new_reference = hope
kbest.each { |k| k.scores[:per_sentence_bleu] = BLEU::per_sentence_bleu k.s, new_reference.s }
# fear
kbest.sort_by { |k| -(k.scores[:decoder]-k.scores[:per_sentence_bleu]) }.each_with_index { |k,i|
break if i==max
if !exec(k.s, gold, corpus, true)[0]
fear = k
break
end
}
type1 = true
else
# fear
fear = kbest[0]
# hope
kbest.sort_by { |k| -(k.scores[:decoder]+k.scores[:per_sentence_bleu]) }.each_with_index { |k,i|
break if i==max
if exec(k.s, gold, corpus, true)[0]
hope = k
break
end
}
type2 = true
end
skip = true if !hope||!fear
return hope, fear, skip, type1, type2, new_reference
end
def gethopefear_rebol_light kbest, feedback, gold, corpus
hope = fear = nil
type1 = type2 = false
if feedback == true
hope = kbest[0]
type1 = true
else
hope = kbest[hope_and_fear kbest, 'hope']
type2 = true
end
fear = kbest[hope_and_fear kbest, 'fear']
# skip example if fear gives the right answer
skip = exec(fear.s, gold, corpus, true)[0]
return hope, fear, skip, type1, type2
end
def gethopefear_exec kbest, feedback, gold, max, corpus, own_reference=nil
hope = fear = nil; hope_idx = 0; new_reference = nil
type1 = type2 = false
if feedback == true
STDERR.write "If\n"
hope = kbest[0]
new_reference = hope
type1 = true
elsif own_reference
STDERR.write "elsif\n"
STDERR.write "#{own_reference.class}\n"
hope = own_reference
type1 = true
else
STDERR.write "else\n"
# search for first (by decoder score) translation that gives the correct answer
kbest.each_with_index { |k,i|
next if i==0
break if i==max
if exec(k.s, gold, corpus, true)[0]
hope_idx = i
hope = k
break
end
}
type2 = true
end
# --"-- doesn't give the correct answer
kbest.each_with_index { |k,i|
next if i==0||i==hope_idx
break if i==max
if !exec(k.s, gold, corpus, true)[0]
fear = k
break
end
}
skip = true if !hope||!fear
return hope, fear, skip, type1, type2, new_reference
end
def gethopefear_rampion kbest, reference
hope = fear = nil
type1 = type2 = false
# 1best is automatically hope if it matches reference
if kbest[0].s == reference
hope = kbest[0]
fear = kbest[hope_and_fear kbest, 'fear']
type1 = true
else
hope = kbest[hope_and_fear kbest, 'hope']
# 1best is automatically fear if it doesn't match reference
fear = kbest[0]
type2 = true
end
return hope, fear, false, type1, type2
end
|