6#ifndef DEEPLIMA_LIBS_MORPH_MODEL_H
7#define DEEPLIMA_LIBS_MORPH_MODEL_H
14#include <unordered_map>
44 : m_value(other.m_value) { }
50 assert((m_value & val) == 0);
56 return m_value == other.m_value;
61 return m_value != other.m_value;
66 return m_value < other.m_value;
76 return (m_value & mask) >> offset;
81 return std::hash<feat_base_t>{}(m_value);
85class morph_model_builder;
96 std::unordered_map<std::string, size_t> m_key2id;
97 std::vector<std::string> m_id2key;
100 dict_t(
const std::string& str);
101 static dict_t from_string(
const std::string& str);
103 std::string to_string()
const;
105 const std::vector<std::string>& get_vec_ref()
const
110 size_t get_id(
const std::string& name)
const
112 auto it = m_key2id.find(name);
113 assert(m_key2id.end() != it);
121 const std::string& get_key(
size_t id)
const
123 assert(
id < m_id2key.size());
127 size_t add_key(
const std::string& name)
129 if (m_key2id.end() == m_key2id.find(name))
131 m_id2key.push_back(name);
132 m_key2id[name] = m_id2key.size() - 1;
137 bool has(
const std::string& name)
const
139 auto it = m_key2id.find(name);
140 return m_key2id.end() != it;
157 return m_upos_dict.get_vec_ref();
159 return m_feats[feat_id].get_vec_ref();
163 inline bool has_feat(
const std::string& feat_name)
const
165 return m_feat_dict.has(feat_name);
170 return m_feat_dict.get_key(feat_id);
175 return m_feat_dict.get_id(feat_name);
192 size_t feat_mask_id = it->second;
198 return m_upos_dict.get_id(name);
204 return m_upos_dict.add_key(name);
209 return m_feat_dict.get_id(name);
214 return m_feat_dict.add_key(name);
237 morph_feats_t convert(
const std::string& upos,
const std::map<std::string, std::set<std::string>>& feats)
const;
239 template <
typename F>
242 auto upos_idx = m_feat_dict.get_id(
"upos");
243 assert(upos_idx != std::numeric_limits<size_t>::max());
244 auto upos_id = featid2value(upos_idx);
245 const std::map<std::string, std::set<std::string>> feats;
251 for (
const auto& kv : feats2mask )
253 const auto feat_id = kv.first;
254 if (feat_id == upos_idx)
259 size_t mask_id = kv.second;
263 size_t feat_value_id = featid2value(feat_id);
264 if (feat_value_id != std::numeric_limits<size_t>::max())
266 feat_value_id = feat_value_id << offset ;
Encoding on one 64 bits integer of the set of morphological features for one token.
bool operator==(const morph_feats_t other) const
bool operator<(const morph_feats_t other) const
morph_feats_t(feat_base_t val)
feat_base_t subvalue(feat_base_t mask, uint8_t offset) const
bool operator!=(const morph_feats_t other) const
const feat_base_t & toBaseType() const
morph_feats_t(const morph_feats_t &other)
void append(feat_base_t val)
Helper class for morphology data (upos, features) binarization.
size_t get_feat_idx(const std::string &feat_name) const
bool has_feat(const std::string &feat_name) const
const std::string & decode_upos_to_str(const morph_feats_t &feats) const
morph_feats_t convert(F featid2value) const
std::vector< std::map< size_t, size_t > > m_feats2mask
size_t get_feat_id(const std::string &name) const
size_t get_upos_id(const std::string &name) const
morph_feats_t convert(const std::string &upos, const std::map< std::string, std::set< std::string > > &feats) const
std::vector< uint8_t > m_offset
const std::vector< std::string > & get_feat_vec_ref(size_t feat_id) const
std::string to_string() const
const std::string & get_feat_name(size_t feat_id) const
feat_base_t decode_feat(const morph_feats_t &feats, size_t feat_id) const
feat_base_t decode_upos(const morph_feats_t &feats) const
size_t get_feats_count() const
size_t add_upos(const std::string &name)
size_t add_feat(const std::string &name)
std::vector< feat_base_t > m_masks
std::vector< dict_t > m_feats
std::string pretty_bits_to_string(const T arg)