00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdio.h>
00024 #include <cstdlib>
00025 #include <stdlib.h>
00026 #include <iomanip>
00027 #include <cassert>
00028 #include "mempool.h"
00029 #include "htable.h"
00030 #include "dictionary.h"
00031 #include "n_gram.h"
00032 #include "index.h"
00033
00034 using namespace std;
00035
00036 ngram::ngram(dictionary* d,int sz){
00037 dict=d;
00038 size=sz;
00039 succ=0;
00040 freq=0;
00041 info=0;
00042 pinfo=0;
00043 link=NULL;
00044 isym=-1;
00045 memset(word,0,sizeof(int)*MAX_NGRAM);
00046 memset(midx,0,sizeof(int)*MAX_NGRAM);
00047 memset(path,0,sizeof(char *)*MAX_NGRAM);
00048 }
00049
00050 ngram::ngram(ngram& ng){
00051 size=ng.size;
00052 freq=ng.freq;
00053 succ=0;
00054 info=0;
00055 pinfo=0;
00056 link=NULL;
00057 isym=-1;
00058 dict=ng.dict;
00059 memcpy(word,ng.word,sizeof(int)*MAX_NGRAM);
00060 memcpy(midx,ng.word,sizeof(int)*MAX_NGRAM);
00061
00062 }
00063
00064 void ngram::trans (const ngram& ng){
00065 size=ng.size;
00066 freq=ng.freq;
00067 if (dict == ng.dict){
00068 info=ng.info;
00069 isym=ng.isym;
00070 memcpy(word,ng.word,sizeof(int)*MAX_NGRAM);
00071 memcpy(midx,ng.midx,sizeof(int)*MAX_NGRAM);
00072 }
00073 else{
00074 info=0;
00075 memset(midx,0,sizeof(int)*MAX_NGRAM);
00076 isym=-1;
00077 for (int i=1;i<=size;i++)
00078 word[MAX_NGRAM-i]=dict->encode(ng.dict->decode(*ng.wordp(i)));
00079 }
00080 }
00081
00082
00083 void ngram::invert (const ngram& ng){
00084 size=ng.size;
00085 for (int i=1;i<=size;i++){
00086 *wordp(i)=*ng.wordp(size-i+1);
00087 }
00088 }
00089
00090 void ngram::shift (){
00091 memmove((void *)&word[MAX_NGRAM-size+1],(void *)&word[MAX_NGRAM-size],(size-1) * sizeof(int));
00092 size--;
00093 }
00094
00095
00096 ifstream& operator>> ( ifstream& fi , ngram& ng){
00097 char w[MAX_WORD];
00098 memset(w,0,MAX_WORD);
00099 w[0]='\0';
00100
00101 if (!(fi >> setw(MAX_WORD) >> w))
00102 return fi;
00103
00104 if (strlen(w)==(MAX_WORD-1))
00105 cerr << "ngram: a too long word was read ("
00106 << w << ")\n";
00107
00108 int c=ng.dict->encode(w);
00109
00110 if (c == -1 ){
00111 cerr << "ngram: " << w << " is OOV \n";
00112 exit(1);
00113 }
00114
00115 memcpy(ng.word,ng.word+1,(MAX_NGRAM-1)*sizeof(int));
00116
00117 ng.word[MAX_NGRAM-1]=(int)c;
00118 ng.freq=1;
00119
00120 if (ng.size<MAX_NGRAM) ng.size++;
00121
00122 return fi;
00123
00124 }
00125
00126
00127 int ngram::pushw(const char* w){
00128
00129 assert(dict!=NULL);
00130
00131 int c=dict->encode(w);
00132
00133 if (c == -1 ){
00134 cerr << "ngram: " << w << " is OOV \n";
00135 exit(1);
00136 }
00137
00138 pushc(c);
00139
00140 return 1;
00141
00142 }
00143
00144 int ngram::pushc(int c){
00145
00146 int buff[MAX_NGRAM-1];
00147 memcpy(buff,word+1,(MAX_NGRAM-1)*sizeof(int));
00148 memcpy(word,buff,(MAX_NGRAM-1)*sizeof(int));
00149
00150 word[MAX_NGRAM-1]=(int)c;
00151 if (size<MAX_NGRAM) size++;
00152
00153 return 1;
00154
00155 }
00156
00157
00158 istream& operator>> ( istream& fi , ngram& ng){
00159 char w[MAX_WORD];
00160 memset(w,0,MAX_WORD);
00161 w[0]='\0';
00162
00163 assert(ng.dict != NULL);
00164
00165 if (!(fi >> setw(MAX_WORD) >> w))
00166 return fi;
00167
00168 if (strlen(w)==(MAX_WORD-1))
00169 cerr << "ngram: a too long word was read ("
00170 << w << ")\n";
00171
00172 ng.pushw(w);
00173
00174 ng.freq=1;
00175
00176 return fi;
00177
00178 }
00179
00180 ofstream& operator<< (ofstream& fo,ngram& ng){
00181
00182 assert(ng.dict != NULL);
00183
00184 for (int i=ng.size;i>0;i--)
00185 fo << ng.dict->decode(ng.word[MAX_NGRAM-i]) << (i>1?" ":"");
00186 fo << "\t" << ng.freq;
00187 return fo;
00188 }
00189
00190 ostream& operator<< (ostream& fo,ngram& ng){
00191
00192 assert(ng.dict != NULL);
00193
00194 for (int i=ng.size;i>0;i--)
00195 fo << ng.dict->decode(ng.word[MAX_NGRAM-i]) << (i>1?" ":"");
00196 fo << "\t" << ng.freq;
00197
00198 return fo;
00199 }
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215