Exemple #1
0
/* CombineModels: load models and combine with the one in memory */
BackOffLM *CombineModels(MemHeap *heap,LMInfo *lmi,int nLModel,int nSize,WordMap *wl) 
{
   int i,j,nw;
   float x;
   LMInfo *li;
   BackOffLM *tgtLM;
   WordMap wordList;
   LabId lab;
   NameId *na;

   /* normalise weights */
   for (x=0.0, i=1; i<nLModel; i++)
      x += lmInfo[i].weight;
   lmInfo[0].weight = 1.0-x;

   /* load all models except the first one*/
   for (li=lmInfo+1, i=1; i<nLModel; i++, li++) {
      if (trace&T_TOP)
	 printf("Loading language model from %s\n",li->fn);
      li->lm = LoadLangModel(li->fn,wl,1.0,LMP_FLOAT,heap);
   }
   if (wl==NULL) {
      wl = &wordList;
      /* derive word list from LMs */
      for (li=lmInfo, i=0; i<nLModel; i++, li++) {  
	 na = li->lm->binMap;
	 for (j=0; j<li->lm->vocSize; j++) {
	    lab = GetLabId(na[j+1]->name,TRUE);
	    lab->aux=NULL; 
	 }
      }
      for (nw=0,li=lmInfo, i=0; i<nLModel; i++, li++) {  
	 na = li->lm->binMap;
	 for (j=0; j<li->lm->vocSize; j++) {
	    lab = GetLabId(na[j+1]->name,FALSE);
	    if (lab->aux==NULL) {
	       nw++; lab->aux = (Ptr) wl;
	    }
	 }
      }
      CreateWordList(NULL,wl,nw+10);
      for (nw=0,li=lmInfo, i=0; i<nLModel; i++, li++) {
	 na = li->lm->binMap;
	 for (j=0; j<li->lm->vocSize; j++) {
	    lab = GetLabId(na[j+1]->name,FALSE);
	    if (lab->aux==(Ptr) wl) {
	       wl->id[nw++]=lab; lab->aux = NULL;
	    }
	 }
      }
      wl->used = nw;
   }
   if (trace&T_TOP) {
      printf("Using language model(s): \n");
      for (li=lmInfo,i=0; i<nLModel; i++,li++)
	 printf("  %d-gram %s, weight %.2f\n",li->lm->nSize,li->fn,li->weight);
   }
   if (trace&T_TOP) {
      printf("Generating %d-gram model %s\n",nSize,outFN);
      fflush(stdout);
   }
   tgtLM = MergeModels(heap,lmInfo,nLModel,nSize,wl);
#ifdef HTK_CRYPT   
   if (tgtLM->encrypt && binfo.saveFmt==LMF_TEXT)
      binfo.saveFmt = LMF_BINARY;
#endif
   for (i=1; i<=nSize; i++) {
      tgtLM->gInfo[i].fmt = (i==1) ? LMF_TEXT : binfo.saveFmt;
   }
   return tgtLM;
}


static int       nSize = 0;              /* output ngram size */

static WordMap   wList;                  /* the word list */

static int       nLModel;                /* number of loaded LMs */

static LMInfo    lmInfo[MAX_LMODEL];     /* array of loaded LMs */

static BackOffLM *tgtLM;                 /* target lm */

static char      *tgtFN;                 /* output model name */

static MemHeap   langHeap;               /* Stores global stats */

static LMFileFmt saveFmt = DEF_SAVEFMT;  /* LM file format */



/* ---------------- Configuration Parameters --------------------- */



static ConfParam *cParm[MAXGLOBS];

static int nParm = 0;                  /* total num params */





/* ---------------- Function prototypes -------------------------- */



void Initialise(void);





/* ---------------- Process Command Line ------------------------- */



/* SetConfParms: set conf parms relevant to this tool */

void SetConfParms(void)

{

   int i;



   nParm = GetConfig("LMERGE", TRUE, cParm, MAXGLOBS);

   if (nParm>0){

      if (GetConfInt(cParm,nParm,"TRACE",&i)) trace = i;

   }

}



char *ReturnLMName(int fmt)

{

   switch(fmt) {

      case LMF_TEXT:

	 return LM_TXT_TEXT;

      case LMF_BINARY:

	 return LM_TXT_BINARY;

      case LMF_ULTRA:

	 return LM_TXT_ULTRA;

      default:

	 return LM_TXT_OTHER;