It is straightforward to use a gradient-based optimizer, and we do.
could also be maximized by an intuitive EM algorithm: at each iteration, the E-step uses the current model parameters to partition each count c(f ) among possible analyses, as in (2.3), and then the M step improves the parameters by following the gradient of supervised regularized log-likelihood as if it had observed those fractional counts.