HelloSriLM users,<br>
<br>
I am looking for a way to save language models adapted with <br>
<br>
ngram -adapt-marginals.<br>
<br>
Is it possible ?<br>
<br>
As the write method for AdaptiveMarginals is not implemented, I tried
to write one (copied from writeWithOrder in NgramLM.cc) , by calling
wordProb(pword,context+1) instead of iterating on the tree, but it
doesn't seem to work. The probabilities I get in the file, are not the
same as the one I get if I parse a text file with ppl option
(precisely, alphas are the same, but denominators are different). <br>
<br>
Any clue or solution to save an adapted model are welcome !<br>
<br>
Thank you,<br>
<br>
--<br>
Christopher Kermorvant <br>
<br>
<br>
void<br>
AdaptiveMarginals::write(File &file)<br>
{<br>
this->running(true) ;<br>
Ngram * lm = (Ngram*)&baseLM;<br>
unsigned i;<br>
unsigned howmanyNgrams[maxNgramOrder + 1];<br>
VocabIndex context[maxNgramOrder + 2];<br>
VocabString scontext[maxNgramOrder + 1];<br>
unsigned order=lm->setorder(); <br>
if (order > maxNgramOrder) {<br>
order = maxNgramOrder;<br>
}<br>
<br>
fprintf(file, "\n\\data\\\n");<br>
<br>
for (i = 1; i <= order; i++ ) {<br>
howmanyNgrams[i] = lm->numNgrams(i);<br>
fprintf(file, "ngram %d=%d\n", i, howmanyNgrams[i]);<br>
}<br>
<br>
for (i = 1; i <= order; i++ ) {<br>
fprintf(file, "\n\\%d-grams:\n", i);<br>
<br>
if (debug(DEBUG_WRITE_STATS)) {<br>
dout() << "writing " << howmanyNgrams[i] << " "<br>
<< i << "-grams\n";<br>
}<br>
<br>
NgramBOsIter iter(*lm, context + 1, i - 1, vocab.compareIndex());<br>
BOnode *node;<br>
<br>
while (node = iter.next()) {<br>
<br>
vocab.getWords(context + 1, scontext, maxNgramOrder + 1);<br>
Vocab::reverse(scontext);<br>
<br>
NgramProbsIter piter(*node, vocab.compareIndex());<br>
VocabIndex pword;<br>
LogP *prob;<br>
LogP probAd ;<br>
while (prob = piter.next(pword)) {<br>
if (file.error()) {<br>
return;<br>
}<br>
context[0] = pword;<br>
probAd = wordProb(pword,context+1);<br>
*prob = probAd ;<br>
fprintf(file, "%.*lg\t", LogP_Precision,<br>
(double)(*prob == LogP_Zero ?<br>
LogP_PseudoZero : *prob));<br>
Vocab::write(file, scontext);<br>
fprintf(file, "%s%s", (i > 1 ? " " : ""), vocab.getWord(pword));<br>
<br>
if (i < order) {<br>
context[0] = pword;<br>
<br>
LogP *bow = lm->findBOW(context);<br>
if (bow) {<br>
fprintf(file, "\t%.*lg", LogP_Precision,<br>
(double)(*bow == LogP_Zero ?<br>
LogP_PseudoZero : *bow));<br>
}<br>
}<br>
<br>
fprintf(file, "\n");<br>
}<br>
}<br>
}<br>
<br>
fprintf(file, "\n\\end\\\n");<br>
}<br>
<br>
<br>