Существует шаг создания словарного запаса слов, который они пропускают.
По сути, вы создали карту из (не редких) слов в наборе для обозначений.Допустим, у вас есть 20 000 уникальных слов в вашем тренировочном наборе.Для каждого слова в обучающем наборе будет отображаться значение [0, 20000].
Тогда вектор признаков в основном представляет собой конкатенацию нескольких очень разреженных векторов, у которых 1 соответствует определенному слову, и19,999 0, а затем 1 для конкретного POS и 50 других 0 для неактивного POS.Обычно это называется горячим кодированием.http://en.wikipedia.org/wiki/One-hot
def encode_word_feature(word, POStag, char_type, word_index_mapping, POS_index_mapping, char_type_index_mapping)):
# it makes a lot of sense to use a sparsely encoded vector rather than dense list, but it's clearer this way
ret = empty_vec(len(word_index_mapping) + len(POS_index_mapping) + len(char_type_index_mapping))
so_far = 0
ret[word_index_mapping[word] + so_far] = 1
so_far += len(word_index_mapping)
ret[POS_index_mapping[POStag] + so_far] = 1
so_far += len(POS_index_mapping)
ret[char_type_index_mapping[char_type] + so_far] = 1
return ret
def encode_context(context):
return encode_word_feature(context.two_words_ago, context.two_pos_ago, context.two_char_types_ago,
word_index_mapping, context_index_mapping, char_type_index_mapping) +
encode_word_feature(context.one_word_ago, context.one_pos_ago, context.one_char_types_ago,
word_index_mapping, context_index_mapping, char_type_index_mapping) +
# ... pattern is obvious
Таким образом, ваш вектор пространственных объектов имеет размер около 100 КБ с небольшим дополнительным значением для тегов POS и char и почти полностью равен 0 с, за исключением 15 единиц в позициях, выбранных в соответствии с вашей функцией для сопоставления индекса.