Blame view
tools/lia_ltbox/lia_phon/src/libgram/libgram.h
7.82 KB
e6be5137b reinitialized pro... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
/* -------------------------------------------------------- LIA_PHON : Un systeme complet de phonetisation de textes -------------------------------------------------------- Copyright (C) 2001 FREDERIC BECHET .................................................................. This file is part of LIA_PHON LIA_PHON is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA .................................................................. For any publication related to scientific work using LIA_PHON, the following reference paper must be mentioned in the bibliography: Bechet F., 2001, "LIA_PHON - Un systeme complet de phonetisation de textes", revue Traitement Automatique des Langues (T.A.L.) volume 42, numero 1/2001, edition Hermes .................................................................. Contact : FREDERIC BECHET - LIA - UNIVERSITE D'AVIGNON AGROPARC BP1228 84911 AVIGNON CEDEX 09 FRANCE frederic.bechet@lia.univ-avignon.fr .................................................................. */ /* Usefule things for the 'gram' module */ /* FRED 0498 - Modif multi ML - 0399 */ /*................................................................*/ /* Les indispensables */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <math.h> #include <ailleur_siroco.h> #include <gere_lexique.h> #include <proba_mot_classe.h> /*................................................................*/ /* Type de stockage des 1.2.3-gram */ #define MARGE 1 #define Nb1Byte 3 typedef struct { unsigned char cle[Nb1Byte]; flogprob_t lp,fr; } type_1gram; #define Nb2Byte 6 typedef struct { unsigned char cle[Nb2Byte]; flogprob_t lp,fr; } type_2gram; #define Nb3Byte 9 typedef struct { unsigned char cle[Nb3Byte]; flogprob_t lp; } type_3gram; /* Declaration du type ML */ typedef struct type_ml { /* un modele proba mot classe (pmc) */ ty_pmc pmc; /* un lexique de la librairie gere_lexique */ ty_lexique lexique; /* Taille des tableaux de Hash : ATTENTION prendre des nombres premiers !! */ long NB1GRAM,NB2GRAM,NB3GRAM; /* les tableaux de Hash */ type_1gram *TABL1GRAM; type_2gram *TABL2GRAM; type_3gram *TABL3GRAM; /* Si on utilise le hash-code ou la dichotomie */ int GRAM_SI_HASH; /* If we have a 2gram or a 3gram model */ int GRAM_SI_2G; /* If LOG10 or LOGe */ int GRAM_LOG10; } *ty_ml; /*................................................................*/ /* Variables globales de stockage des ML */ #define NB_MAX_ML 1000 extern ty_ml Table_ML[]; /* Nombre de ML present en memoire */ extern int NB_ML; /* Macro permettant de renvoyer un pointeur sur un modele pmc */ #define MODELE_PMC(n) (Table_ML[(n)]->pmc) /* Macro permettant de renvoyer un pointeur sur un lexique */ #define LEXIQUE(n) (Table_ML[(n)]->lexique) /* Macro permettant de renvoyer un pointeur sur un ML */ #define ML(n) (Table_ML[(n)]) /* Macro permettant de renvoyer le nombre de 1,2,3 grams */ #define NOMBRE_1GRAM(n) (Table_ML[(n)]->NB1GRAM) #define NOMBRE_2GRAM(n) (Table_ML[(n)]->NB2GRAM) #define NOMBRE_3GRAM(n) (Table_ML[(n)]->NB3GRAM) /* allocation des objets ml */ ty_ml cons_ml(long ,long ,long ,int ,int ,int ); /*................................................................*/ /* Gestion des NGrams */ #define BYTE1(a) (a & 0xFF) #define BYTE2(a) ((a & 0xFF00)>>8) #define BYTE3(a) ((a & 0xFF0000)>>16) /* Test de case vide */ /* le dernier bit du dernier octet du tableau de cles est utilise comme booleen de case vide. Exemple : pour les 1grams, la cle est composee de 3 octets, X1111111 11111111 11111111, si le bit X est a 1, la case est vide, s'il est a 0 la case est pleine. ATTENTION, ce codage limite la taille du vocabulaire a 8388607 mots. */ #define Case1Vide(i,pt_ml) ((pt_ml->TABL1GRAM[i].cle[Nb1Byte-1]&128)>>7) #define Case2Vide(i,pt_ml) ((pt_ml->TABL2GRAM[i].cle[Nb2Byte-1]&128)>>7) #define Case3Vide(i,pt_ml) ((pt_ml->TABL3GRAM[i].cle[Nb3Byte-1]&128)>>7) /*................................................................*/ /* Addition circulaire */ /* on doit faire (valh1+(valh2*(essai-1)))%nbgram */ #define EssaiSuivant(valh1,valh2,essai,nbgram) \ ((wrd_index_t)fmod(((double)valh1+((double)valh2*(double)(essai-1))),(double)(nbgram))) /*................................................................*/ /* Fonction de Hachage */ #define TETA1 ((double)0.6180339887) #define TETA2 ((double)0.3819660113) /* on ajoute 1 aux valeurs de i pour eviter que la cle soit a 0 */ #define Combine2Indice(i1,i2) (i1+100*(i2+1)) #define Combine3Indice(i1,i2,i3) (i1+100*(i2+1)+100*(i3+1)) /* premiere fonction */ #define H1Value(i,pt_ml) ((long)(fmod((double)((i)+1)*TETA1,(double)1)*(double)(pt_ml)->NB1GRAM)+1) #define H2Value(i1,i2,pt_ml) ((long)(fmod((double)(Combine2Indice((i1),(i2)))*TETA1,\ (double)1)*(double)(pt_ml)->NB2GRAM)+1) #define H3Value(i1,i2,i3,pt_ml) ((long)(fmod((double)(Combine3Indice((i1),(i2),(i3)))*TETA1,\ (double)1)*(double)(pt_ml)->NB3GRAM)+1) /* deuxieme fonction */ #define Double1H(i,pt_ml) ((long)(fmod((double)(i+1)*TETA2,(double)1)*(double)(pt_ml->NB1GRAM-1))+1) #define Double2H(i1,i2,pt_ml) ((long)(fmod((double)(Combine2Indice(i1,i2))*TETA2,\ (double)1)*(double)(pt_ml->NB2GRAM-1))+1) #define Double3H(i1,i2,i3,pt_ml) ((long)(fmod((double)(Combine3Indice(i1,i2,i3))*TETA2,\ (double)1)*(double)(pt_ml->NB3GRAM-2))+1) /*................................................................*/ /* Egalite */ int H1compar(const void * ,const void * ) ; int H2compar(const void * ,const void * ) ; int H3compar(const void * ,const void * ) ; int SiEgal1(wrd_index_t ,long, ty_ml) ; int SiEgal2(wrd_index_t ,wrd_index_t ,long, ty_ml) ; int SiEgal3(wrd_index_t ,wrd_index_t ,wrd_index_t ,long, ty_ml) ; /*................................................................*/ /* Passage des log 10 aux log e */ #define LOG10_2_LOGe(a) ((double)(a)*(log((double)10))) /*................................................................*/ /* Gestion des 1.2.3-gram au format arpa */ /* FRED 0398 - Modif multi ML 0399 */ err_t gram_module_init(char *, int *, int , const err_t); err_t gram_module_reset(const int, const err_t); err_t gram_proba_to_bigram(logprob_t *,const wrd_index_t , const wrd_index_t , const int, const err_t ); err_t gram_proba_to_trigram(logprob_t *,const wrd_index_t , const wrd_index_t , const wrd_index_t , const int, const err_t ); int Recherche1Gram(wrd_index_t, flogprob_t *, flogprob_t *, ty_ml); int HashRecherche1Gram(wrd_index_t, flogprob_t *, flogprob_t *, ty_ml); int DichoRecherche1Gram(wrd_index_t, flogprob_t *, flogprob_t *, ty_ml); int Recherche2Gram(wrd_index_t, wrd_index_t, flogprob_t *, flogprob_t *, ty_ml); int HashRecherche2Gram(wrd_index_t, wrd_index_t, flogprob_t *, flogprob_t *, ty_ml); int DichoRecherche2Gram(wrd_index_t, wrd_index_t, flogprob_t *, flogprob_t *, ty_ml); int Recherche3Gram(wrd_index_t, wrd_index_t, wrd_index_t, flogprob_t *, ty_ml); int HashRecherche3Gram(wrd_index_t, wrd_index_t, wrd_index_t, flogprob_t *, ty_ml); int DichoRecherche3Gram(wrd_index_t, wrd_index_t, wrd_index_t, flogprob_t *, ty_ml); |