python

Английские субтитры с Лео

  • среда, 4 октября 2017 г. в 03:13:41
https://habrahabr.ru/post/339258/
  • Python


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


Таким образом при просмотре фильма получается такой порядок действий:


  • смотрим
  • встречаем незнакомое слово
  • переключаемся на браузер, вкладку lingualeo
  • ищем слово, выбираем перевод, добавляем
  • смотрим фильм дальше

Вроде бы достаточно неплохо, но утомляет. Хочется смотреть фильм беспрерывно, а если точно знаешь, что все слова будут знакомыми — отказаться от субтитров, слушать и заодно тренировать. Как я решил эту проблему, читайте дальше.


Начало


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


Первая мысль была проста: качаем весь словарь, регуляркой вытаскиваем весь текст из субтитров, сравниваем, выдаём пачку так называемых неизвестных слов. Но тут меня постигло фиаско. В английском языке есть такое понятие — lemma. Разумеется в моём словаре lingualeo не все слова были в такой форме, совершенно точно не все слова такие в субтитрах. Погуглив я нашёл такую библиотеку, как nltk. Вроде бы выход из положения, для получения lemma нужно было передать аргументом глагол это или существительное. Как разобрать где что? Или придётся написать здоровенный велосипед или...


Неожиданная новость


Просматривая ответы сервера lingualeo я заметил, что в ответе есть lemma. Таким образом мне оставалось лишь сравнить искомое слово с lemma и если они совпадали — это точно то, что мне нужно, иначе — сделать ещё один запрос. Выход найден, можно заняться делом, но есть одно НО — существует ещё такое понятие, как stop words. Это слова, которые обычно игнорируются (don't, a, the, etc.). Эти списки гуглятся, они разных размеров и какой выбрать — непонятно. В расширенных списках, теоретически, могут попадаться такие слова, которые тоже необходимо выучить. А если моей наработкой захочет воспользоваться кто-то другой?


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


Первые шаги


Первая реализация основывалась на пачке json файлов, в которых я хранил текущий словарь пользователя, слова, которые пришли из субтитров с вариантами переводов, stopwords. Для добавления/перебора/игнорирования слов я решил сделать веб-страничку, чтобы наглядно можно было видеть что к чему. Проблема оказалась очевидной, выбранный мною Flask может и можно было научить пагинировать список новых слов (которых может быть из одного фильма и тысяча), но это не стоило тех трудовых затрат и во всём остальном в таком решении были только минусы, нежели плюсы, поэтому я с чистой совестью решил использоваться sqlite с помощью SQLAlchemy.


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


Как это работает?


Итак, при первом запуске нужно указать email и пароль, если они корректны, сохраним. Далее выкачиваем/обновляем словарь — он в lingualeo сортируется по дате, что крайне удобно, потому что с каждой новой страницей я сохраняю число добавленных слов в базу. Если оно равно 0, значит слова все сохранены, для уверенности качаем ещё пару страниц, если пусто — всё обновили.


Дальше, если указан текстовый файл, разбираем его. Сравнение со списком stopwords (слова, которые пользователь игнорирует) идёт 2 раза. В момент разбора текстового файла и потом, при получении lemma, если слова изменены. Сделано так, чтобы не насиловать лишний раз сервера :)


Кстати, выгруженный локально словарь можно сохранить в csv для импорта в Anki, если есть такое желание, нужно указать опцию --savecsv.


Для просмотра новых слов нужно запустить flask:


python3 server.py

Открыв localhost:5000 откроется страница со словами. Их можно тут же игнорировать (добавлять в stopwords) или добавлять в активный словарь на Lingualeo. Я добавил ссылку на сохранение csv, если кому-то это нужно, use case: игнорируем ненужные слова, а нужные выгружаем в файл для импорта в тот же Anki. Перевод будет выбран тот, в котором максимум голосов.


Заключение


Исходный код доступен по ссылке на github, если есть какие-то предложения, пожелания — добро пожаловать в комментарии или pullrequests/issues.
Спасибо за внимание :)