forked from snap-stanford/snap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathftrgen.h
230 lines (182 loc) · 7.68 KB
/
ftrgen.h
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
///////////////////////////////////////
// Abstract-Feature-Generator
ClassTP(TFtrGen, PFtrGen)//{
protected:
typedef PFtrGen (*TFtrGenLoad)(TSIn& SIn);
typedef TFunc<TFtrGenLoad> TFtrGenLoadF;
static THash<TStr, TFtrGenLoadF> TypeToLoadFH;
static bool Reg(const TStr& TypeNm, const TFtrGenLoadF& LoadF);
public:
TFtrGen() { }
virtual ~TFtrGen() { }
TFtrGen(TSIn& SIn) { }
static PFtrGen Load(TSIn& SIn);
virtual void Save(TSOut& SOut) const { GetTypeNm(*this).Save(SOut);}
// updates counts
virtual void Update(const TStr& Val) = 0;
// generates features
virtual void Add(const TStr& Val, TIntFltKdV& SpV, int& Offset) const = 0;
// adds features as words to BowDocBs
void AddWds(const TStr& Prefix, const PBowDocBs& BowDocBs, int& Offset) const;
// number of values it takes in a feature vector
virtual int GetVals() const = 0;
// returns a word/value in a feature vector
virtual TStr GetVal(const int& ValN, const bool& PrefixP = true) const = 0;
// function which only work in nominal and multinomial (for category)
virtual void GetValV(const TStr& Str, TStrV& ValV) const = 0;
};
///////////////////////////////////////
// Numeric-Feature-Generator
class TFtrGenNumeric : public TFtrGen {
private:
static bool IsReg;
static bool MkReg() { return TFtrGen::Reg(TTypeNm<TFtrGenNumeric>(), &Load); }
private:
TFlt MnVal;
TFlt MxVal;
double Trans(const double& Val) const;
double GetFlt(const TStr& Str) const;
TFtrGenNumeric(): MnVal(TFlt::Mx), MxVal(TFlt::Mn) { }
TFtrGenNumeric(TSIn& SIn): TFtrGen(SIn), MnVal(SIn), MxVal(SIn) { }
public:
static PFtrGen New() { return new TFtrGenNumeric; }
static PFtrGen Load(TSIn& SIn) { return PFtrGen(new TFtrGenNumeric(SIn)); }
void Save(TSOut& SOut) const{ TFtrGen::Save(SOut); MnVal.Save(SOut); MxVal.Save(SOut); }
static TStr GetType() { return "NUM"; }
void Update(const TStr& Val);
void Add(const TStr& Val, TIntFltKdV& SpV, int& Offset) const;
int GetVals() const { return 1; }
TStr GetVal(const int& ValN, const bool& PrefixP) const { return GetType(); }
void GetValV(const TStr& Str, TStrV& ValV) const { Fail; }
};
///////////////////////////////////////
// Nominal-Feature-Generator
class TFtrGenNominal : public TFtrGen {
private:
static bool IsReg;
static bool MkReg() { return TFtrGen::Reg(TTypeNm<TFtrGenNominal>(), &Load); }
private:
TStrH ValH;
TFtrGenNominal() { }
TFtrGenNominal(TSIn& SIn): TFtrGen(SIn), ValH(SIn) { }
public:
static PFtrGen New() { return new TFtrGenNominal; }
static PFtrGen Load(TSIn& SIn) { return PFtrGen(new TFtrGenNominal(SIn)); }
void Save(TSOut& SOut) const { TFtrGen::Save(SOut); ValH.Save(SOut);}
static TStr GetType() { return "NOM"; }
void Update(const TStr& Val);
void Add(const TStr& Val, TIntFltKdV& SpV, int& Offset) const;
int GetVals() const { return ValH.Len(); }
TStr GetVal(const int& ValN, const bool& PrefixP) const {
return PrefixP ? (GetType() + ":" + ValH.GetKey(ValN)) : ValH.GetKey(ValN); }
void GetValV(const TStr& Str, TStrV& ValV) const { ValV = TStrV::GetV(Str); }
};
///////////////////////////////////////
// Tokenizable-Feature-Generator
class TFtrGenToken : public TFtrGen {
private:
static bool IsReg;
static bool MkReg() { return TFtrGen::Reg(TTypeNm<TFtrGenToken>(), &Load); }
private:
PSwSet SwSet;
PStemmer Stemmer;
TInt Docs;
TStrH TokenH;
void GetTokenV(const TStr& Str, TStrV& TokenStrV) const;
TFtrGenToken(PSwSet _SwSet, PStemmer _Stemmer): SwSet(_SwSet), Stemmer(_Stemmer) { }
TFtrGenToken(TSIn& SIn);
public:
static PFtrGen New(PSwSet SwSet, PStemmer Stemmer) { return new TFtrGenToken(SwSet, Stemmer); }
static PFtrGen Load(TSIn& SIn) { return PFtrGen(new TFtrGenToken(SIn)); }
void Save(TSOut& SOut) const;
static TStr GetType() { return "TOK"; }
void Update(const TStr& Val);
void Add(const TStr& Val, TIntFltKdV& SpV, int& Offset) const;
int GetVals() const { return TokenH.Len(); }
TStr GetVal(const int& ValN, const bool& PrefixP) const {
return PrefixP ? GetType() + ":" + TokenH.GetKey(ValN) : TokenH.GetKey(ValN); }
void GetValV(const TStr& Str, TStrV& ValV) const { Fail; }
};
///////////////////////////////////////
// Sparse-Feature-Generator
class TFtrGenSparseNumeric : public TFtrGen {
private:
static bool IsReg;
static bool MkReg() { return TFtrGen::Reg(TTypeNm<TFtrGenSparseNumeric>(), &Load); }
private:
TInt MxId;
PFtrGen FtrGen;
void Split(const TStr& Str, int& Id, TStr& Val) const;
TFtrGenSparseNumeric(): FtrGen(TFtrGenNumeric::New()) { }
TFtrGenSparseNumeric(TSIn& SIn): TFtrGen(SIn), MxId(SIn), FtrGen(SIn) { }
public:
static PFtrGen New() { return new TFtrGenSparseNumeric; }
static PFtrGen Load(TSIn& SIn) { return PFtrGen(new TFtrGenSparseNumeric(SIn)); }
void Save(TSOut& SOut) const { TFtrGen::Save(SOut); MxId.Save(SOut); FtrGen.Save(SOut); }
static TStr GetType() { return "SP-NUM"; }
void Update(const TStr& Str);
void Add(const TStr& Str, TIntFltKdV& SpV, int& Offset) const;
int GetVals() const { return MxId + 1; }
TStr GetVal(const int& ValN, const bool& PrefixP) const;
void GetValV(const TStr& Str, TStrV& ValV) const { Fail; }
};
///////////////////////////////////////
// MultiNomial-Feature-Generator
class TFtrGenMultiNom : public TFtrGen {
private:
static bool IsReg;
static bool MkReg() { return TFtrGen::Reg(TTypeNm<TFtrGenMultiNom>(), &Load); }
private:
PFtrGen FtrGen;
TFtrGenMultiNom(): FtrGen(TFtrGenNominal::New()) { }
TFtrGenMultiNom(TSIn& SIn): TFtrGen(SIn), FtrGen(SIn) { }
public:
static PFtrGen New() { return new TFtrGenMultiNom; }
static PFtrGen Load(TSIn& SIn) { return PFtrGen(new TFtrGenMultiNom(SIn)); }
void Save(TSOut& SOut) const { TFtrGen::Save(SOut); FtrGen.Save(SOut); }
static TStr GetType() { return "MULTI-NOM"; }
void Update(const TStr& Str);
void Add(const TStr& Str, TIntFltKdV& SpV, int& Offset) const;
int GetVals() const { return FtrGen->GetVals(); }
TStr GetVal(const int& ValN, const bool& PrefixP) const;
void GetValV(const TStr& Str, TStrV& ValV) const;
};
///////////////////////////////////////
// Feature-Generator-Base
ClassTP(TFtrGenBs, PFtrGenBs)//{
private:
typedef enum { fgsInit, fgsUpdate, fgsGen } TFtrGenState;
private:
TFtrGenState State;
TVec<PFtrGen> FtrGenV;
PFtrGen ClsFtrGen;
public:
TFtrGenBs(): State(fgsInit) { }
static PFtrGenBs New() { return new TFtrGenBs; }
TFtrGenBs(TSIn& SIn);
static PFtrGenBs Load(TSIn& SIn) { return new TFtrGenBs(SIn); }
void Save(TSOut& SOut) const;
// feature generators
int GetFtrGens() const { return FtrGenV.Len(); }
int AddFtrGen(const PFtrGen& FtrGen);
void PutClsFtrGen(const PFtrGen& FtrGen);
void FinishInit() { State = fgsUpdate; }
// counting features
void Update(const TStrV& FtrValV);
void UpdateCls(const TStr& ClsFtrVal);
void FinishUpdate() { State = fgsGen; }
// generate feature vector
void GenFtrV(const TStrV& FtrValV, TIntFltKdV& FtrSpV) const;
void GenClsV(const TStr& ClsFtrVal, TStrV& ClsV) const;
// dealing with bow
PBowDocBs MakeBowDocBs() const;
void AddBowDoc(const PBowDocBs& BowDocBs, const TStr& DocNm,
const TStrV& FtrValV) const;
void AddBowDoc(const PBowDocBs& BowDocBs, const TStr& DocNm,
const TStrV& FtrValV, const TStr& ClsFtrVal) const;
// dealing with categories
void GetAllCatNmV(TStrV& CatNmV) const;
// loads CSV files into BowDocBs
static PBowDocBs LoadCsv(TStr& FNm, const int& ClassId,
const TIntV& IgnoreIdV, const int& TrainLen);
};