| # Python interface to Moses | |
| The idea is to have some of Moses' internals exposed to Python (inspired on pycdec). | |
| ## What's been interfaced? | |
| * Binary tables: | |
| Moses::PhraseDictionaryTree | |
| OnDiskPt::OnDiskWrapper | |
| ## Building | |
| 1. Build the python extension: | |
| You need to compile Moses with link=shared | |
| ./bjam --libdir=path link=shared | |
| Then you can build the extension (in case you used --libdir=path above, use --moses-lib=path below) | |
| python setup.py build_ext -i [--with-cmph] [--moses-lib=PATH] [--cython] [--max-factors=NUM] [--max-kenlm-order=NUM] | |
| Use `--cython` if you want to re-compile the pyx files, note that they already come compiled so that you don't need to have Cython installed | |
| ## Example | |
| ### Getting a phrase table | |
| cd examples | |
| export LC_ALL=C | |
| cat phrase-table.txt | sort | ../../../bin/processPhraseTable -ttable 0 0 - -nscores 5 -alignment-info -out phrase-table | |
| ### Getting a rule table | |
| cd examples | |
| ../../../bin/CreateOnDiskPt 0 0 5 20 2 rule-table.txt rule-table | |
| ### Querying | |
| 1. Phrase-based | |
| echo "casa" | python example.py examples/phrase-table 5 20 | |
| echo "essa casa" | python example.py examples/phrase-table 5 20 | |
| 2. Hierarchical | |
| echo "i [X]" | python example.py examples/rule-table 5 20 | |
| echo "have [X]" | python example.py examples/rule-table 5 20 | |
| echo "[X][X] do not [X][X] [X]" | python example.py examples/rule-table 5 20 | |
| ### Code | |
| ```python | |
| from moses.dictree import load # load abstracts away the choice of implementation by checking the available files | |
| import sys | |
| if len(sys.argv) != 4: | |
| print "Usage: %s table nscores tlimit < query > result" % (sys.argv[0]) | |
| sys.exit(0) | |
| path = sys.argv[1] | |
| nscores = int(sys.argv[2]) | |
| tlimit = int(sys.argv[3]) | |
| table = load(path, nscores, tlimit) | |
| for line in sys.stdin: | |
| f = line.strip() | |
| result = table.query(f) | |
| # you could simply print the matches | |
| # print '\n'.join([' ||| '.join((f, str(e))) for e in matches]) | |
| # or you can use their attributes | |
| print result.source | |
| for e in result: | |
| if e.lhs: | |
| print '\t%s -> %s ||| %s ||| %s' % (e.lhs, | |
| ' '.join(e.rhs), | |
| e.scores, | |
| e.alignment) | |
| else: | |
| print '\t%s ||| %s ||| %s' % (' '.join(e.rhs), | |
| e.scores, | |
| e.alignment) | |
| ``` | |
| ## Changing the code | |
| If you want to add your changes you are going to have to recompile the cython code. | |
| 1. Compile the cython code: | |
| python setup.py build_ext -i --cython | |