Julius 4.2
libsent/src/dfa/mkterminfo.c
説明を見る。
00001 
00018 /*
00019  * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University
00020  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00021  * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology
00022  * All rights reserved
00023  */
00024 
00025 #include <sent/stddefs.h>
00026 #include <sent/dfa.h>
00027 #include <sent/vocabulary.h>
00028 
00029 /* construct table: terminal(category) ID -> word list */
00030 
00038 void
00039 make_terminfo(TERM_INFO *tinfo, DFA_INFO *dinfo, WORD_INFO *winfo)
00040 {
00041   int i,w,t;
00042   int tnum;
00043 
00044   /* set terminal number */
00045   tnum = tinfo->term_num = dinfo->term_num;
00046   /* allocate memory for the list of word num */
00047   tinfo->wnum = (int *)mymalloc(sizeof(int) * tnum);
00048   /* count number of belonging words for each category */
00049   for(i=0;i<tnum;i++) tinfo->wnum[i]=0;
00050   for(w=0;w<winfo->num;w++) {
00051     tinfo->wnum[winfo->wton[w]]++;
00052   }
00053   /* allocate memory for the list body */
00054   tinfo->tw = (WORD_ID **)mymalloc(sizeof(WORD_ID *) * tnum);
00055   for(i=0;i<tnum;i++) {
00056     tinfo->tw[i] = (WORD_ID *)mymalloc(sizeof(WORD_ID) * tinfo->wnum[i]);
00057   }
00058   /* store the word to each corresponding list */
00059   for(i=0;i<tnum;i++) tinfo->wnum[i]=0;
00060   for(w=0;w<winfo->num;w++) {
00061     t = winfo->wton[w];
00062     tinfo->tw[t][tinfo->wnum[t]] = w;
00063     tinfo->wnum[t]++;
00064   }
00065 
00066 }
00067 
00074 void
00075 free_terminfo(TERM_INFO *tinfo)
00076 {
00077   int i;
00078 
00079   if (tinfo->tw != NULL) {
00080     for(i=0;i<tinfo->term_num;i++) {
00081       free(tinfo->tw[i]);
00082     }
00083     free(tinfo->tw);
00084     free(tinfo->wnum);
00085   }
00086 }
00087 
00096 void
00097 terminfo_append(TERM_INFO *dst, TERM_INFO *src, int coffset, int woffset)
00098 {
00099   int t, new_termnum;
00100   int i, j;
00101 
00102   new_termnum = coffset + src->term_num;
00103   if (dst->tw == NULL) {
00104     dst->tw = (WORD_ID **)mymalloc(sizeof(WORD_ID *) * new_termnum);
00105     dst->wnum = (int *)mymalloc(sizeof(int) * new_termnum);
00106   } else {
00107     dst->tw = (WORD_ID **)myrealloc(dst->tw, sizeof(WORD_ID *) * new_termnum);
00108     dst->wnum = (int *)myrealloc(dst->wnum, sizeof(int) * new_termnum);
00109   }
00110   for(i=0;i<src->term_num;i++) {
00111     t = i + coffset;
00112     dst->wnum[t] = src->wnum[i];
00113     dst->tw[t] = (WORD_ID *)mymalloc(sizeof(WORD_ID) * src->wnum[i]);
00114     for(j=0;j<src->wnum[i];j++) {
00115       dst->tw[t][j] = src->tw[i][j] + woffset;
00116     }
00117   }
00118   dst->term_num = new_termnum;
00119 }