Статья для любителей НЛП и языков

Несколько месяцев назад Google AI предоставил открытый исходный код BERT, большой предварительно обученной языковой модели, которую можно легко настроить для решения общих задач НЛП, таких как классификация или распознавание именованных сущностей. Хотя проверка первоначальной английской модели была интересной, я очень обрадовался, когда вышла многоязычная модель, охватывающая 104 разных языка, включая немецкий, русский, арабский и японский. В голову пришли два вопроса: решает ли это сейчас все мои проблемы с немецким НЛП? И как именно одна модель может работать с таким количеством разных языков?

Перед тем, как передать в модель BERT входной текст разбивается на значимые части слова:
He's your dentist? --> He ' s your den ##tist ?
Специальные символы ## обозначают продолжение слова. Для английских примеров, которые я видел до сих пор, шпагаты всегда выглядели идеально. Мне казалось безумием сделать то же самое для 104 языков с разными алфавитами. Из любопытства я установил Реализацию BERT на PyTorch в Hugging Face, чтобы опробовать ее.

Честно говоря, я этого не ожидал. Ни -o, ни -ätzen не являются распространенными немецкими суффиксами, мне показалось, что слова разделены произвольно. Проверка кода токенизатора показала, почему:

  1. Базовая токенизация:
    Предложение разделяется пробелами (и знаками препинания. Китайские иероглифы обрабатываются как отдельные слова).
  2. Токенизация частей слова:
    Каждое слово разбивается на части, которые являются частью словаря BERT. Если слово в целом отсутствует в словаре, токенизатор ищет самый длинный префикс, который есть в словаре. Та же процедура проделывается с оставшимся концом слова.

Таким образом, немецкое слово Hallo не входит в словарный запас, а приставка Hall - хотя это и не немецкое слово, а (скорее всего) английское. ! Нет определения языка, токенизатор фрагментов слова может смешивать языки.

Базовая токенизация проста для тех языков, в которых слова разделяются пробелами - она ​​отлично сработала в моем немецком примере выше. Но как насчет языков без пробелов, например японского?

После выпуска многоязычной модели основной токенизатор был изменен не только для поиска пробелов и знаков препинания, но и для разделения китайских иероглифов. В японском языке используются китайские иероглифы, такие как, 日本語, но также используются двухсложные алфавиты (например, хирагана, は を い ま せ ん, как катакана, ス ペ ー ス) - последовательности слоговых символов здесь просто не разделяются. Базовый токенизатор не может должным образом разделять слова, если в языке не используются пробелы.

Опробование кода помогло мне осознать подводные камни токенизации BERT. И все же одного элемента все еще не хватало: как был собран словарный запас? Я был удивлен, обнаружив, что Hallo отсутствует в словаре, а имена вроде Hannah или Piotr и в общей сложности 2321 номер попали в Забавный факт: модель только для английского языка имеет размер словаря 28 996 токенов, в то время как многоязычная модель имеет "только" 119 547 токенов для всех языков вместе!

Ответ можно найти в этой статье за ​​2006 год:

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

Ага! Выбор словаря осуществляется на основе данных, поэтому возникает вопрос, на каких данных была обучена многоязычная модель BERT. По данным официального репозитория, использовался весь дамп Википедии для поддерживаемых языков. Разумеется, разные языки представлены в Википедии неравномерно, поэтому для языков с большим объемом ресурсов, таких как английский, выборка была недостаточной, а для языков с низким уровнем ресурсов - избыточной. Тем не менее, языки с большими Википедиями преобладают в обучающие данные и, следовательно, с большей вероятностью попадут в словарь.

Английская Википедия на самом деле более чем в два раза больше немецкой. Означает ли это, что в словаре слишком мало немецких слов для решения моих задач НЛП? Пора экспериментировать!

Этот код проверяет наличие заданного входного текста, сколько слов используется в словаре BERT, а сколько нет. Здесь, в omni: us, мы заботимся об анализе страховых документов - поэтому я решил использовать английский и немецкий текст из учебного набора BERT (статьи в Википедии о страховании ответственности / Haftpflichtversicherung ), а также фактический немецкий страховой документ в качестве входных данных.

Статья Страхование ответственности (на английском языке):

  • 5668 слов (например, страхование, риск, наложено)
  • 788 отсутствует в словаре (например, ответственность, жалоба, недостаточно)

Haftpflichtversicherung статья (на немецком языке):

  • 1236 в словаре (например, Kosten, Bedingungen, verpflichtet)
  • 579 отсутствует в словаре (например, Kriterien, Kfz, vertraglichen)

Страховой документ (немецкий):

  • 2941 в словаре (например, Beiträge, Beginn, jeweils)
  • 1151 отсутствует в словаре (например, Versicherung, Gesamtbetrag, beinhalten)

Немного погрузившись в тему, я пришел к выводу: токенизация многоязычных фрагментов слова сначала меня не убедила, так как я мог быстро найти примеры, которые не работали. Затем я пришел к мысли, что даже неточно размеченный текст может быть более легким вводом для модели, чем чистые символы или множество слов, не входящих в словарный запас. Авторы идеи словесного отрывка подтвердили мои мысли:

Этот метод обеспечивает хороший баланс между гибкостью моделей, разделенных на символы, и эффективностью моделей, разделенных на слова.

Ну, конечно, нереально ожидать, что предварительно обученная модель будет знать очень специфический словарь для любой предметной области и любого языка. Самое замечательное в многоязычном BERT: мы бесплатно получаем модель, которая уже понимает использование общих слов, таких как if, except, any, нет, чего очень трудно добиться для небольших наборов данных приложений. Сможет ли BERT также освоить сложный язык предметной области после тонкой настройки, еще предстоит увидеть. Думаю, стоит попробовать!