Как создать вектор функций для классификатора, ориентированного на распознавание имен имен?

У меня есть набор тегов (отличных от обычных имен, мест, объектов и т.д.). В моем случае они специфичны для домена, и я называю их: Entity, Action, Incident. Я хочу использовать их как семя для извлечения большего количества именных объектов.

Я наткнулся на эту статью: "Эффективные векторные векторы поддержки для распознавания именных имен" Исозаки и др. Хотя мне нравится идея использования Vector Vector Machines для выполнения распознавания имени и сущности, я зацикливаюсь на том, как кодировать вектор функции. Для их работы это то, что они говорят:

Например, слова в "Президент Джордж Герберт Буш сказал, что Клинтон..." классифицируются следующим образом: "Президент" = ДРУГОЙ, "Джордж" = ПЕРСОНАЛ, "Герберт" = ЧЕЛОВЕК СРЕДНИЙ, "Буш" = ЧЕЛОВЕК -END, "said" = OTHER, "Clinton" = PERSON-SINGLE, "is" = OTHER. Таким образом, первое слово имени человека обозначается как ПЕРСОНАЛЬНОЕ НАЧИНАНИЕ. Последнее слово обозначается как PERSON-END. Другие слова в названии PERSON-MIDDLE. Если имя человека выражается одним словом, оно обозначается как PERSON-SINGLE. Если слово не относится к каким-либо именованным объектам, оно обозначается как ДРУГОЙ. Поскольку IREX de- содержит восемь классов NE, слова классифицируются по 33 категориям.

Каждый образец представлен 15 функциями, потому что каждое слово имеет три функции (тег части речи, тип символа и само слово), а два предшествующих слова и два последующих слова также используются для контекстной зависимости. Хотя редко используемые функции обычно удаляются, чтобы предотвратить перенапряжение, мы используем все функции, поскольку SVM надежны. Каждый образец представлен длинным двоичным вектором, то есть последовательностью 0 (ложь) и 1 (истина). Например, "Буш" в приведенном выше примере представлен вектором x = x [1]... x [D], описанным ниже. Всего 15 элементов: 1.

x[1] = 0 // Current word is not ‘Alice 
x[2] = 1 // Current word is ‘Bush 
x[3] = 0 // Current word is not ‘Charlie

x[15029] = 1 // Current POS is a proper noun 
x[15030] = 0 // Current POS is not a verb

x[39181] = 0 // Previous word is not ‘Henry 
x[39182] = 1 // Previous word is ‘Herbert

Я действительно не понимаю, как строится бинарный вектор. Я знаю, что у меня отсутствует тонкий момент, но может ли кто-нибудь помочь мне понять это?

1 ответ

Существует мешок сложениями слова лексикон, который они пропускают.

В основном вы создаете карту из (не редких) слов в обучающем наборе для указателей. Скажем, у вас есть 20k уникальных слов в вашем учебном наборе. У вас будет отображение от каждого слова в наборе обучения до [0, 20000].

Тогда вектор признаков является в основном конкатенацией нескольких очень разреженных векторов, которые имеют 1, соответствующих определенному слову, и 19999 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 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

Таким образом, ваш вектор-функция имеет размер около 100k с небольшим количеством дополнительных значений для POS и char-тэгов и почти полностью 0s, за исключением 15 1s в позициях, выбранных по вашей функции для индексирования сопоставлений.

licensed under cc by-sa 3.0 with attribution.