minor additions
authorKevin Brubeck Unhammer <pixiemotion@gmail.com>
Sun, 21 Sep 2008 17:02:01 +0000 (21 19:02 +0200)
committerKevin Brubeck Unhammer <pixiemotion@gmail.com>
Sun, 21 Sep 2008 17:02:01 +0000 (21 19:02 +0200)
DMVCCM.html
DMVCCM.org
report/report.pdf
report/report.tex
src/loc_h_harmonic.py
src/main.py

index d03cf89..8b14cc0 100755 (executable)
@@ -6,7 +6,7 @@ lang="en" xml:lang="en">
 <title>DMV/CCM &ndash; todo-list / progress</title>
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
 <meta name="generator" content="Org-mode"/>
-<meta name="generated" content="2008-09-11 12:01:19 CEST"/>
+<meta name="generated" content="2008-09-21 19:00:58 CEST"/>
 <meta name="author" content="Kevin Brubeck Unhammer"/>
 <style type="text/css">
   html { font-family: Times, serif; font-size: 12pt; }
@@ -97,13 +97,15 @@ lang="en" xml:lang="en">
 <p><span class="timestamp-kwd">DEADLINE: </span> <span class="timestamp">2008-09-21 Sun</span><br/>
 </p><ul>
 <li>
-DMV-<a href="tex/formulas.pdf">formulas.pdf</a>  &ndash; <i>clear</i> information =D
+<a href="http://www.student.uib.no/~kun041/dmvccm/report.pdf">report.pdf</a> &ndash; Draft report for the whole project, including formulas
+for the full algorithms
+
 </li>
 <li>
 <a href="src/main.py">main.py</a> &ndash; evaluation, corpus likelihoods
 </li>
 <li>
-<a href="src/wsjdep.py">wsjdep.py</a> &ndash; corpus
+<a href="src/wsjdep.py">wsjdep.py</a> &ndash; corpus reader for the dependency parsed WSJ
 
 </li>
 <li>
@@ -120,6 +122,10 @@ DMV-<a href="tex/formulas.pdf">formulas.pdf</a>  &ndash; <i>clear</i> informatio
 <a href="src/io.py">io.py</a> &ndash; non-DMV IO
 
 </li>
+</ul>
+
+<p>Deprecated:
+</p><ul>
 <li>
 <a href="src/cnf_dmv.py">cnf_dmv.py</a> &ndash; cnf-like implementation of DMV
 </li>
@@ -561,8 +567,9 @@ initialization..
 <h2 id="sec-10">10 Adjacency and combining it with the inside-outside algorithm</h2>
 <div id="text-10">
 
-<p>Each DMV_Rule has both a probN and a probA, for adjacencies. inner()
-and outer() needs the correct one in each case.
+<p>Each DMV probability (for a certain PCFG node) has both an adjacent
+and a non-adjacent probability. inner() and outer() needs the correct
+one in each case.
 </p>
 <p>
 In each inner() call, loc_h is the location of the head of this
@@ -699,7 +706,7 @@ Good tutorial:
 <div id="postamble"><p class="author"> Author: Kevin Brubeck Unhammer
 <a href="mailto:K.BrubeckUnhammer at student uva nl ">&lt;K.BrubeckUnhammer at student uva nl &gt;</a>
 </p>
-<p class="date"> Date: 2008-09-11 12:01:19 CEST</p>
+<p class="date"> Date: 2008-09-21 19:00:58 CEST</p>
 <p>HTML generert av <a href='http://orgmode.org/'>org-mode</a> 6.06b in emacs 22<p>
 </div><script src="./post-script.js" type="text/JavaScript">
 </script></body>
index dc9fdf4..d05e1ad 100755 (executable)
@@ -23,9 +23,11 @@ Meta-todo:
 
 * DMV/CCM report and project
   DEADLINE: <2008-09-21 Sun>
