LDA++
Document.hpp
1 #ifndef _LDAPLUSPLUS_DOCUMENT_HPP_
2 #define _LDAPLUSPLUS_DOCUMENT_HPP_
3 
4 
5 #include <memory>
6 #include <random>
7 #include <vector>
8 
9 #include <Eigen/Core>
10 
11 namespace ldaplusplus {
12 namespace corpus {
13 
14 
15 // Forward declaration for the compiler
16 class Corpus;
17 
18 
26 class Document
27 {
28  public:
32  virtual const std::shared_ptr<const Corpus> get_corpus() const = 0;
36  virtual const Eigen::VectorXi & get_words() const = 0;
37 
42  template <typename T>
43  const std::shared_ptr<const T> get_corpus() const {
44  return std::static_pointer_cast<const T>(get_corpus());
45  }
46 
47  virtual ~Document(){};
48 };
49 
50 
56 {
57  public:
61  virtual int get_class() const = 0;
62 };
63 
64 
68 class Corpus
69 {
70  public:
72  virtual size_t size() const = 0;
74  virtual const std::shared_ptr<Document> at(size_t index) const = 0;
79  virtual void shuffle() = 0;
80 
81  virtual ~Corpus(){};
82 };
83 
84 
90 {
91  public:
97  virtual float get_prior(int y) const = 0;
98 };
99 
100 
104 class EigenDocument : public Document
105 {
106  public:
107  EigenDocument(Eigen::VectorXi X) : EigenDocument(X, nullptr) {}
108  EigenDocument(Eigen::VectorXi X, std::shared_ptr<const Corpus> corpus);
109 
110  const std::shared_ptr<const Corpus> get_corpus() const override;
111  const Eigen::VectorXi & get_words() const override;
112 
113  private:
114  Eigen::VectorXi X_;
115  std::shared_ptr<const Corpus> corpus_;
116 };
117 
118 
124 {
125  public:
130  ClassificationDecorator(std::shared_ptr<Document> doc, int y);
131 
132  const std::shared_ptr<const Corpus> get_corpus() const override;
133  const Eigen::VectorXi & get_words() const override;
134  int get_class() const override;
135 
136  private:
137  std::shared_ptr<Document> document_;
138  int y_;
139 };
140 
141 
147 {
148  public:
149  CorpusIndexes(int N, int random_state=0);
150 
155  int get_index(int index) const { return indices_[index]; }
156 
160  void shuffle();
161 
162  private:
167  std::vector<int> indices_;
168 
170  std::mt19937 prng_;
171 };
172 
173 
177 class EigenCorpus : public Corpus
178 {
179  public:
180  EigenCorpus(const Eigen::MatrixXi & X, int random_state=0);
181 
182  size_t size() const override;
183  virtual const std::shared_ptr<Document> at(size_t index) const override;
184  void shuffle() override;
185 
186  protected:
189 
194  const Eigen::MatrixXi & X_;
195 
196 };
197 
198 
204 {
205  public:
207  const Eigen::MatrixXi &X,
208  const Eigen::VectorXi &y,
209  int random_state = 0
210  );
211 
212  size_t size() const override;
213  virtual const std::shared_ptr<Document> at(size_t index) const override;
214  void shuffle() override;
215  float get_prior(int y) const override;
216 
217  private:
219  CorpusIndexes indices_;
220 
221  // The data
222  const Eigen::MatrixXi & X_;
223  const Eigen::VectorXi & y_;
224 
225  // The class priors
226  Eigen::VectorXf priors_;
227 };
228 
229 } // namespace corpus
230 } // namespace ldaplusplus
231 
232 #endif // _LDAPLUSPLUS_DOCUMENT_HPP_
Definition: Document.hpp:68
const std::shared_ptr< const T > get_corpus() const
Definition: Document.hpp:43
Definition: Document.hpp:104
const Eigen::MatrixXi & X_
Definition: Document.hpp:194
Definition: Document.hpp:146
Definition: Document.hpp:177
virtual const std::shared_ptr< const Corpus > get_corpus() const =0
CorpusIndexes indices_
Definition: Document.hpp:188
virtual const Eigen::VectorXi & get_words() const =0
int get_index(int index) const
Definition: Document.hpp:155
Definition: Document.hpp:26
Definition: Document.hpp:11