summaryrefslogtreecommitdiff
path: root/realtime/rt/decoder.py
blob: 57739d933356a1ece3785ff1a79db0208f35e23a (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
import logging
import os
import subprocess

import util

class Decoder:

    def close(self):
        self.decoder.stdin.close()

    def decode(self, sentence, grammar):
        input = '<seg grammar="{g}">{s}</seg>\n'.format(s=sentence, g=grammar)
        self.decoder.stdin.write(input)
        return self.decoder.stdout.readline().strip()

class CdecDecoder(Decoder):
    
    def __init__(self, config, weights):
        cdec_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
        decoder = os.path.join(cdec_root, 'decoder', 'cdec')
        decoder_cmd = [decoder, '-c', config, '-w', weights]
        logging.info('Executing: {}'.format(' '.join(decoder_cmd)))
        self.decoder = util.popen_io(decoder_cmd)

class MIRADecoder(Decoder):

    def __init__(self, config, weights):
        cdec_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
        mira = os.path.join(cdec_root, 'training', 'mira', 'kbest_cut_mira')
        #                                              optimizer=2 step=0.001    best=500,    k=500,       uniq, stream
        mira_cmd = [mira, '-c', config, '-w', weights, '-o', '2', '-C', '0.001', '-b', '500', '-k', '500', '-u', '-t']
        logging.info('Executing: {}'.format(' '.join(mira_cmd)))
        self.decoder = util.popen_io(mira_cmd)

    def update(self, sentence, grammar, reference):
        input = 'LEARN ||| <seg grammar="{g}">{s}</seg> ||| {r}\n'.format(s=sentence, g=grammar, r=reference)
        self.decoder.stdin.write(input)
        return self.decoder.stdout.readline().strip()