Как сформировать вектор признаков для классификатора, нацеленного на распознавание именованных объектов? - PullRequest
1 голос
/ 22 ноября 2011

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

Я наткнулся на эту статью: « Эффективные классификаторы векторов поддержки для распознавания именованных сущностей » Isozaki et al. Мне нравится идея использовать машины опорных векторов для распознавания именованных сущностей, но я застрял в том, как кодировать вектор объектов. Что касается их бумаги, вот что они говорят:

Например, слова «президент Джордж Герберт Буш сказал Клинтон является . , , »Классифицируются следующим образом:« Президент »= ДРУГОЕ,« Джордж »= ЧЕЛОВЕК НАЧИНАЕТСЯ, «Герберт» = ЛИЦО-СРЕДНИЙ, «Буш» = ЧЕЛОВЕК, «сказал» = ДРУГОЕ, «Клинтон» = ЛИЧНО, «есть» = ДРУГОЕ. Таким образом, первое слово в имени человека помечается как ЧЕЛОВЕК НАЧАТЬ. Последнее слово помечено как ЛИЦО-КОНЕЦ. Другие слова в имя ЧЕЛОВЕК-СРЕДНИЙ. Если имя человека выражено одно слово, оно помечено как ЛИЧНО-ЛИЧНОЕ. Если слово не принадлежат любым именованным объектам, он помечен как ДРУГОЙ. Так как 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 Ответ

4 голосов
/ 22 ноября 2011

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

По сути, вы создали карту из (не редких) слов в наборе для обозначений.Допустим, у вас есть 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 единиц в позициях, выбранных в соответствии с вашей функцией для сопоставления индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...