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.
Anyway, on unix (actually MacOSX) this will run and run (haven't tested
it on 1000s of sentences, but plenty); on windows, it packs in after
five sentences (sometimes fewer) and completely freezes. 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.
I'm not very familiar with windows. Does anyone have any ideas what
might be causing the windows moses to keel over? Is it something to do
with the way windows manages threads/processes/memory? Anything I can
do? Unfortunately has to run on windows.
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