153 map<string, set<string>> upos;
154 map<string, set<string>> feats;
155 map<string, set<string>> feat2upos;
192 vector<string> feats_by_use_count;
193 feats_by_use_count.reserve(feat2upos.size());
194 for (
const auto& kv : feat2upos )
196 feats_by_use_count.push_back(kv.first);
199 sort(feats_by_use_count.begin(), feats_by_use_count.end(), [&feat2upos](
const string& a,
const string& b){
200 return feat2upos[a].size() > feat2upos[b].size();
205 total += upos.size();
206 for (
const string& s : feats_by_use_count )
209 size_t num_values = feats[s].size();
217 map<string, vector<string>> upos2feat;
218 vector<bool> used(feats_by_use_count.size(),
false);
219 vector<string> fixed_feats = {
"Abbr",
"Foreign",
"Typo" };
224 for (
const auto& kv : upos )
226 const string& upos_name = kv.first;
229 for (
const string& feat_name : kv.second )
235 map<pair<feat_base_t, uint8_t>,
size_t> masks;
236 vector<map<size_t, pair<feat_base_t, uint8_t>>> uposid2featid2mask;
237 uposid2featid2mask.resize(upos2feat.size());
238 for (
const auto& kv : upos2feat )
240 const string& upos_name = kv.first;
244 for (
const string& feat_name : kv.second )
249 if (feat_name ==
"upos")
255 auto it = feats.find(feat_name);
256 assert(feats.end() != it);
257 const set<string>& feat_values = it->second;
265 << feat_name <<
" " << width <<
" " << offset
267 masks[make_pair(mask, offset)] += 1;
268 uposid2featid2mask[upos_id][feat_id] = make_pair(mask, offset);
276 model.
m_masks.reserve(masks.size());
277 model.
m_offset.reserve(masks.size());
278 for (
const auto& kv : masks )
281 uint8_t offset = kv.first.second;
282 masks[kv.first] = model.
m_masks.size();
288 for (
size_t i = 0; i < uposid2featid2mask.size(); ++i)
290 for (
const auto& kv : uposid2featid2mask[i] )
296 model.
m_feats.resize(feats.size() + 1);
297 for (
const auto& kv : feats )
299 const string& feat_name = kv.first;
300 const set<string>& feat_values = kv.second;
303 size_t empty_code = model.
m_feats[feat_id].add_key(
"_");
304 assert(0 == empty_code);
305 for (
const string& value : feat_values )
307 model.
m_feats[feat_id].add_key(value);
void build_morph_model_inner(map< string, vector< string > > &upos2feat, vector< string > &feats_by_use_count, const map< string, set< string > > &upos, const map< string, set< string > > &feats, const vector< string > &fixed_feats)
void collect_statistics(const CoNLLU::Annotation &annot, map< string, set< string > > &upos, map< string, set< string > > &feats, map< string, set< string > > &feat2upos)