Написал приложение для создания параллельных книг, которое вас удивит

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

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

title


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


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


Установка


Приложение я оформил в виде docker контейнера, поэтому запустить его у себя на машине не должно составить труда. Также можно запустить приложение из исходников, инструкция есть в репозитории.


Итак, для запуска приложения у себя на компьютере нужно выполнить следующие команды:


docker pull lingtrain/aligner:habr
docker run -p 80:80 lingtrain/aligner:habr

Контейнер скачается с репозитория Docker Hub и запустится на 80-м порту. Откроем приложение в вашем любимом браузере по адресу localhost.


Lingtrain app 1


Сделаем три шага: загрузка, выравнивание, генерация.


Демо


Для демонстрации возможностей приложения я записал видео:



Дальше немного подробностей, о том за что отвечает каждый шаг.


Выбор языка


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


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


Загрузка


На первой вкладке необходимо загрузить два текстовых файла, из которых мы будем делать книгу. Это обычные тексты, которые необходимо предварительно разметить. При помощи разметки мы определим строки, которые являются названиями глав книги, эпиграфами и другой метадатой, также мы сможем расставить адреса картинок в необходимых местах. Разметка в выравнивании не участвует. Язык разметки был реализован следующим образом — в конце необходимой строки ставится тег; в начале выравнивания все такие строки извлекаются с сохранением их координат. При генерации они преобразуются в html элементы и расставляются по своим местам.


Сейчас поддерживаются следующие метки:


Метка Значение Пример
%%%%%author. Автор Фрэнк Герберт%%%%%author.
%%%%%title. Название Дюна%%%%%title.
%%%%%qtext. Цитата Быстро — это медленно, но без перерывов%%%%%qtext.
%%%%%qname. Подпись под цитатой Японская поговорка%%%%%qname.
%%%%%image. Изображение https://ya.ru/image.png%%%%%image.
%%%%%h1. %%%%%h2. Заголовки (большой и поменьше) Глава 1%%%%%h2.
%%%%%divider. Разделитель (завитушка) %%%%%divider.

Ещё есть метки для абзацев, которые сохраняют структуру документа, но они расставляются автоматически. Таким образом, нужно привести тексты вот к такому виду:


Аркадий и Борис Стругацкие%%%%%author.
Понедельник начинается в субботу%%%%%title.

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

    Но что страннее, что непонятнее всего, это то, как авторы могут брать подобные сюжеты, признаюсь, это уж совсем непостижимо, это точно… нет, нет, совсем не понимаю.%%%%%qtext.
    Н. В. Гоголь%%%%%qname.

История первая. Суета вокруг дивана%%%%%h1.

https://habrastorage.org/webt/2m/5r/jd/2m5rjdep6ej2rna5rhfioluig1u.png%%%%%image.

Глава первая%%%%%h2.

    Учитель: Дети, запишите предложение: «Рыба сидела на дереве».%%%%%qtext.
    Ученик: А разве рыбы сидят на деревьях?%%%%%qtext.
    Учитель: Ну… Это была сумасшедшая рыба.%%%%%qtext.
        Школьный анекдот%%%%%qname.

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

Справа из леса вышли двое, ступили на обочину и остановились, глядя в мою сторону. Один из них поднял руку. Я сбросил газ, их рассматривая. Это были, как мне показалось, охотники, молодые люди, может быть, немного старше меня. Их лица понравились мне, и я остановился. Тот, что поднимал руку, просунул в машину смуглое горбоносое лицо и спросил, улыбаясь:

– Вы нас не подбросите до Соловца?

...

Все метки кроме автора и названия опциональные. Если оформление книги не важно, то можете просто поудалять из текста заглавия и эпиграфы, а метки не расставлять.


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


Lingtrain app 1


Для корректного оформления книги необходимо, чтобы количество соответствующих меток совпадало.


Выравнивание


На второй вкладке нужно выбрать загруженные ранее документы и посмотреть, насколько сильно отличается количество предложений. Если отличие в пределах 10%, то скорее всего это норма, — в зависимости от конкретного переводчика или языка у текстов могут быть различные тенденции деления по предложениям. Например, при переводе на китайский сложные предложения часто переводятся как несколько простых.


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


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


Настройки


Lingtrain app 1


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


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


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


Визуализация


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


Lingtrain app 1


Конфликты


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


Lingtrain app 1


Визуализация при этом также обновится.


Lingtrain app 1


Редактор


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


Выглядит редактор так:


Lingtrain app 1


Кнопки управления появляются при наведении на ячейку.


Lingtrain app 1


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


Lingtrain app 1


Подстрочник


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


Lingtrain app 1


Для этого надо скачать разбитый по предложениям текст, перевести его и загрузить обратно. Для перевода можно воспользоваться лайфхаком — открыть текст в браузере и перевести через функцию перевода странички. Такая функция, например, в Chrome предлагается автоматически.


Lingtrain app 1


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


Генерация


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


Книга


Прежде чем сгенерировать стилизованный html с книгой можно его немного настроить. Кроме выбора с какой стороны взять информацию о разбиении на абзацы, можно выбрать расположение текстов — какой слева, а какой справа. Также можно добавить подсветку соответствий предложений, выбрав стиль.


Lingtrain app 1


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


Lingtrain app 1


Параллельные корпуса


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


Lingtrain app 1


Скачать


Скачать результат можно в заключительной секции.


Lingtrain app 1


Эпилог


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


Код проекта открытый, приложение написано на Vue и Python. Идеи и предложения приветствуются. Спасибо за внимание.


Ссылки


  • Код проекта на github
  • Телеграм-группа
Источник: https://habr.com/ru/post/564944/


Интересные статьи

Интересные статьи

Node.js — удобная масштабируемая серверная платформа для работы с JavaScript. С помощью нее и различных поддерживаемых фреймворков, таких как Express,...
В Солиситорах (Solicitors), новом короткометражном фильме, снятым парой студентов-старшекурсников Университета Чапмана, все начинается с женщины, сидящей на диване и чита...
Всем привет! Не так давно на работе в рамках тестирования нового бизнес-процесса мне понадобилась возможность авторизации под разными пользователями. Переход в соответствующий р...
Всем привет! Меня зовут Саша, я сооснователь и по совместительству главный разработчик в Quarkly. В этой заметке я хочу рассказать о том, как концепция атомарного CSS, которой мы прид...
Если у вас есть интернет-магазин и вы принимаете платежи через Интернет, то с 01 июля 2017 года у вас есть онлайн-касса.