00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef DeSR_Corpus_H
00025 #define DeSR_Corpus_H
00026
00027
00028 #include "Language.h"
00029 #include "SentenceReader.h"
00030
00031
00032 #include "include/error.h"
00033
00034 namespace Tanl {
00035
00039 struct TokenField
00040 {
00042 enum Use {
00043 input,
00044 output,
00045 echo,
00046 ignore
00047 };
00048
00050 enum Value {
00051 string,
00052 integer
00053 };
00054
00055 enum Role {
00056 none,
00057 form,
00058 head,
00059 deprel,
00060 predicate
00061 };
00062
00063 TokenField() :
00064 use(input),
00065 value(string),
00066 role(none),
00067 default_("_")
00068 { }
00069
00070 std::string name;
00071 Use use;
00072 Value value;
00073 Role role;
00074 std::string default_;
00075 std::string link;
00076 std::string label;
00077 };
00078
00079 typedef std::vector<TokenField> TokenFields;
00080
00082 struct CorpusFormat
00083 {
00084 std::string name;
00085 TokenFields tokenFields;
00086 AttributeIndex index;
00087 };
00088
00089 class CorpusFormatError : public IXE::RuntimeError
00090 {
00091 public:
00092 CorpusFormatError(std::string const& msg) : IXE::RuntimeError(msg) {}
00093 };
00094
00098 class Corpus
00099 {
00100 public:
00101 Language const& language;
00102 AttributeIndex index;
00103 TokenFields tokenFields;
00104
00108 Corpus(Language const& lang) :
00109 language(lang)
00110 { }
00111
00116 Corpus(Language const& lang, CorpusFormat& format) :
00117 language(lang),
00118 tokenFields(format.tokenFields),
00119 index(format.index)
00120 { }
00121
00126 Corpus(Language const& lang, char const* formatFile);
00127
00135 static Corpus* create(Language const& language, char const* inputFormat);
00136
00137 static Corpus* create(char const* language, char const* inputFormat) {
00138 return create(Language(language), inputFormat);
00139 }
00140
00141 virtual ~Corpus() {}
00142
00147 static CorpusFormat* parseFormat(char const* formatFile);
00148
00151 AttributeId attributeId(const char* name) {
00152 return index.insert(name);
00153 }
00154
00159 virtual SentenceReader* sentenceReader(std::istream* is);
00160
00164 virtual void print(std::ostream& os, Sentence const& sent) const;
00165
00166 protected:
00167 static CorpusFormat* parseFormat(std::istream& is);
00168
00169 };
00170
00171 struct ConllXCorpus : public Corpus
00172 {
00173
00174 ConllXCorpus(Language const& lang);
00175
00176 SentenceReader* sentenceReader(std::istream* is);
00177
00178 void print(std::ostream& os, Sentence const& sent) const;
00179 };
00180
00181 struct Conll08Corpus : public Corpus
00182 {
00187 Conll08Corpus(Language const& lang, CorpusFormat& format) :
00188 Corpus(lang, format)
00189 { }
00190
00191 void print(std::ostream& os, Sentence const& sent) const;
00192 };
00193
00194 struct DgaCorpus : public Corpus
00195 {
00196
00197 DgaCorpus(Language const& lang);
00198
00199 SentenceReader* sentenceReader(std::istream* is);
00200
00201 void print(std::ostream& os, Sentence const& sent) const;
00202 };
00203
00208 struct CombCorpus : public Corpus
00209 {
00210 CombCorpus(Language const& lang, char const* formatFile) :
00211 Corpus(lang, formatFile)
00212 { }
00213
00214 void print(std::ostream& os, Sentence const& sent) const;
00215 };
00216
00220 struct TextCorpus : public Corpus
00221 {
00222 TextCorpus(Language const& lang) :
00223 Corpus(lang)
00224 {}
00225
00226 SentenceReader* sentenceReader(std::istream* is);
00227 };
00228
00232 struct TokenizedTextCorpus : public Corpus
00233 {
00234 TokenizedTextCorpus(Language const& lang) :
00235 Corpus(lang)
00236 {}
00237
00238 SentenceReader* sentenceReader(std::istream* is);
00239 };
00240
00242
00243 typedef Corpus* CorpusFactory(Language const& lang, CorpusFormat* format = 0);
00244
00248 struct CorpusMap
00249 {
00250 public:
00251 CorpusMap(char const* type, CorpusFactory* rf)
00252 {
00253 get()[type] = rf;
00254 }
00255
00256 static CorpusFactory* get(char const* type);
00257
00258 private:
00259 static std::map<char const*, CorpusFactory*>& get();
00260 };
00261
00262 #define REGISTER_CORPUS(type, factory) static CorpusMap __dummy ## type(#type, factory)
00263
00264 }
00265
00266 #endif // DeSR_Corpus_H