Получить значение '[UNK]' в BERT - PullRequest
3 голосов
/ 12 февраля 2020

Я разработал модель на основе BERT для решения задачи NER. Я использую библиотеку transformers с предварительно обученной моделью "dccuchile/bert-base-spanish-wwm-cased". Проблема возникает, когда моя модель обнаруживает сущность, но токен '[UNK]'. Как я могу узнать, какая строка стоит за этим токеном?

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

Код действительно прост:

    sentenceIds = tokenizer.encode(sentence,add_special_tokens = True)

    inputs = pad_sequences([sentenceIds], maxlen=256, dtype="long", 
                              value=0, truncating="post", padding="post")

    att_mask = torch.tensor([[int(token_id > 0) for token_id in inputs[0]]]).to(device)
    inputs = torch.tensor(inputs).to(device)

    with torch.no_grad():        
        outputs = model(inputs, 
                          token_type_ids=None, 
                          attention_mask=att_mask)

Как видите, все очень просто, просто токенизируйте, дополняйте или усекайте, создавая ВниманиеМаска и вызывая модель.

I пытался использовать regex, пытаясь найти два жетона вокруг него и тому подобное, но я не могу решить это правильно.

1 Ответ

1 голос
/ 13 февраля 2020

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

tokenizer.basic_tokenizer.tokenize("Kočka leze dírou.")

Это дает вам: ['kocka', 'leze', 'dirou', '.']

На втором шаге применяется алгоритм разбиения по кусочкам слов, так что вы получите :

tokenizer.tokenize("Kočka leze dírou.")

Вы получаете: ['[UNK]', 'le', '##ze', 'di', '##ro', '##u', '.']

Если нет способа разделить токен на подслово, все слово становится [UNK]. Токены, начинающиеся с ##, добавляются к предыдущим, так что таким образом вы можете узнать, откуда появился [UNK].

(И мне кажется странным, что Spani sh WordPiece токенизатор не может разобрать слово, состоящее только из латинских букв.)

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