Loading...
Searching...
No Matches
text_dataset.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Artificial Intelligence Techniques, S.L. and Roberto López González
3
4#pragma once
5
9
10namespace opennn
11{
12
13class TextDataset final : public Dataset
14{
15public:
18
27
30
31 const Options& get_options() const noexcept { return options; }
32 void read_txt(const filesystem::path&);
33 void set_tokenizer(unique_ptr<TokenizerOperator>, VariableRole = VariableRole::Input);
35 const vector<string>& get_vocabulary(VariableRole = VariableRole::Input) const noexcept;
37 {
38 return Index(get_vocabulary(role).size());
39 }
41 {
42 const Shape& shape = get_shape(role);
43 return shape.empty() ? 0 : shape.size();
44 }
45
46 // One entry per field of the data file, in file order. Role::Input feeds the
47 // network, Role::Target carries the class and Role::None is ignored; the
48 // identifier column, when there is one, is the first field and has_sample_ids
49 // tells the reader to keep it. An empty vector means the positional default:
50 // identifier first, target last, every other field an input.
51 struct Column
52 {
53 string name;
55
56 friend bool operator==(const Column&, const Column&) = default;
57 };
58
59 const vector<Column>& get_columns() const noexcept { return columns; }
60 void set_columns(vector<Column>);
61 static vector<Column> columns_from_JSON(const Json*);
62
63 vector<string> get_text_columns() const;
64 vector<string> get_text_column_markers() const;
65 vector<Index> encode_text(span<const string> texts) const;
66
67 struct Record
68 {
69 string id;
70 vector<string> texts;
71 string target;
72 };
73
74 void for_each_record(const function<bool(Index, const Record&)>&) const;
75 vector<Record> read_records() const;
76
77 optional<Record> split_line(string_view line, bool with_id = true) const;
78
79 const TokenizerOperator* get_training_tokenizer() const override { return get_tokenizer(); }
80 const TokenizerOperator* get_training_tokenizer(VariableRole role) const override { return get_tokenizer(role); }
81 bool supports_bf16_inputs() const override { return options.input_layout == InputLayout::TokensAndMask; }
83
86 void to_JSON(JsonWriter&) const override;
87 void from_JSON(const JsonDocument&) override;
88
89 void fill_inputs(const vector<Index>&, const vector<Index>&, float*, FillMode,
91 void fill_targets(const vector<Index>&, const vector<Index>&, float*, FillMode,
93 void fill_decoder(const vector<Index>&, const vector<Index>&, float*, FillMode,
95
96private:
97 struct Segment
98 {
99 VariableRole role;
100 Index length;
101 Index offset;
102 Index prefix = -1;
103 };
104
105 struct Documents
106 {
107 vector<Column> columns;
108 vector<vector<string>> input;
109 vector<vector<Index>> input_lengths;
110 vector<vector<string>> target;
111 vector<string> ids;
112 };
113
114 VariableRole token_role() const noexcept;
115 void configure(Index samples, Index input_length, Index target_length);
116 void load_documents(Documents&) const;
117 void prepare_tokenizer();
118 vector<Index> encode_input(span<const string> tokens, span<const Index> lengths, Index length) const;
119 void build_labels(const vector<vector<string>>&);
120 void read_rows();
121 void read_corpus();
122 bool uses_cache() const noexcept;
123 void store_matrix_record(Index, span<const int32_t>);
124 void write_records(Index, const function<void(Index, span<int32_t>)>&);
125 void fill_sequences(VariableRole, const vector<Index>&, const vector<Index>&,
126 float*, ColumnContiguity) const;
127 void write_configuration(JsonWriter&) const;
128 void read_configuration(const Json*);
129 bool load_cache(const filesystem::path&);
130 void save_cache(const filesystem::path&) const;
131
132 Options options;
133 unique_ptr<TokenizerOperator> tokenizer;
134 unique_ptr<TokenizerOperator> target_tokenizer;
135 bool fixed_vocabulary = false;
136 bool fixed_target_vocabulary = false;
137 string tokenizer_identity;
138 string target_tokenizer_identity;
139 vector<string> labels;
140 vector<Column> columns;
141 vector<Segment> segments;
142 Index record_tokens = 0;
143 filesystem::path cache_path;
144 mutable FileReader cache_reader;
145};
146
147}
Dataset()=default
virtual void set_storage_mode(StorageMode)
Shape get_shape(VariableRole) const
StorageMode
Definition dataset.h:57
Definition json.h:75
Definition json.h:92
Definition json.h:24
void set_storage_mode(StorageMode) override
optional< Record > split_line(string_view line, bool with_id=true) const
Index get_sequence_length(VariableRole role=VariableRole::Input) const
Definition text_dataset.h:40
const Options & get_options() const noexcept
Definition text_dataset.h:31
InputLayout
Definition text_dataset.h:17
@ TokensAndMask
Definition text_dataset.h:17
@ Tokens
Definition text_dataset.h:17
vector< string > get_text_column_markers() const
void to_JSON(JsonWriter &) const override
void fill_inputs(const vector< Index > &, const vector< Index > &, float *, FillMode, ColumnContiguity=ColumnContiguity::Unknown) const override
void set_tokenizer(unique_ptr< TokenizerOperator >, VariableRole=VariableRole::Input)
vector< string > get_text_columns() const
const TokenizerOperator * get_training_tokenizer() const override
Definition text_dataset.h:79
static vector< Column > columns_from_JSON(const Json *)
void read_txt(const filesystem::path &)
bool supports_bf16_inputs() const override
Definition text_dataset.h:81
const vector< Column > & get_columns() const noexcept
Definition text_dataset.h:59
Index get_vocabulary_size(VariableRole role=VariableRole::Input) const noexcept
Definition text_dataset.h:36
void set_columns(vector< Column >)
const TokenizerOperator * get_tokenizer(VariableRole=VariableRole::Input) const noexcept
const TokenizerOperator * get_training_tokenizer(VariableRole role) const override
Definition text_dataset.h:80
void fill_decoder(const vector< Index > &, const vector< Index > &, float *, FillMode, ColumnContiguity=ColumnContiguity::Unknown) const override
void fill_targets(const vector< Index > &, const vector< Index > &, float *, FillMode, ColumnContiguity=ColumnContiguity::Unknown) const override
const vector< string > & get_vocabulary(VariableRole=VariableRole::Input) const noexcept
vector< Record > read_records() const
VectorI calculate_target_distribution() const override
Task
Definition text_dataset.h:16
@ Classification
Definition text_dataset.h:16
@ SequenceToSequence
Definition text_dataset.h:16
@ NextToken
Definition text_dataset.h:16
void for_each_record(const function< bool(Index, const Record &)> &) const
vector< Index > encode_text(span< const string > texts) const
void from_JSON(const JsonDocument &) override
Definition tokenizer_operator.h:35
Definition configuration.h:10
FillMode
Definition batch.h:20
VariableRole
Definition variable.h:72
@ Input
Definition variable.h:74
ColumnContiguity
Definition tensor_types.h:747
@ Unknown
Definition tensor_types.h:747
Eigen::Matrix< Index, Eigen::Dynamic, 1 > VectorI
Definition opennn_types.h:336
Definition tensor_types.h:172
Index size() const
Definition tensor_types.h:221
bool empty() const noexcept
Definition tensor_types.h:217
Definition text_dataset.h:52
VariableRole role
Definition text_dataset.h:54
string name
Definition text_dataset.h:53
friend bool operator==(const Column &, const Column &)=default
Definition text_dataset.h:20
Index sequence_length
Definition text_dataset.h:23
Index maximum_vocabulary_size
Definition text_dataset.h:24
InputLayout input_layout
Definition text_dataset.h:22
Task task
Definition text_dataset.h:21
Index minimum_token_frequency
Definition text_dataset.h:25
Definition text_dataset.h:68
string id
Definition text_dataset.h:69
vector< string > texts
Definition text_dataset.h:70
string target
Definition text_dataset.h:71