Сегодня я вам расскажу о своем методе для изучения иностранных языков.

С чего начать изучение нового языка? Чаще всего люди на раннем этапе используют стандартный лексико-грамматический метод с доминированием письменного языка, который показал себя медленным и весьма скучным — вам чаще всего нужна зашкаливающая мотивация, чтобы не бросить где-то посередине.

Я предлагаю начать сразу с видео:

  • Видео просто интересно смотреть (особенно если это нормальные мультики/фильмы/сериалы, созданные для носителей языка).

  • Вы сразу начнете запоминать звучание слов, что очень сильно пригодится для развития навыка аудирования в будущем. 

Однако, если вы просто возьмете видео на новом для себя языке, то вы ничего не поймете. Первый шаг к решению проблемы — смотреть видео с субтитрами на языке оригинала. Однако, когда вы еще не знаете лексику языка, такие субтитры вам не помогут. Вам нужны двойные субтитры — на языке оригинала + перевод на ваш родной язык. 

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

Моя идея состоит в том, чтобы выполнить эту задачу вместо мозга и отображать субтитры как на картинке выше: посередине находятся субтитры на языке оригинала, ниже — их перевод; плюс над иностранными словами подписаны соответствующие им слова из перевода. Таким образом, за время просмотра десятка подобных фильмов/мультиков, каждое слово из базовой лексики будет многократно отображено вместе со своим переводом в текущем контексте, что позволит его запомнить.

Результаты

Для самых нетерпеливых — вот ссылки на папки в Google Drive с отрендеренными видео:

  • На английском. На момент написания статьи там только одно короткое видео: песня I will fly из My little pony. 

  • На французском. Сейчас там есть мультик Asterix and Cleopatra.

Формализация задачи матчинга

Чтобы отрендерить такие видео, нам нужно сначала решить задачу матчинга слов между двумя одинаковыми по смыслу предложениями на разных языках.

Наш алгоритм будет принимать два предложения: предложение T — на языке оригинала; предложение N — на родном/понятном для нас языке. N представляет собой перевод T.

Каждое из двух предложений мы будем представлять в виде списка токенов. Мы используем наш кастомный алгоритм токенизации, который не зависит от токенизатора, который используется нашей будущей ML-моделью. 

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

Рассмотрим пример:

T = “Now all you have to do is tighten the screw, and Bob's your uncle.”

N = “Теперь всё, что тебе надо сделать, это затянуть винт — и дело в шляпе.”

После токенизации получаем: 

N = [“Now”, “all”, “you”, “have”, “to”, “do”, “is”, “tighten”, “the”, “screw”, “and”, “Bob”, “is”, “your”, “uncle”, “.”]

T = [“Теперь”, “всё”, “,”, “что”, “тебе”, “надо”, “сделать”, “,”, “это”, “затянуть”, “винт”, “—”, “и”, “дело”, “в”, “шляпе”, “.”]

Алгоритм должен возвращать следующие результаты:

  • [“Now”] = [“Теперь”]

  • [“all”] = [“всё”]

  • [“you”] = [“тебе”]

  • [“have”] = [“надо”]

  • [“to”, “do”] = [“сделать”]

  • [“is”] = [“это”]

  • [“tighten”] = [“затянуть”]

  • [“the”, “screw”] = [“винт”]

  • [“and”] = [“и”]

  • [“Bob”, “is”, “your”, “uncle”] = [“дело”, “в”, “шляпе”]

Поставим одно ограничение: токены из списков со стороны T должны идти в исходном предложении подряд (потому что иначе сложно будет отобразить матчинг на видео). Например, если T = “Je ne sais pas”, N = “Я не знаю”, то комбинация “ne pas” в реальности соответствует “не”, но наш алгоритм такой результат выдать не сможет (между ne и pas затесалось sais). Однако, если мы перевернем задачу (T станет N, и наоборот), то тогда данный матчинг возможен (поскольку данное ограничение не распространяется на токены из N).

Идея

Для решения задачи будем использовать BERT.

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

Существуют BERT-модели, которые способны работать со множеством языков — как если бы существовал один “супер-язык”, который включает в себя лексику всех поддерживаемых языков.

Для решения нашей задачи мы будем использовать одну из таких мультиязычных моделей - LaBSE (language agnostic BERT sentence embeddings). Ее малая версия поддерживает 15 языков, а большая — аж 109.

Если мы пропустим оба наших предложения T и N через LaBSE и проанализируем эмбеддинги на одном из слоев (совершенно не обязательно на последнем), то те токены, которые друг другу соответствуют (у них похожий смысл, причем в контексте), будут иметь похожие эмбеддинги. Дальше нам остается только выявить эти похожие эмбеддинги.

Tokenization and embedding

Наш алгоритм принимает T и N, токенизированные нашим кастомным алгоритмом. Однако, LaBSE умеет работать только со “своими” токенами. Поэтому нам придется обработать каждый наш токен отдельно LaBSE-токенизатором и конкатенировать все токены в одну последовательность. Пропустим две таких последовательности (для T и для N) через LaBSE и извлечем эмбеддинги с одного из слоев.

