def _viterbi_decode(self, feats):
backpointers = []
# Инициализация
init_vvars = torch.full((1, self.tagset_size), -10000.).to(device)
init_vvars[0][self.tag_dictionary.index('O')] = 0
# Первая итерация
viterbi_vars, t = self._score_feats(init_vvars, feats[0])
backpointers.append(t)
# Остальные итерации
for feat in feats[1:]:
viterbi_vars, t = self._viterbi_step(viterbi_vars, feat)
backpointers.append(t)
# Выбор последнего состояния
viterbi_path = [viterbi_vars.argmax().item()]
for bptrs in reversed(backpointers):
bptrs = bptrs[:, viterbi_path[-1]].data
viterbi_path.append(bptrs.argmax().item())
# Обратный порядок
viterbi_path.reverse()
return viterbi_path[1:]
def _score_feats(self, vvars, feat):
vvars = vvars + (self.transitions + feat).view(1, -1)
return vvars, vvars.argmax(1)
def _viterbi_step(self, vvars, feat):
max_scores = Variable(torch.FloatTensor(1, self.tagset_size).fill_(0)).to(device)
for tag, score in enumerate(vvars[0]):
max_scores[0][tag], _ = torch.max(
self.transitions[tag, :].view(1, -1) + feat + score.view(1, -1), 1
)
return max_scores, max_scores.argmax(1)
def _log_sum_exp(self, tensor1, tensor2):
max_score = torch.max(tensor1, tensor2)
return max_score + torch.log(
torch.exp(tensor1 - max_score) + torch.exp(tensor2 - max_score)
)
def forward(self, sentence):
embeds = self.word_embeddings(sentence)
lstm_out, _ = self.lstm(embeds.view(len(sentence), 1, -1))
tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))
tag_scores = F.log_softmax(tag_space, dim=1)
return tag_scores
vocab_size = 10000 embedding_dim = 100 hidden_dim = 128 tagset_size = 10
model = LSTMCRFModel(vocab_size, embedding_dim, hidden_dim, tagset_size) Этот репозиторий включает код для создания очень простой модели BiLSTM-CRF на основе символов для задачи китайской идентификации именованных сущностей. Цель модели — распознавание трех типов именованных сущностей: ЧЕЛОВЕК, МЕСТО и ОРГАНИЗАЦИЯ. Этот код работает на Python 3 & TensorFlow 1.2 и следующий репозиторий https://github.com/guillaumegenthial/sequence_tagging мне очень помогает.
Эта модель похожа на модели, предоставленные в статьях [1] и [2]. Её структура выглядит как на следующем рисунке:
Для одного китайского предложения каждый символ этого предложения имеет / будет иметь тег, который принадлежит к множеству {O, B-PER, I-PER, B-LOC, I-LOC, B-ORG, I-ORG}.
Первый слой, слой поиска, предназначен для преобразования представления символов из вектора one-hot в эмбеддинг символов. В этом коде я случайным образом инициализирую матрицу эмбеддингов, и знаю, что это выглядит слишком просто. Мы можем добавить некоторые языковые знания позже. Например, выполнить токенизацию и использовать предобученные эмбеддинги на уровне слов, тогда каждый символ в одном токене можно инициализировать этим токеном. Кроме того, мы можем получить эмбеддинг символов, объединив низкоуровневые признаки (пожалуйста, посмотрите раздел 4.1 статьи [2] и раздел 3.3 статьи [3] для более подробной информации).Второй слой, BiLSTM слой, эффективно использует как прошлое, так и будущее входную информацию и автоматически извлекает признаки.
Третий слой, CRF слой, присваивает тег каждому символу в одном предложении. Если мы будем использовать Softmax слой для присвоения тегов, мы можем получить некорректные последовательности тегов, так как Softmax может присваивать теги только независимо для каждого позиции. Мы знаем, что 'I-LOC' не может следовать за 'B-PER', но Softmax об этом не знает. В отличие от Softmax слоя, CRF слой может использовать информацию о тегах на уровне предложения и моделировать поведение перехода между двумя различными тегами.
#предложений | #PER | #LOC | #ORG | |
---|---|---|---|---|
тренировка | 46364 | 17615 | 36517 | 20571 |
тест | 4365 | 1973 | 2877 | 1331 |
Это выглядит как часть MSRA корпуса.
python main.py --mode=train
python main.py --mode=test --demo_model=1521112368
Пожалуйста, установите параметр --demo_model
на модель, которую вы хотите протестировать. 1521112368
— это модель, обученная мной.
Официальный инструмент оценки: здесь (нажмите 'Instructions') Мои результаты тестирования:
P | R | F | F (PER) | F (LOC) | F (ORG) |
---|---|---|---|---|---|
0.8945 | 0.8752 | 0.8847 | 0.8688 | 0.9118 | 0.8515 |
python main.py --mode=demo --demo_model=1521112368
Вы можете ввести одно китайское предложение, и модель вернет результат распознавания:
[1] Bidirectional LSTM-CRF модели для последовательного тегирования
[2] Нейронные архитектуры для распознавания именованных сущностей
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )