running manual EM on sentence NVN
authorKevin Brubeck Unhammer <pixiemotion@gmail.com>
Wed, 3 Sep 2008 12:20:13 +0000 (3 14:20 +0200)
committerKevin Brubeck Unhammer <pixiemotion@gmail.com>
Wed, 3 Sep 2008 12:20:13 +0000 (3 14:20 +0200)
DMVCCM.org
src/loc_h_dmv.py
src/loc_h_dmv.pyc
src/main.py
tex/formulas.pdf
tex/formulas.tex

index 8bbe9af..15a507d 100755 (executable)
@@ -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
index 1319783..a23fa9a 100644 (file)
@@ -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)
+    
index 1d73c10..1da9ac8 100644 (file)
Binary files a/src/loc_h_dmv.pyc and b/src/loc_h_dmv.pyc differ
index b4058f6..238b0dd 100644 (file)
@@ -153,23 +153,23 @@ if __name__ == "__main__":
     print "main.py:"
 #     compare_loc_h_cnf()
 
-    import cnf_dmv
-    print "\ntrying cnf-reestimate ##############################"
-    g = test_likelihood(cnf_dmv.reestimate,
-                        initialize_cnf,
-                        cnf_dmv.inner_sent,
-                        corpus_size=20)
+    import cnf_dmv
+    print "\ntrying cnf-reestimate ##############################"
+    g = test_likelihood(cnf_dmv.reestimate,
+                        initialize_cnf,
+                        cnf_dmv.inner_sent,
+                        corpus_size=20)
 
     import loc_h_dmv
-    print "\ntrying reestimate v.1 ##############################"
-    g = test_likelihood(loc_h_dmv.reestimate,
-                        initialize_loc_h,
-                        loc_h_dmv.inner_sent,
-                        corpus_size=20)
+    print "\ntrying reestimate v.1 ##############################"
+    g = test_likelihood(loc_h_dmv.reestimate,
+                        initialize_loc_h,
+                        loc_h_dmv.inner_sent,
+                        corpus_size=20)
     print "\ntrying reestimate v.2 ##############################"
     g = test_likelihood(loc_h_dmv.reestimate2,
                         initialize_loc_h,
                         loc_h_dmv.inner_sent,
-                        corpus_size=20)
+                        corpus_size=5)
 
     print "main.py: done"
index 79d84e9..86b7012 100644 (file)
Binary files a/tex/formulas.pdf and b/tex/formulas.pdf differ
index 5eb562e..e8d3c4a 100644 (file)
@@ -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<k<j} ~ \sum_{\LOC{a}:i\leq loc_l(\LOC{a})<k} 
-          & P_{STOP}(\neg stop|h, left, adj(k, \SMTR{\LOC{h}})) P_{CHOOSE}(a|h, left) \\
+          & P_{STOP}(\neg stop|h, left, adj(k, \LOC{h})) P_{CHOOSE}(a|h, left) \\
   &       & P_{INSIDE_s}(\SEAL{\LOC{a}}, i, k) P_{INSIDE_s}(\SMTR{\LOC{h}}, k, j) P_{OUTSIDE_s}(\SMTR{\LOC{h}}, i, j) 
 \end{align*}
 \begin{align*}
   w_s(\SEAL{a} & : \SMTR{\LOC{h}}, right,  i, j) = \\
   & 1/P_s \sum_{k:i<k<j} ~ \sum_{\LOC{a}:k\leq loc_l(\LOC{a})<j} 
-          & P_{STOP}(\neg stop|h, right, adj(k, \SMTR{\LOC{h}})) P_{CHOOSE}(a|h, right) \\
+          & P_{STOP}(\neg stop|h, right, adj(k, \LOC{h})) P_{CHOOSE}(a|h, right) \\
   &       & P_{INSIDE_s}(\SMTR{\LOC{h}}, i, k) P_{INSIDE_s}(\SEAL{\LOC{a}}, k, j) P_{OUTSIDE_s}(\SMTR{\LOC{h}}, i, j) 
 \end{align*}