Мы также должны сохранить информацию для каждого LaBSE-токена, из какого “изначального” токена он был получен. Чтобы не запутаться в разных видах токенов, будем дальше называть “изначальные” токены словами, а LaBSE-токены — токенами.

Matching

На предыдущем этапе мы получили 2 матрицы эмбеддингов: E(T) и E(N).

Если мы перемножим эти матрицы M = E(T) * E'(N): элемент M(i, j) теперь равен скалярному произведению эмбеддинга i-го токена из T и j-го токена из N. Скалярное произведение можно использовать как метрику расстояния.

Применим функцию softmax к каждой строке, сумма элементов строки будет равна 1.0, а они сами будут представлять собой своего рода "псевдовероятность" соответствия i-го токена из T каждому из токенов из N. Если мы сделаем то же самое для столбцов, то значения столбца будут показывать "псевдовероятность" матчинга токена из N с каждым из токенов из T. Мы будем использовать обе матрицы: "связность" между двумя токенами (один - из T, второй - из N) будет характеризоваться двумя значениями в диапазоне от 0 до 1: первое получено из матрицы softmax для строк, а второе - из матрицы softmax для столбцов.

Теперь для каждой пары слов из T и N нам нужно агрегировать значения их связности. Для этого для каждой пары слов мы формируем список значений связности, взятый из обеих матриц softmax - мы туда скидываем все элементы softmax-матриц, которые относятся к данной паре слов (в общем случае, это получается две непрерывные подматрицы). Затем получаем единое значение из элементов списка: я экспериментировал с этим, по итогу пока остановился на произведении среднего и максимального значений списка. Подытожим: после данного этапа у нас есть матрица значений связности между всеми словами из T и N.

Далее мы сортируем все пары слов по значению их связности (от наибольшего к наименьшему) и проходим по списку от его начала до конца и добавляем пары слов к результату работы алгоритма, если это возможно (таким образом, мы используем жадный алгоритм матчинга). Существует также определенный порог для значения связности, мы не будем добавлять пары слов со значением связности ниже него. Этот порог меняется динамически в зависимости от того, какой процент слов мы уже заматчили.

Однако, наш алгоритм должен уметь делать матчинг типа many-to-many. На каждом шаге мы сначала проверяем, может ли следующая пара слов присоединиться к одному из уже существующих результирующих пар списков. Чтобы присоединиться, пара должна удовлетворять двум условиям:

  • Она не должна нарушать условие, что списки со стороны T могут содержать только слова, идущие подряд

  • Пусть S - текущая сумма всех значений связности для списка, к которому хочет присоединиться эта новая пара. Значение связности между парой слов равно C. Условие состоит в том, что C должно быть больше, чем (S+C)*A. A — параметр "anti glue", который контролирует, насколько алгоритм будет склонен “склеивать” слова вместе. 

Если эти условия не выполняются, то новая пара образует свой собственный новый элемент в результирующем списке (и другие пары могут присоединиться к нему позже).

Рендеринг видео

Модуль для рендеринга видео с субтитрами принимает:

  • Собственно, само видео без субтитров.

  • Субтитры на языке видео. Добыть их — сложнее всего (особенно если видео не на английском).

  • Перевод субтитров. Реплики в переводе должны соответствовать репликам в оригинале (иметь те же таймстампы и тот же смысл). Перевод можно получить с помощью машинного переводчика (я использую для этого DeepL и, если видео не очень большое, поправляю результаты вручную). Зачастую, качественный машинный перевод подходит даже больше человеческого (потому что белковые нейросети иногда при переводе креативят, а алгоритму матчинга потом из-за этого страдать).

Для рендеринга видео я использовал библиотеку MoviePy: с ее помощью можно поместить на видео текстовый элемент в произвольную локацию (+ так, чтобы он “жил” в определенном диапазоне кадров).

Что делать, если контекстуальный перевод просто слишком длинный (например, если слову “use” соответствует “использовать”) и в результате подсказки начинают наезжать друг на друга? В таком случае самая длинная из них записывается в две строки, с переносом (см. картинку ниже).

Послесловие

Данный подход для изучения языка больше всего подходит для быстрого наращивания лексики на раннем этапе. Мозг просто бомбардируется примерами употребления слов в контексте с их переводом.