-- DMV-[[file:tex/formulas.pdf][formulas.pdf]]  -- /clear/ information =D
+- [[http://www.student.uib.no/~kun041/dmvccm/report.pdf][report.pdf]] -- Draft report for the whole project, including formulas
+  for the full algorithms
+
 - [[file:src/main.py][main.py]] -- evaluation, corpus likelihoods
-- [[file:src/wsjdep.py][wsjdep.py]] -- corpus
+- [[file:src/wsjdep.py][wsjdep.py]] -- corpus reader for the dependency parsed WSJ
 
 - [[file:src/loc_h_dmv.py][loc_h_dmv.py]] -- DMV-IO and reestimation
 - [[file:src/loc_h_harmonic.py][loc_h_harmonic.py]] -- DMV initialization
@@ -33,6 +35,7 @@ Meta-todo:
 - [[file:src/common_dmv.py][common_dmv.py]] -- various functions used by loc_h_dmv and others
 - [[file:src/io.py][io.py]] -- non-DMV IO
 
+Deprecated:
 - [[file:src/cnf_dmv.py][cnf_dmv.py]] -- cnf-like implementation of DMV
 - [[file:src/cnf_harmonic.py][cnf_harmonic.py]] -- initialization for cnf_dmv
 
@@ -280,8 +283,9 @@ Stick with tag-strings in initialization then switch to numbers for
 IO-algorithm perhaps? Can probably afford more string-matching in
 initialization..
 * Adjacency and combining it with the inside-outside algorithm
-Each DMV_Rule has both a probN and a probA, for adjacencies. inner()
-and outer() needs the correct one in each case.
+Each DMV probability (for a certain PCFG node) has both an adjacent
+and a non-adjacent probability. inner() and outer() needs the correct
+one in each case.
 
 In each inner() call, loc_h is the location of the head of this
 dependency structure. In each outer() call, it's the head of the /Node/,
index 950dd07..6d37c40 100644 (file)
Binary files a/report/report.pdf and b/report/report.pdf differ
index 9640790..d3b94ac 100644 (file)
@@ -110,7 +110,7 @@ But the $K(s)$ terms cancel, and $O(0,n,s)=1$, so we find that $$P_{\text{BRACKE
 From $P_{\text{BRACKET}}$ we can calculate the next iteration of the model parameters $P_{\text{SPAN}}$ and $P_{\text{CONTEXT}}$. First, for a sentence $s$ of length $n_s$, note that the number of spans in the sentence is $N_s=(n_s+1)(n_s+2)/2$, which includes the spans of length 0. Furthemore, let $\#_s(\gamma)$ be the number of times that $\gamma$ appears in $s$, where $\gamma$ can be either a span or a context.
 
 We begin with
-$$P_{\text{SPAN}}(\alpha|c)=\displaystyle\sum_{s\in C}P(\alpha|c,s)P(s)=\frac{1}{|C|}\sum_{s\in C}P(\alpha|c,s)$$
+$$P_{\text{SPAN}}(\alpha|c)=\displaystyle\sum_{s\in S}P(\alpha|c,s)P(s)=\frac{1}{|S|}\sum_{s\in S}P(\alpha|c,s)$$
 This reduction works for $P_{\text{CONTEXT}}$ as well, so we have reduced the problem of calculating $P_{\text{SPAN}}$ and $P_{\text{CONTEXT}}$ on the corpus as a whole to calculating it for each sentence.
 
 Let us begin by calculating $P_{\text{SPAN}}(\alpha|\text{true},s)$. By Bayes' Theorem, $$P_{\text{SPAN}}(\alpha|\text{true},s)=\frac{P_{\text{SPAN}}(\text{true}|\alpha,s)P_{\text{SPAN}}(\alpha|s)}{P_{\text{SPAN}}(\text{true}|s)}$$
@@ -136,20 +136,38 @@ From these, we can calculate the new parameters $P_{\text{SPAN}}$ and $P_{\text{
 \subsection{Initialization}
 We initialize the model with a distribution $P_{\text{SPLIT}}$ over trees. $P_{\text{SPLIT}}$ is calculated as follows: for a string of $n$ words, choose a split point at random, then recursively build trees on either side of that split by further random splitting. We initialize the model using $P_{\text{BRACKET}}(i,j,s)=P_{\text{SPLIT}}(i,j,n_s)$. However, we also apply smoothing, adding small constant counts $m_\text{true}$ and $m_\text{false}$ of each span and context as a constituent and distituent, respectively. $m_\text{true}$ should be smaller than $m_\text{false}$, as there are more distituent spans than constituent spans. However, \citet{klein-thesis} and \citet{km-ccm} give different values for these constants, and in any case they must vary in relation to the size of the corpus used. Let $\#_\alpha$ and $\#_\beta$ be the number of unique spans and contexts in the corpus. We initialize the model:
 \begin{itemize}
-\item $P_{SPAN}(\alpha|true)= \frac {(\displaystyle\sum_{s\in C}\displaystyle\sum_{<i,j>=\alpha}P_{\text{SPLIT}}(i,j,n_s))+m_\text{true}}
-       {(\displaystyle\sum_{s\in C}2n_s-1)+m_\text{true} \#_\alpha}$
-\item $P_{SPAN}(\alpha|false)= \frac {(\displaystyle\sum_{s\in C}\displaystyle\sum_{<i,j>=\alpha}1-P_{\text{SPLIT}}(i,j,n_s))+m_\text{false}}
-       {(\displaystyle\sum_{s\in C}N_s-(2n_s-1))+m_\text{false} \#_\alpha}$
-\item $P_{CONTEXT}(\beta|true)= \frac {(\displaystyle\sum_{s\in C}\displaystyle\sum_{>i,j<=\beta}P_{\text{SPLIT}}(i,j,n_s))+m_\text{true}}
-       {(\displaystyle\sum_{s\in C}2n_s-1)+m_\text{true} \#_\beta}$
-\item $P_{CONTEXT}(\beta|false)= \frac {(\displaystyle\sum_{s\in C}\displaystyle\sum_{>i,j<=\beta}1-P_{\text{SPLIT}}(i,j,s))+m_\text{false}}
-       {(\displaystyle\sum_{s\in C}N_s-(2n_s-1))+m_\text{false} \#_\beta}$
+\item $P_{SPAN}(\alpha|true)= \frac {(\displaystyle\sum_{s\in S}\displaystyle\sum_{<i,j>=\alpha}P_{\text{SPLIT}}(i,j,n_s))+m_\text{true}}
+       {(\displaystyle\sum_{s\in S}2n_s-1)+m_\text{true} \#_\alpha}$
+\item $P_{SPAN}(\alpha|false)= \frac {(\displaystyle\sum_{s\in S}\displaystyle\sum_{<i,j>=\alpha}1-P_{\text{SPLIT}}(i,j,n_s))+m_\text{false}}
+       {(\displaystyle\sum_{s\in S}N_s-(2n_s-1))+m_\text{false} \#_\alpha}$
+\item $P_{CONTEXT}(\beta|true)= \frac {(\displaystyle\sum_{s\in S}\displaystyle\sum_{>i,j<=\beta}P_{\text{SPLIT}}(i,j,n_s))+m_\text{true}}
+       {(\displaystyle\sum_{s\in S}2n_s-1)+m_\text{true} \#_\beta}$
+\item $P_{CONTEXT}(\beta|false)= \frac {(\displaystyle\sum_{s\in S}\displaystyle\sum_{>i,j<=\beta}1-P_{\text{SPLIT}}(i,j,s))+m_\text{false}}
+       {(\displaystyle\sum_{s\in S}N_s-(2n_s-1))+m_\text{false} \#_\beta}$
 \end{itemize}
 
+\subsection{Smoothing}
+In addition to the smoothing used during initialization, some further smoothing is necessary during reestimation. In our initial calculations, we made the critical step of factoring out $\displaystyle\prod_{\{\langle i,j\rangle_s\}}P_{\text{SPAN}}(\langle i,j\rangle_s|\text{false})P_{\text{CONTEXT}}(\rangle i,j\langle_s|\text{false})$. This factorization assumes that $P_{\text{SPAN}}(\langle i,j\rangle_s|\text{false})$ and $P_{\text{CONTEXT}}(\rangle i,j\langle_s|\text{false})$ are nonzero for all spans and contexts. Particularly in the case of small corpora, this assumption is not always valid. For example, if a span $\alpha$ always appears as a full sentence--never as a proper substring--then its $P_{\text{SPAN}}(\alpha|\text{false})$ will be zero because a full sentence is never a distituent. Or if a word $a$ only appears as the second word of a sentence, then the context $(\diamond,a)$ will have $P_{\text{CONTEXT}}((\diamond,a)|\text{false})=0$ because the one-word span that it contains will always be a constituent.
+
+To avoid this problem, we can use further smoothing during reestimation. During each reestimation of $P_{\text{SPAN}}$ and $P_{\text{CONTEXT}}$, we add to each span and context small constant counts of $m_\text{true}$ as a constituent and $m_\text{false}$ as a distituent.
+
 \subsection{Results}
-We have not yet tested the CCM model on the Wall Street Journal corpus.
+Our implementation of the CCM model has not yet been tested on the Wall Street Journal corpus. On small toy corpora, it behaves unpredictably. For instance, on the corpus consisting of the sentences $a b c$ and $b c a$, the model gives higher probabilities to the spans $a b$ and $c a$ as constituents than it does to $b c$. However, this is the opposite of what we would expect. We have not yet been able to identify the source of this problem.
 
 \section{A Dependency Model with Valence}
+\newcommand{\LOC}[1]{\textbf{#1}}
+\newcommand{\GOR}[1]{\overrightarrow{#1}}
+\newcommand{\RGOL}[1]{\overleftarrow{\overrightarrow{#1}}}
+\newcommand{\SEAL}[1]{\overline{#1}}
+\newcommand{\LGOR}[1]{\overrightarrow{\overleftarrow{#1}}}
+\newcommand{\GOL}[1]{\overleftarrow{#1}}
+\newcommand{\LN}[1]{\underleftarrow{#1}}
+\newcommand{\RN}[1]{\underrightarrow{#1}}
+\newcommand{\XI}{\lessdot}
+\newcommand{\XJ}{\gtrdot}
+\newcommand{\SMTR}[1]{\dddot{#1}}
+\newcommand{\SDTR}[1]{\ddot{#1}}
+
 The DMV is a \emph{head-outward process}. Given a certain head (eg. a
 verb), we first attach possible arguments in one direction (eg. nouns
 to the right), then stop in that direction, then possibly attach
@@ -180,28 +198,17 @@ reestimated using the inside-outside algorithm:
   into one additional parameter.
 \end{itemize}
 
-
-
-
-
-\newcommand{\LOC}[1]{\textbf{#1}}
-\newcommand{\GOR}[1]{\overrightarrow{#1}}
-\newcommand{\RGOL}[1]{\overleftarrow{\overrightarrow{#1}}}
-\newcommand{\SEAL}[1]{\overline{#1}}
-\newcommand{\LGOR}[1]{\overrightarrow{\overleftarrow{#1}}}
-\newcommand{\GOL}[1]{\overleftarrow{#1}}
-\newcommand{\LN}[1]{\underleftarrow{#1}}
-\newcommand{\RN}[1]{\underrightarrow{#1}}
-\newcommand{\XI}{\lessdot}
-\newcommand{\XJ}{\gtrdot}
-\newcommand{\SMTR}[1]{\dddot{#1}}
-\newcommand{\SDTR}[1]{\ddot{#1}}
+There is also a parameter $P_{ORDER}$, signifying the probability of a
+head $w$ attaching to the right first, or to the left first. In the
+results given below,
+\[ \forall{w}[P_{ORDER}(right\text{-}first|w)=1.0] \] 
+(this parameter is not reestimated).
 
 \subsection{Note on notation}
 $i, j, k$ are sentence positions (between words), where $i$ and $j$
 are always the start and end, respectively, for what we're calculating
 ($k$ is between $i$ and $j$ for $P_{INSIDE}$, to their right or left
-for $P_{OUTSIDE}$). $s \in S$ are sentences in the corpus. $\LOC{w}$
+for $P_{OUTSIDE}$). $s \in S$ are sentences in the corpus. $\LOC{w}$ 
 is a word token (actually POS-token) of type $w$ at a certain sentence
 location. If $\LOC{w}$ is between $i$ and $i+1$, $loc(\LOC{w})=i$
 following \citet{klein-thesis}, meaning $i$ is adjacent to $\LOC{w}$
@@ -210,7 +217,7 @@ $\LOC{w}$ on the right. To simplify, $loc_l(\LOC{w}):=loc(\LOC{w})$ and
 $loc_r(\LOC{w}):=loc(\LOC{w})+1$. We write $\LOC{h}$ if this is a head
 in the rule being used, $\LOC{a}$ if it is an attached argument.
 
-There are som notational differences between the thesis
+There are some notational differences between the thesis
 \citet{klein-thesis} and the ACL paper \citet{km-dmv}:
 
 \begin{tabular}{cc}
@@ -232,28 +239,20 @@ thing we need to add is that for right attachments,
 $i \leq loc_l(w)<k \leq loc_l(\LOC{a})<j$ while for left attachments,
 $i \leq loc_l(\LOC{a})<k \leq loc_l(w)<j$. 
 
-(For now, let
-\[ \forall{w}[P_{ORDER}(right\text{-}first|w)=1.0] \] since the DMV implementation
-is not yet generalized to both directions.)
-
-
-
-
 
 \subsubsection{Sentence probability}
-
 $P_s$ is the sentence probability, based on 
 \citet[p.~38]{lari-csl90}. Since the ROOT rules are different from the
 rest, we sum them explicitly in this definition:
 \begin{align*}
-  P_s = \sum_{\LOC{w} \in s} P_{ROOT}(\LOC{w}) P_{INSIDE}(\SEAL{\LOC{w}}, 0, len(s))
+  P_s = \sum_{\LOC{w} \in s} P_{ROOT}(\LOC{w}) P_{INSIDE}(\SEAL{\LOC{w}}, 0, n_s)
 \end{align*} 
 
 \subsection{Outside probabilities}
 
 \begin{align*}
   P_{OUTSIDE_s}(ROOT, i, j) = \begin{cases}
-    1.0 & \text{ if $i = 0$ and $j = len(s)$,}\\
+    1.0 & \text{ if $i = 0$ and $j = n_s$,}\\
     0.0 & \text{ otherwise}
   \end{cases}
 \end{align*}
@@ -313,9 +312,13 @@ of having a stop above, where we use $\SEAL{w}$:
 \end{align*}
 
 
-\subsection{Reestimating the rules} 
+\subsection{DMV Reestimation} 
+$P_{INSIDE}$ and $P_{OUTSIDE}$ (the corpus frequencies given a certain
+probability distribution) give us the counts we need to reestimate our
+model parameters.
 
-\subsubsection{$c$ and $w$ (helper formulas used below)}
+\subsubsection{$c$ and $w$}
+First we need some helper functions.
 $c_s(\SMTR{\LOC{w}} : i, j)$ is ``the expected fraction of parses of
 $s$ with a node labeled $\SMTR{w}$ extending from position $i$ to
 position $j$'' \citep[p.~88]{klein-thesis}, here defined to equal
@@ -346,7 +349,9 @@ are used in $P_{INSIDE}$ and $P_{OUTSIDE}$).
 
 \subsubsection{Attachment reestimation} 
 
-This is based on $\hat{a}$, given in \citet[p.~41]{lari-csl90}. Here
+This is based on $\hat{a}$, given in \citet[p.~41]{lari-csl90}.
+
+When attaching to the left,
 $i<loc_l(\LOC{h})$ since we want trees with at least one attachment:
 \begin{align*}
   \hat{P}_{ATTACH} (a | h, left) = \frac
@@ -354,7 +359,7 @@ $i<loc_l(\LOC{h})$ since we want trees with at least one attachment:
   { \sum_{s \in S} \sum_{\LOC{h} \in s} \sum_{i<loc_l(\LOC{h})} \sum_{j\geq loc_r(\LOC{h})} [c_s(\GOL{\LOC{h}} : i, j) + c_s(\RGOL{\LOC{h}} : i, j) ]}
 \end{align*}
 
-Here $j>loc_r(\LOC{h})$ since we want at least one attachment:
+Below, $j>loc_r(\LOC{h})$ since we want at least one attachment to the right:
 \begin{align*}
   \hat{P}_{ATTACH} (a | h, right) = \frac
   { \sum_{s \in S} \sum_{\LOC{h} \in s} \sum_{i\leq loc_l(\LOC{h})} \sum_{j>loc_r(\LOC{h})} [w_s(\SEAL{a} : \LGOR{\LOC{h}}, right, i, j) + w_s(\SEAL{a} : \GOR{\LOC{h}}, right, i, j) ]}
@@ -421,8 +426,8 @@ tree, meaning we divide by $1$ per sentence\footnote{Assuming each
 
 \begin{align*}
   \hat{P}_{ROOT} (h) = \frac
-  {\sum_{s\in S} 1 / P_s \cdot \sum_{\LOC{h}\in s} P_{ROOT}(\LOC{h}) P_{INSIDE_s}(\SEAL{h}, 0, len(s))}
-  {\sum_{s\in S} 1}
+  {\sum_{s\in S} 1 / P_s \cdot \sum_{\LOC{h}\in s} P_{ROOT}(\LOC{h}) P_{INSIDE_s}(\SEAL{h}, 0, n_s)}
+  {|S|}
 \end{align*}
 
 
@@ -526,7 +531,7 @@ allowed us to easily try different inital distributions (eg. to modify
 the initial grammar in the direction of a uniform distribution). The
 next section discusses the effect of these. 
 
-\subsection{TODO: Results}
+\subsection{Results}
 We compared the results of the implementation with a dependency parsed
 version of the WSJ-10 corpus (converted from the manually annotated
 version). Since single word sentences were not POS-tagged there, these
@@ -541,27 +546,37 @@ parses where possible\footnote{221 parses in the dependency parsed
 \begin{table*}[hb]
   \centering
   \begin{tabular}{l|ccc}
-    Model                         & P             & R              & F1          \\
+    Model                          & P             & R              & F1          \\
     \hline 
-    LBRANCH/RHEAD                 & 25.6          & 32.6           & 28.7        \\
-    RANDOM                        & 31.0          & 39.4           & 34.7        \\ 
-    RBRANCH/LHEAD                 & 55.1          & 70.0           & 61.7        \\
-    K\&M's DMV                    & 46.6          & 59.2           & 52.1        \\
-    Our DMV:                                                                     \\
+    LBRANCH/RHEAD                  & 25.6          & 32.6           & 28.7        \\
+    RANDOM                         & 31.0          & 39.4           & 34.7        \\ 
+    RBRANCH/LHEAD                  & 55.1          & 70.0           & 61.7        \\
+    K\&M's DMV                     & 46.6          & 59.2           & 52.1        \\
+    Our DMV:                                                                      \\
+    Uniform initial distribution   & 21.0 (18.7)   & 20.1 (18.1)    & 20.5 (18.4) \\
     $C_A=0; C_S=1;C_N=0.1;C_M=1$    & 23.7 (23.7)   & 24.8 (24.5)    & 24.2 (24.1) \\ 
     $C_A=0; C_S=1;C_N=0.1;C_M=10$   & 26.7 (31.6)   & 25.5 (30.5)    & 26.1 (31.0) \\ 
-    $C_A=10;C_S=1;C_N=0.1;C_M=10$   & 24.5 (29.6)   & 25.6 (30.6)    & 25.0 (30.1) \\
-    $C_A=10;C_S=1;C_N=3  ;C_M=10$   & 24.9 (30.0)   & 26.0 (31.0)    & 25.5 (30.5) \\
-    $C_A=15;C_S=3;C_N=1  ;C_M=20$   & 25.6 (30.6)   & 26.7 (31.7)    & 26.2 (31.2) \\
+%    $C_A=10;C_S=1;C_N=0.1;C_M=10$   & 25.6 (30.6)    & 24.5 (29.6)   & 25.0 (30.1) \\
+    $C_A=10;C_S=1;C_N=3  ;C_M=10$   & 26.0 (31.0)   & 24.9 (30.0)    & 25.5 (30.5) \\
+    $C_A=15;C_S=3;C_N=1  ;C_M=20$   & 26.7 (31.7)   & 25.6 (30.6)    & 26.2 (31.2) \\ 
   \end{tabular}
   \caption{DMV results on the WSJ-10 for various initialization values (numbers in parentheses are when counting added ROOT links)}
   \label{tab:dmv-wsj}
 \end{table*}
+% trying locally: ?
+% HARMONIC_C: 115.854497176, STOP_C: 1.47684590293, NSTOP_C:
+% 4.27464793921, FSTOP_MIN: 6.9710245489
+% P:  11627/45444 = 0.255853357979 | P_r:  15710/51712 = 0.303797957921
+% R:  11627/47419 = 0.245197072903 | R_r:  15710/53466 = 0.29383159391
+% F1:               0.250411897096 | F1_r:               0.298731673924 
+% 
+% trying remotely: uniform distribution
+% todo: fix results when done
 
 We tried various values for the initialization constants; but it was
-hard to find any clear pattern for what worked best.
+hard to find any clear pattern for what worked best. 
 %$C_N$ values of 10 or less worked well, 
-% todo!!
+% todo
 
 Table \ref{tab:dmv-wsj} shows the results of running our
 implementation on the WSJ-10 corpus, compared with the dependency
@@ -600,6 +615,7 @@ to be the heads of nouns, rather than the opposite.
 % non-adjacent stopping was a lot more likely than adjacent stopping, a
 % situation given by the DMV model. 
 
+
 % \section{The combined model (?)}
 % \subsection{Results (?)}
 
index c7b0b5d..6762592 100644 (file)
@@ -152,7 +152,7 @@ def init_normalize(f, tags, numtag, tagnum):
                         (FSTOP_MIN + f['ROOT',head] * (STOP_C + NSTOP_C))
                     
         p_ORDER[GOR, h] = RIGHT_FIRST
-        p_ORDER[GOL, h] = 1 - RIGHT_FIRST
+        p_ORDER[GOL, h] = 1.0 - RIGHT_FIRST
 
         for dir in [LEFT, RIGHT]:
             for arg, val in f[head, dir].iteritems():
@@ -180,6 +180,32 @@ def initialize(corpus):
     return g
 
 
+def uniform_init(corpus):
+    tags = taglist(corpus)
+    p_ROOT,p_STOP,p_ATTACH,p_ORDER,numtag, tagnum = {},  {},  {},  {},  {}, {}
+    ntags = len(tags)
+    for num, tag in enumerate(tags):
+        tagnum[tag] = num
+        numtag[num] = tag
+        p_ROOT[num] = 1.0 / ntags
+        p_STOP[num,LEFT,NON] = 0.5
+        p_STOP[num,LEFT,ADJ] = 0.5
+        p_STOP[num,RIGHT,NON] = 0.5
+        p_STOP[num,RIGHT,ADJ] = 0.5
+        p_ORDER[GOR, num] = RIGHT_FIRST # NOT uniform...
+        p_ORDER[GOL, num] = 1.0 - RIGHT_FIRST
+        for num2, tag2 in enumerate(tags):
+            p_ATTACH[num,num2,LEFT] = 1.0 / ntags
+            p_ATTACH[num,num2,RIGHT] = 1.0 / ntags
+
+    g = DMV_Grammar(numtag, tagnum, p_ROOT, p_STOP, p_ATTACH, p_ORDER)
+    g.HARMONIC_C = 0.0 # for evaluations in main.py, todo: remove
+    g.STOP_C = 0.0
+    g.NSTOP_C = 0.0
+    g.FNONSTOP_MIN = 0.0
+    g.FSTOP_MIN = 0.0
+    
+    return g
 
 
 ##############################
index 2ff12f9..7b90b7d 100644 (file)
@@ -7,6 +7,7 @@
 
 from common_dmv import MPPROOT, test, node_str
 from wsjdep import WSJDepCorpusReader
+
 #HARMONIC_C: 509.637290698, FNONSTOP_MIN: 30.1124584139, FSTOP_MIN: 13.0830178845
 def initialize_loc_h(tagonlys):
     import loc_h_harmonic # since we need to change constants (is there a better way?)
@@ -15,10 +16,10 @@ def initialize_loc_h(tagonlys):
 #     loc_h_harmonic.HARMONIC_C = 380.111684914
 #     loc_h_harmonic.FSTOP_MIN = 13.5744632704
 #     loc_h_harmonic.FNONSTOP_MIN = 34.8939452454
-    loc_h_harmonic.HARMONIC_C = 20.0 * random.random() # 509.63
-    loc_h_harmonic.FSTOP_MIN = 10.0 # random.random() # 13.08 
-    loc_h_harmonic.STOP_C = 3.0 * random.random() 
-    loc_h_harmonic.NSTOP_C = 1.0 # 5 * random.random() # 0.1
+    loc_h_harmonic.HARMONIC_C = 0.0 #120.0 * random.random() # 509.63
+    loc_h_harmonic.STOP_C = 1.0 #3.0 * random.random() 
+    loc_h_harmonic.NSTOP_C = 0.1 #5.0 * random.random() # 0.1
+    loc_h_harmonic.FSTOP_MIN = 1.0 #20.0 * random.random() # 13.08 
 
     loc_h_harmonic.RIGHT_FIRST = 1.0
     loc_h_harmonic.OLD_STOP_CALC = False
@@ -33,6 +34,10 @@ RIGHT_FIRST: %s, OLD_STOP_CALC: %s'''%(loc_h_harmonic.HARMONIC_C,
     g = loc_h_harmonic.initialize(tagonlys)
     return g
 
+def initialize_uniform_loc_h(tagonlys):
+    import loc_h_harmonic
+    return loc_h_harmonic.uniform_init(tagonlys)
+
 def initialize_cnf(tagonlys):
     import cnf_harmonic # since we need to change constants (is there a better way?)
     reload(cnf_harmonic)
@@ -135,12 +140,17 @@ class Evaluation():
         R_rden = self.R['den']+self.R_r['den']
         P_rnum = self.P['num']+self.P_r['num']
         P_rden = self.P['den']+self.P_r['den']
-        str_vals = (self.R['num'],self.R['den'],self._recall,    R_rnum,R_rden,self._recall_r,
-                    self.P['num'],self.P['den'],self._precision, P_rnum,P_rden,self._precision_r,
+        str_vals = (self.P['num'],self.P['den'],self._precision, P_rnum,P_rden,self._precision_r,
+                    self.R['num'],self.R['den'],self._recall,    R_rnum,R_rden,self._recall_r,
                     self._F1, self._F1_r, self.unrooted)
-        return '''R:  %5d/%5d = %s | R_r:  %5d/%5d = %s
-P:  %5d/%5d = %s | P_r:  %5d/%5d = %s
+        regular_str = '''P:  %5d/%5d = %s | P_r:  %5d/%5d = %s
+R:  %5d/%5d = %s | R_r:  %5d/%5d = %s
 F1:               %s | F1_r:               %s (unrooted gold parses: %d)'''%str_vals
+
+        tex_str_vals = tuple([p * 100 for p in (self._precision,self._precision_r,self._recall,self._recall_r,self._F1,self._F1_r)])
+        tex_str = "$C_A=; C_S=;C_N=;C_M=$   & %.1f (%.1f)   & %.1f (%.1f)    & %.1f (%.1f) \\"%tex_str_vals
+
+        return tex_str # todo