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 "TokenAttributes.h"
00029 #include "Language.h"
00030
00031
00032
00033
00034
00035 #include <map>
00036
00037 namespace Tanl {
00038
00039 class Sentence;
00040 class SentenceReader;
00041
00047 struct TokenField
00048 {
00050 enum Use {
00051 input,
00052 output,
00053 echo,
00054 ignore
00055 };
00056
00058 enum Value {
00059 string,
00060 integer
00061 };
00062
00063 enum Role {
00064 none,
00065 form,
00066 head,
00067 deprel,
00068 predicate
00069 };
00070
00071 TokenField() :
00072 use(input),
00073 value(string),
00074 role(none),
00075 default_("_")
00076 { }
00077
00078 std::string name;
00079 Use use;
00080 Value value;
00081 Role role;
00082 std::string default_;
00083 std::string link;
00084 std::string label;
00085 };
00086
00090 typedef std::vector<TokenField> TokenFields;
00091
00097 struct CorpusFormat
00098 {
00099 std::string name;
00100 TokenFields tokenFields;
00101 AttributeIndex index;
00102 };
00103
00107 class CorpusFormatError : public IXE::RuntimeError
00108 {
00109 public:
00110 CorpusFormatError(std::string const& msg) : IXE::RuntimeError(msg) {}
00111 };
00112
00118 class Corpus
00119 {
00120 public:
00121 Language const& language;
00122 AttributeIndex index;
00123 TokenFields tokenFields;
00124
00128 Corpus(Language const& lang) :
00129 language(lang)
00130 { }
00131
00136 Corpus(Language const& lang, CorpusFormat& format) :
00137 language(lang),
00138 tokenFields(format.tokenFields),
00139 index(format.index)
00140 { }
00141
00146 Corpus(Language const& lang, char const* formatFile);
00147
00148 Corpus() : language(Language("en")) { }
00149
00157 static Corpus* create(Language const& language, char const* inputFormat);
00158
00159 static Corpus* create(char const* language, char const* inputFormat);
00160
00161 virtual ~Corpus() {}
00162
00167 static CorpusFormat* parseFormat(char const* formatFile);
00168
00171 AttributeId attributeId(const char* name) {
00172 return index.insert(name);
00173 }
00174
00179 virtual SentenceReader* sentenceReader(std::istream* is);
00180
00184 virtual void print(std::ostream& os, Sentence const& sent) const;
00185 virtual std::string toString(Sentence const& sent) const;
00186
00187 protected:
00188 static CorpusFormat* parseFormat(std::istream& is);
00189
00190 };
00191
00195 struct ConllXCorpus : public Corpus
00196 {
00197
00198 ConllXCorpus(Language const& lang);
00199
00200 SentenceReader* sentenceReader(std::istream* is);
00201
00202 void print(std::ostream& os, Sentence const& sent) const;
00203 };
00204
00208 struct Conll08Corpus : public Corpus
00209 {
00214 Conll08Corpus(Language const& lang, CorpusFormat& format) :
00215 Corpus(lang, format)
00216 { }
00217
00218 void print(std::ostream& os, Sentence const& sent) const;
00219 };
00220
00224 struct DgaCorpus : public Corpus
00225 {
00226
00227 DgaCorpus(Language const& lang);
00228
00229 SentenceReader* sentenceReader(std::istream* is);
00230
00231 void print(std::ostream& os, Sentence const& sent) const;
00232 };
00233
00240 struct CombCorpus : public Corpus
00241 {
00242 CombCorpus(Language const& lang, char const* formatFile) :
00243 Corpus(lang, formatFile)
00244 { }
00245
00246 void print(std::ostream& os, Sentence const& sent) const;
00247 };
00248
00254 struct TextCorpus : public Corpus
00255 {
00256 TextCorpus(Language const& lang) :
00257 Corpus(lang)
00258 {}
00259
00260 SentenceReader* sentenceReader(std::istream* is);
00261 };
00262
00268 struct TokenizedTextCorpus : public Corpus
00269 {
00270 TokenizedTextCorpus(Language const& lang) :
00271 Corpus(lang)
00272 {}
00273
00274 SentenceReader* sentenceReader(std::istream* is);
00275 };
00276
00278
00279
00280
00281 typedef Corpus* CorpusFactory(Language const& lang, CorpusFormat* format);
00282
00288 struct CorpusMap
00289 {
00290 public:
00291 CorpusMap(char const* type, CorpusFactory* rf);
00292
00293 static CorpusFactory* get(char const* type);
00294
00295 private:
00296 static std::map<char const*, CorpusFactory*>& get();
00297 };
00298
00299 #define REGISTER_CORPUS(type, factory) static CorpusMap __dummy ## type(#type, factory)
00300
00301 }
00302
00303 #endif // DeSR_Corpus_H