HuggingFace Transformers: BertTokenizer меняет персонажей

Я загрузил норвежскую модель BERT с https://github.com/botxo/nordic_bert, и загрузил его с помощью:

import transformers as t

model_class = t.BertModel
tokenizer_class = t.BertTokenizer

tokenizer = tokenizer_class.from_pretrained(/PATH/TO/MODEL/FOLDER)
model = model_class.from_pretrained(/PATH/TO/MODEL)
model.eval()

Это работает очень хорошо, однако, когда я пытаюсь токенизировать данное предложение, некоторые нордические символы, такие как ø и æ, остаются прежними, тогда как все слова с символом å заменяются на. Например:

s = "æ ø å løpe få ærfugl"
print(tokenizer.tokenize(s))

Урожайность:

['æ', 'ø', 'a', 'løp', '##e', 'fa', 'ær', '##fugl']

Спасибо


person Christian Vennerød    schedule 29.07.2020    source источник
comment
Когда вы проверите файл vocab.txt, вы увидите, что å не является токеном. Следовательно, токенизатор не может его произвести. å одно слово? Потому что å является частью других токенов.   -  person cronoik    schedule 29.07.2020
comment
Мне удалось решить эту проблему, å действительно был в файле voiceab.txt, так что проблемы там не было. Он работал с использованием BerttokenizerFast и установкой strip_accents = False. Похоже, что ошибка была в unicode.normalize в функции акцентов полосы :)   -  person Christian Vennerød    schedule 30.07.2020
comment
Когда я запускаю grep ^å vocab.txt, он ничего не возвращает. Это означает, что å отсутствует в файле vocab.txt.   -  person cronoik    schedule 30.07.2020
comment
Вы скачали и использовали норвежскую модель? Он основан на норвежских словах и иероглифах. Нажал ctrl f и обнаружил å в словаре, как ни странно   -  person Christian Vennerød    schedule 31.07.2020
comment
Конечно, å находится в файле vocab.txt норвежской модели (точнее, 975 раз), но это не означает, что это также единственный токен (т.е. запись словаря). Я также внимательно посмотрел на него и думаю, что он не полностью совместим с токенизатором huggingface, потому что предоставленный файл vocab.txt содержит только токены подслов (обозначенные ## TOKEN) и никаких отдельных слов (по определению записей huggingface, которые не запускаются с участием ##). Они также ссылаются не на hugginface, а на официальный google bert github, который имеет собственный токенизатор и использует тензорный поток.   -  person cronoik    schedule 31.07.2020
comment
Когда я выполняю print(tokenizer.tokenize(s)) с версией 3.0.2, он дает правильный результат в соответствии с приведенным выше объяснением: ['[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]']   -  person cronoik    schedule 31.07.2020
comment
Да, вы правы насчет файла vocab.txt. Я изменил формат этого файла, чтобы он соответствовал формату Huggingface, и это сработало. Файл Vocab.txt бесполезен, если кто-то этого не делает и хочет использовать его с bert из huggingface. Не буду тратить много времени на споры об этом, но токенизатор заменил все «å» на «a», но оставил все «ø» и «æ», пока я не установил для strip_accents значение false. Это не сработало, пока я этого не сделал.   -  person Christian Vennerød    schedule 05.08.2020
comment
Я также подтвердил это, запустив следующий код на моем собственном компьютере. text = unicodedata.normalize("NFD", text) и cat = unicodedata.category("Å") - взяты из исходного кода huggingface FastBertTokenizer ..   -  person Christian Vennerød    schedule 05.08.2020


Ответы (1)


Он работал с использованием BerttokenizerFast и установкой strip_accents = False. Похоже, что ошибка была в unicode.normalize в функции акцентов полосы.

  • Естественно, нужно изменить файл vocab.txt, чтобы он соответствовал формату токенизатора Bert.
person Christian Vennerød    schedule 30.07.2020