1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zhangyafeii-lstm-crf

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Простая модель BiLSTM-CRF для китайской идентификации именованных сущностей

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Вы можете ввести одно китайское предложение, и модель вернет результат распознавания:

demo_pic

ссылки

[1] Bidirectional LSTM-CRF модели для последовательного тегирования

[2] Нейронные архитектуры для распознавания именованных сущностей

[3] Символьные LSTM-CRF с радикальными признаками для распознавания именованных сущностей на китайском языке

[4] https://github.com/guillaumegenthial/sequence_tagging

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Модель LSTM-CRF для обработки естественного языка на языке программирования Python ```python import torch import torch.nn as nn from torch.autograd import Variable class LSTMCRFModel(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim, tagset_size): super(LSTMCRFModel, self).__init__() self.hidden_dim = hid... Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zhangyafeii-lstm-crf.git
git@api.gitlife.ru:oschina-mirror/zhangyafeii-lstm-crf.git
oschina-mirror
zhangyafeii-lstm-crf
zhangyafeii-lstm-crf
master