Кроме того, данные видео можно использовать и просто для развлечения. Если вам просто интересен определенный язык (например, потому что вы интересуетесь языками) и вы хотите в него окунуться — теперь вы можете просто открыть видео и наглядно видеть саму структуру речи.

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


  1. Cdracm
    06.11.2022 17:08

    Интересно. И как фильм смотрится с тремя субтитрами одновременно?


    1. einhorn Автор
      06.11.2022 17:16

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


  1. Pastoral
    06.11.2022 18:22
    +1

    Чем это сразу видно что плохо? Как на картинке - три варианта субтитров, это верная остановка видео чтобы прочитать.

    Когда это лучше чем просто смотреть с субтитрами? Когда не можешь на слух воспринять что сказано.

    Помогает ли это лучше воспринимать на слух? Нет, скорее мешает переключая внимание со слуха на зрение.

    Получается что? Чтение с оптимизированным пользованием словарём, где видео чтобы было интереснее, но тогда не проще ли книгу подобрать?

    Хорошо ли оптимизировать пользование словарём? Нет, когда обращение к словарю требует пошевелить пальцем, пытаешься догадаться по контексту и при успехе усвоение на порядок (два?) быстрее.

    А что помогает воспринять на слух? Типа Пимслер, песни текст которых находится легко, может ещё что, типа сперва посмотреть с субтитрами а потом без субтитров.

    Предложение: начать с чего-то из предыдущего абзаца и перейти к фильмам с субтитрами по достижении способности воспроизвести услышанное.

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


    1. einhorn Автор
      06.11.2022 18:53
      +1

      Чем это сразу видно что плохо? Как на картинке - три варианта субтитров, это верная остановка видео чтобы прочитать.

      Не надо останавливать видео. Да, на экране много информации, но ее не обязательно всю полностью читать и даже полностью усваивать. Ну, не получилось запомнить слово с первого раза - ничего страшного, оно встретится в видео еще и еще (причем, в разных контекстах). Вас бомбардируют информацией, и вы усваиваете сколько, сколько можете, и это нормально. По-моему, это гораздо лучше, чем "медленные" методы, где мозг работает не на полную мощность, потому что считается, что вы должны усвоить 100% информации.

      Помогает ли это лучше воспринимать на слух? Нет, скорее мешает переключая внимание со слуха на зрение.

      Еще как помогает. В голове постоянно выстраивается связь между звуковым и графическим обликом слов (что для языков со сложной орфографией типа английского или французского невероятно важно). Скорее, просто мозгу приходится больше напрягаться, одновременно обрабатывая и письменный язык, и устный. Да, развитие аудирования не настолько мощное, как если заниматься чистым аудированием.

      Получается что? Чтение с оптимизированным пользованием словарём, где видео чтобы было интереснее, но тогда не проще ли книгу подобрать?

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

      Хорошо ли оптимизировать пользование словарём? Нет, когда обращение к словарю требует пошевелить пальцем, пытаешься догадаться по контексту и при успехе усвоение на порядок (два?) быстрее.

      Категорически не согласен с идеей "Необходимость лишних телодвижений для получения информации приводит к лучшей ее запоминаемости. Усвоить что-либо можно только через боль.". Я считаю, что все строго наоборот - люди очень ленивы, и если нужно за каждым забытым словом лезть в словарь, человек сначала станет забивать на это (начнет использовать свои догадки вместо настоящих значений слов), а потом и вовсе забьет на язык.


    1. einhorn Автор
      06.11.2022 19:53

      Моя главная претензия к методу Пимслера с диалогами - это то, что он скучный, вам не интересны эти диалоги. В случае же с моим подходом вы сами выбираете видео (причем, выбор состоит из контента, который и призван развлекать людей).


      1. AigizK
        06.11.2022 21:52
        +1

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


      1. Pastoral
        07.11.2022 11:14

        Значит Вы поздно к нему обратились. Пимслер чрезвычайно интересен тем, что позволяет самостоятельно восстанавливать грамматику. Если грамматика уже как-то известна из других источников, то этот эффект пропадает.


  1. Un_ka
    06.11.2022 20:21

    Сколько времени занимает рерединг видео? То есть сколько секунд видео обработаются за секунду и на какой машине?

    Не думали поискать видеопроигрыватель с возможностью форматирования субтитров?

    Мне кажется, что для масштабирования поставленной задачи потребуется использовать какой-нибудь свободный проигрыватель дополненный функцией форматирования субтитров.


    1. einhorn Автор
      06.11.2022 20:36

      70-минутный французский мультик рендерился где-то 5 часов на CPU, на картинке характеристики машины.

      К сожалению, требование определенного плеера сильно уменьшит потенциальную аудиторию - людям будет лень идти и скачивать нужный плеер. Гораздо удобнее, когда видео можно посмотреть в чем угодно.

      У меня есть другая идея - отображать видео в браузере и помещать на него элементы-субтитры.


  1. medvedel
    06.11.2022 21:40

    В свое время включался км плейер который мог одновременно показывать двое субтитров...


    1. einhorn Автор
      06.11.2022 21:44
      +1

      Отобразить двойные субтитры - вообще не проблема.
      Даже если плеер это не поддерживает - просто берем и для каждой реплики приклеиваем к ней перевод через перенос строки.


  1. vat78
    09.11.2022 01:50

    Pazzle movies что-то подобное уже делает, вроде.


    1. einhorn Автор
      09.11.2022 02:03

      Сходство есть.

      Но Puzzle movies дает обычные двойные субтитры с возможностью кликать на слова для получения обычной (неконтекстуальной) словарной справки. Я всю статью объясняю алгоритм, с помощью которого я добавляю контекстуальные подсказки прямо над словами, в Puzzle movies такого нет.

      Плюс, мой алгоритм позволяет работать с любой языковой парой.