summaryrefslogtreecommitdiff
path: root/kbest-bleu-oracles
blob: ea76ab10ac055621d2e74d3183f427b9c573706c (plain)
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
#!/usr/bin/env ruby

require 'zipf'
require 'optimist'

def get_context kbest_lists, references, n
  a = []
  kbest_lists.each_index { |i|
    a << BLEU::get_counts(kbest_lists[i][0].s, references[i], n, 1)
  }
  return a
end

def main
  conf = Optimist::options do
    opt :kbest_lists, "kbest lists", :type => :string, :required => true
    opt :references, "reference", :type => :string, :required => true
    opt :n, "N for BLEU", :type => :int, :default => 4
    opt :weight, "how much to weigh single translations", :type => :int, :default => 1
    opt :debug, "debug mode", :type => :bool, :default => false
  end
  debug = conf[:debug]
  n = conf[:n]
  kbest_lists = read_kbest_lists conf[:kbest_lists]
  references = ReadFile.readlines_strip conf[:references]
  context = get_context kbest_lists, references, n
  kbest_lists.each_with_index { |kbest,j|
    scores = []
    max_score = -1.0/0
    max_idx = -1
    kbest.each_index { |i|
      context_cp = context.dup
      context_cp[j] = BLEU::get_counts kbest[i].s, references[j], n, conf[:weight]
      score = BLEU::hbleu_(context_cp, n, debug)
      scores << score
      if score > max_score
        max_score = score
        max_idx = i
      end
      STDERR.write "#{i} #{kbest[i]}\t#{score}\n---\n" if debug
    }
    puts "#{references[j]}"
    puts "BLEU=#{scores[0]} ||| #{kbest[0]}"
    puts "BLEU=#{max_score} ||| #{kbest[max_idx]}"
    puts
    STDERR.write "\n" if debug
  }
end

main