Dear All

I have this little python script to run quick tests on moses models (see
below).  The same script works on unix and windows, given the right
paths.  I'm also using the same basic idea as a basis for the moses
thread in a translation GUI.

Essentially, the MosesCMD class starts up moses in a subprocess, and
subsequent calls to translate() send data in on the subprocess' stdin
and receive translations on its stdout.  nb: I'm not using communicate
as that kills the process after reading its output.

I wrote recently (5th April) that on Windows this script freezes after
five sentences, but on unix it's OK.  Turns out on unix -- macOSX at least
-- it freezes after 38 sentences.

Automatically killing the subprocess and starting a new one after every three
sentences works sometimes, but sometimes (eg when it's powering the
moses thread in a GUI) actually makes things worse.

The moses decoder I'm using on windows I compiled under cygwin.  Both
decoders are using the same irstlm language models.

Should the moses decoder be able to run indefinitely?  Can anyone help me
work out what's going wrong here?

With thanks and best wishes

Ivan

Here's the script:

#! /usr/bin/env python

import subprocess, time

class MosesCMD(object):
     def ___init___(self):
         self.cmd_path = ''
         self.model_path = ''
         self.recaser_model_path = ''
         self.proc = None

     def start(self):
         cmd = "%s  -f  %s" % (self.cmd_path, self.model_path)
         if self.recaser_model_path:
             cmd = "%s  |  %s  -v 0  -f %s  -dl 1" \
                   % (cmd, self.cmd_path, self.recaser_model_path)
         self.proc = subprocess.Popen(cmd, shell=True,
                                      stdin=subprocess.PIPE,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.PIPE)

     def translate(self, line):
         line = '%s\n' % line.strip()
         self.proc.stdin.write(line)
         return self.proc.stdout.readline().capitalize()

     def close(self):
         self.proc.kill()

def main():
     mc = MosesCMD()
     mc.cmd_path = "/path/to/mosesdecoder/moses-cmd/src/moses"
     mc.model_path = "/path/to/model/moses.ini"
     mc.recaser_model_path = "/path/to/recase/moses.ini"
     mc.start()

     time.sleep(1)
     print 'Ready.'

     cy = '*'
     while cy:
         cy = raw_input('cymraeg>  ')
         en = mc.translate(cy)
         print 'saesneg>  %s\n' %  en
     mc.close()

if ___name___ == "___main___":
     main()



--
********************************
Ivan Uemlianin

Canolfan Bedwyr
Safle'r Normal Site
Prifysgol Bangor University
BANGOR
Gwynedd
LL57 2PZ

[email protected]
http://www.bangor.ac.uk/~cbs007/
********************************

_______________________________________________
Moses-support mailing list
[email protected]
http://mailman.mit.edu/mailman/listinfo/moses-support

Reply via email to