From 2b9e74247e6669956dc4a9ed1fa374bf2f17da32 Mon Sep 17 00:00:00 2001 From: Kevin Brubeck Unhammer Date: Wed, 3 Sep 2008 14:20:13 +0200 Subject: [PATCH] running manual EM on sentence NVN --- DMVCCM.org | 3 ++ src/loc_h_dmv.py | 82 +++++++++++++++++++++++++++++++++++++++++++++--------- src/loc_h_dmv.pyc | Bin 35279 -> 35564 bytes src/main.py | 24 ++++++++-------- tex/formulas.pdf | Bin 120272 -> 120297 bytes tex/formulas.tex | 4 +-- 6 files changed, 86 insertions(+), 27 deletions(-) diff --git a/DMVCCM.org b/DMVCCM.org index 8bbe9af..15a507d 100755 --- a/DMVCCM.org +++ b/DMVCCM.org @@ -14,6 +14,9 @@ [[file:src/wsjdep.py][wsjdep.py]] [[file:src/loc_h_dmv.py][loc_h_dmv.py]] +Trying out /not/ dividing by sum_hat_a now (in reestimate2), see how +that goes... + Meta-todo: - debug reestimate2 which stores charts for all sentences and has arguments as the outer loop diff --git a/src/loc_h_dmv.py b/src/loc_h_dmv.py index 1319783..a23fa9a 100644 --- a/src/loc_h_dmv.py +++ b/src/loc_h_dmv.py @@ -122,7 +122,7 @@ def locs(sent_nums, start, stop): ################################################### #@accepts(int, int, (int, int), int, Any(), [str], {tuple:float}, IsOneOf(None,{})) -def inner(i, j, node, loc_h, g, sent, ichart={}, mpptree=None): +def inner(i, j, node, loc_h, g, sent, ichart, mpptree=None): ''' The ichart is of this form: ichart[i,j,LHS, loc_h] where i and j are between-word positions. @@ -229,19 +229,19 @@ def inner(i, j, node, loc_h, g, sent, ichart={}, mpptree=None): if 'INNER' in DEBUG: print debug_ichart(g,sent,ichart) return inner_prob -# end of dmv.inner(i, j, node, loc_h, g, sent, ichart={}) +# end of dmv.inner(i, j, node, loc_h, g, sent, ichart,mpptree) def debug_ichart(g,sent,ichart): str = "---ICHART:---\n" for (s,t,LHS,loc_h),v in ichart.iteritems(): - str += "%s -> %s_%d ... %s_%d (loc_h:%s):\t%.4f\n" % (node_str(LHS,g.numtag), + str += "%s -> %s_%d ... %s_%d (loc_h:%s):\t%s\n" % (node_str(LHS,g.numtag), sent[s], s, sent[s], t, loc_h, v) str += "---ICHART:end---\n" return str -def inner_sent(g, sent, ichart={}): +def inner_sent(g, sent, ichart): return sum([g.p_ROOT[w] * inner(0, len(sent), (SEAL,w), loc_w, g, sent, ichart) for loc_w,w in locs(g.sent_nums(sent),0,len(sent))]) @@ -254,7 +254,7 @@ def inner_sent(g, sent, ichart={}): ################################################### #@accepts(int, int, (int, int), int, Any(), [str], {tuple:float}, {tuple:float}) -def outer(i,j,w_node,loc_w, g, sent, ichart={}, ochart={}): +def outer(i,j,w_node,loc_w, g, sent, ichart, ochart): ''' http://www.student.uib.no/~kun041/dmvccm/DMVCCM.html#outer w_node is a pair (seals,POS); the w in klein-thesis is made up of @@ -746,9 +746,11 @@ def reest_root2(h,g,corpus): return num / den def reest_head2(h, g, corpus, p_ROOT, p_STOP, p_ATTACH): + print "h: %d=%s ..."%(h,g.numtag(h)), def hat_d(xbar,x,xi,xj): return hat_d2(xbar,x,xi,xj, g, corpus) def hat_a(a, x, dir ): return hat_a2(a, x, dir, g, corpus) def div(num,den): +# return num # todo: test without division by sum_hat_a if den > 0.0: return num / den else: return den @@ -764,9 +766,9 @@ def reest_head2(h, g, corpus, p_ROOT, p_STOP, p_ATTACH): p_STOP[h,RIGHT,ADJ] = \ hat_d((RGOL,h),( GOR,h),xeq, xeq) + \ hat_d((SEAL,h),(LGOR,h),xlteq,xeq) - + print "stops done...", p_ROOT[h] = reest_root2(h,g,corpus) - + print "root done...", for a in g.headnums(): p_ATTACH[a,h,LEFT] = \ div( hat_a(a, (GOL,h),LEFT), @@ -779,7 +781,7 @@ def reest_head2(h, g, corpus, p_ROOT, p_STOP, p_ATTACH): div( hat_a(a,(LGOR,h),RIGHT), sum([hat_a(w,(LGOR,h),RIGHT) for w in g.headnums()]) ) - + print "attachment done" @@ -1006,7 +1008,7 @@ def regression_tests(): test("0.063", "%.3f" % inner(0, 2, (SEAL,h), 1, testgrammar_h(), 'h h'.split(),{})) test("0.1842", - "%.4f" % inner_sent(testgrammar_h(), 'h h h'.split())) + "%.4f" % inner_sent(testgrammar_h(), 'h h h'.split(),{})) test("0.1092", "%.4f" % inner(0, 3, (SEAL,0), 0, testgrammar_h(), 'h h h'.split(),{})) @@ -1050,6 +1052,12 @@ def compare_grammars(g1,g2): result += "\nreestimate2[%s]=%s missing from reestimate1"%(k,v) return result + +def testNVNgrammar(): + from loc_h_harmonic import initialize + g = initialize(['n v n'.split()]) + return g # todo + def testIO(): g = testgrammar() inners = [(sent, inner_sent(g, sent, {})) for sent in testcorpus] @@ -1057,6 +1065,7 @@ def testIO(): if __name__ == "__main__": DEBUG.clear() + regression_tests() # import profile # profile.run('testreestimation()') @@ -1065,7 +1074,6 @@ if __name__ == "__main__": # print timeit.Timer("loc_h_dmv.testreestimation()",'''import loc_h_dmv # reload(loc_h_dmv)''').timeit(1) - regression_tests() # print "mpp-test:" # import pprint @@ -1073,6 +1081,54 @@ if __name__ == "__main__": # print "sent:%s\nparse:set(\n%s)"%(s,pprint.pformat(list(mpp(testgrammar(), s)), # width=40)) - g1 = testreestimation() - g2 = testreestimation2() - print compare_grammars(g1,g2) +# g1 = testreestimation() +# g2 = testreestimation2() +# print compare_grammars(g1,g2) + g = testNVNgrammar() + q_sent = inner_sent(g,'n v n'.split(),{}) + q_tree = {} + q_tree[1] = 2.7213e-06 # n_0 -> v, n_0 -> n_2 + q_tree[2] = 9.738e-06 # n -> v -> n + q_tree[3] = 2.268e-06 # n_0 -> n_2 -> v + q_tree[4] = 2.7213e-06 # same as 1-3 + q_tree[5] = 9.738e-06 + q_tree[6] = 2.268e-06 + q_tree[7] = 1.086e-06 # n <- v -> n + f_T_q = {} + for i,q_t in q_tree.iteritems(): + f_T_q[i] = q_t / q_sent + import pprint + pprint.pprint(q_tree) + pprint.pprint(f_T_q) + print sum([f for f in f_T_q.values()]) + + def treediv(num,den): + return sum([f_T_q[i] for i in num ]) / \ + sum([f_T_q[i] for i in den ]) + g2 = {} + g2['root --> _n_'] = treediv( (1,2,3,4,5,6), (1,2,3,4,5,6,7) ) + g2['root --> _v_'] = treediv( (7,), (1,2,3,4,5,6,7) ) + g2['_n_ --> STOP n><'] = treediv( (1,2,3,4,5,6,7,1,2,3,4,5,6,7), + (1,2,3,4,5,6,7,1,2,3,4,5,6,7)) + g2['_v_ --> STOP v><'] = treediv( (1,2,3,4,5,6,7), + (1,2,3,4,5,6,7) ) + nlrtrees = (1,2,3,4,5,6,7,1,2,3,4,5,6,7, + 3,4,4,5,6) + g2['n>< --> _n_ n><'] = treediv( (4,6), nlrtrees ) + g2['n>< --> _v_ n><'] = treediv( (3,4,5), nlrtrees ) + g2['n>< --> n> STOP'] = treediv( (1,2,3,4,5,6,7,1,2,3,4,5,6,7), + nlrtrees ) + vlrtrees = (1,2,3,4,5,6,7, + 7,5) + g2['v>< --> _n_ v><'] = treediv( (5,7), vlrtrees ) + g2['v>< --> v> STOP'] = treediv( (1,2,3,4,5,6,7), vlrtrees ) + nrtrees = (1,2,3,4,5,6,7,1,2,3,4,5,6,7, + 1,1,2,3,6) + g2['n> --> n> _n_'] = treediv( (1,3), nrtrees ) + g2['n> --> n> _v_'] = treediv( (1,2,6), nrtrees ) + vrtrees = (1,2,3,4,5,6,7, + 7,2) + g2['v> --> v> _n_'] = treediv( (2,7), vrtrees ) + + pprint.pprint(g2) + diff --git a/src/loc_h_dmv.pyc b/src/loc_h_dmv.pyc index 1d73c10ab8941c4ddbc9629976b54e1d033a3a3e..1da9ac83ac205078b4fd030f2d74eda65e3991ea 100644 GIT binary patch delta 1661 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 F{{!dyO8Ec) delta 5902 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 diff --git a/tex/formulas.tex b/tex/formulas.tex index 5eb562e..e8d3c4a 100644 --- a/tex/formulas.tex +++ b/tex/formulas.tex @@ -182,13 +182,13 @@ $w_s$ is $w_{q}$ from \citet[p.~41]{lari-csl90}, generalized to $\SMTR{h}$ and $ \begin{align*} w_s(\SEAL{a} & : \SMTR{\LOC{h}}, left, i, j) = \\ & 1/P_s \sum_{k:i