mosesdecoder/contrib/promix/test_nbest.py
2013-04-18 07:51:06 +01:00

125 lines
4.6 KiB
Python
Executable File

#!/usr/bin/env python
# coding=utf8
import numpy as np
import numpy.testing as nptest
import os.path
import unittest
from nbest import *
class TestReadNBest(unittest.TestCase):
def setUp(self):
self.nbest = "test_data/test.nbest.nbest"
self.nbest_segment = "test_data/test.nbest.nbest.segments"
self.scores = "test_data/test.nbest.scores"
self.input = "test_data/test.nbest.input"
def test_featureindex(self):
for nbest in get_scored_nbests(self.nbest,self.scores,self.input):
pass
self.assertEqual(get_feature_index("tm"), [9,14])
self.assertEqual(get_feature_index("lm"), [7,8])
self.assertEqual(get_feature_index("d"), [0,7])
self.assertEqual(get_feature_index("w"), [8,9])
def test_nosegment(self):
count = 0
for nbest in get_scored_nbests(self.nbest,self.scores,self.input):
count += 1
hyp0 = nbest.hyps[0]
expected_fv = np.array([0,-1.51037,0,0,-2.60639,0,0 ,-36.0562, -8,-5.97082,-14.8327,-2.41162,-9.32734,3.99959])
self.assertEqual(len(hyp0.fv), len(expected_fv))
for i in range(len(hyp0.fv)):
self.assertAlmostEqual(expected_fv[i],hyp0.fv[i])
self.assertEqual(hyp0.text,"taming politicians on both sides of the Atlantic")
self.assertEqual(count,1)
def test_segment(self):
count = 0
for nbest in get_scored_nbests(self.nbest_segment,self.scores,self.input, segments=True):
count += 1
hyp0 = nbest.hyps[0]
self.assertEqual(hyp0.text,"taming politicians on both sides of the Atlantic")
expected_align = [(0,2,1), (2,4,2), (4,6,4), (6,9,8)]
self.assertEqual(hyp0.alignment, expected_align)
self.assertEqual(count,1)
class TestMosesPhraseScorer(unittest.TestCase):
def setUp(self):
self.scorer = MosesPhraseScorer\
(("test_data/esen.nc.model.filtered/phrase-table.0-0.1.1", \
"test_data/esen.ep.model.filtered/phrase-table.0-0.1.1"))
def test_phrase_scores(self):
hyp0 = Hypothesis("taming |0-1| politicians |2-3| on both |4-5| sides of the Atlantic |6-8|", [0, -1.51037,0, 0, -2.60639, 0, 0, -36.0562,-8,-5.97082,-14.8327,-2.41162,\
-9.32734,3.99959], True)
hyp0.input_line = "domando a los políticos en ambos lados del Atlántico"
#hyp0.score = 0.2140
self.scorer.add_scores(hyp0)
self.assertEqual(len(hyp0.phrase_scores),2)
# Each ttable should provide 4 sets of 4 scores (ignore penalty)
# These are the probabilities
# nc first, then ep. Columns are different features
expected = np.array([\
[[0.0740741,0.00756144,1,0.500047],\
[0.545866,0.233725,0.818336,0.186463],\
[0.288344,0.0548148,0.335714,0.0543585],\
[0.777778,0.0122444,0.777778,0.0351361]],\
[[0,0,0,0],\
[0.33497, 0.180441, 0.638586, 0.0962213],\
[0.0908379,0.0213197,0.187399,0.0498198],
[0.62585,0.00702384,0.836364,0.0687874]]\
])
nptest.assert_almost_equal(hyp0.phrase_scores, expected)
# These are the interpolation weights reported by tmcombine
weights = np.array([[0.54471993730312251, 0.45528006269687754],\
[0.56546688367708142, 0.43453311632291863],\
[0.55867730373453584, 0.44132269626546422],\
[0.46645964485220004, 0.53354035514779996]])
#check that the scores are interpolated as expected
interpolated_probs = expected[0]*weights[:,0] + expected[1]*weights[:,1]
interpolated_scores = np.log(interpolated_probs)
# each column corresponds to a feature
expected_fv = interpolated_scores.sum(axis=0)
for i in range(4):
self.assertAlmostEqual(hyp0.fv[9+i], expected_fv[i], places=4)
class TestPhraseCache (unittest.TestCase):
def test_add_get(self):
"""Add something to cache and check we can get it back"""
cache = PhraseCache(10)
self.assertFalse(cache.get("aa", "bb"))
scores = [1,2,3,4,5]
cache.add("aa", "bb", scores)
self.assertEquals(cache.get("aa","bb"),scores)
self.assertFalse(cache.get("aa","cc"))
self.assertFalse(cache.get("cc","bb"))
def test_lru(self):
"""Check that items are cleared from the cache"""
cache = PhraseCache(2)
s1 = [1,2,3,4,5]
s2 = [2,3,4,5,6]
s3 = [3,4,5,6,7]
cache.add("aa","bb",s1)
cache.add("bb","cc",s2)
cache.add("dd","ee",s3)
self.assertEquals(cache.get("dd","ee"), s3)
self.assertEquals(cache.get("bb","cc"), s2)
self.assertFalse(cache.get("aa","bb"))
cache.add("aa","bb",s1)
self.assertFalse(cache.get("dd","ee"))
if __name__ == "__main__":
unittest.main()
suite = unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestReadNBest), unittest.TestLoader().loadTestsFromTestCase(TestMosesPhraseScorer)])