- PVSM.RU - https://www.pvsm.ru -
Привет!
Я продолжительное время учу английский и хочется достичь идеала, но этот процесс не быстрый. На данный момент уровень моего английского позволяет мне довольно таки неплохо распознавать разговорную речь, но фильмы, пока, я смотрю всё так же с субтитрами. Даже без них, я уверен, в видео могут попадаться слова, которых я не знаю и хоть общий смысл будет понятен, мне всё равно захочется узнать, что это за слово.
Таким образом при просмотре фильма получается такой порядок действий:
Вроде бы достаточно неплохо, но утомляет. Хочется смотреть фильм беспрерывно, а если точно знаешь, что все слова будут знакомыми — отказаться от субтитров, слушать и заодно тренировать. Как я решил эту проблему, читайте дальше.
Вот так родилась идея для простого проекта, который я и реализовал. Т.к. большей частью я работаю с python, выбор пал на него. Изучив работу сайта я принялся за работу.
Первая мысль была проста: качаем весь словарь, регуляркой вытаскиваем весь текст из субтитров, сравниваем, выдаём пачку так называемых неизвестных слов. Но тут меня постигло фиаско. В английском языке есть такое понятие — lemma [1]. Разумеется в моём словаре lingualeo не все слова были в такой форме, совершенно точно не все слова такие в субтитрах. Погуглив я нашёл такую библиотеку, как nltk [2]. Вроде бы выход из положения, для получения 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 [3] откроется страница со словами. Их можно тут же игнорировать (добавлять в stopwords) или добавлять в активный словарь на Lingualeo. Я добавил ссылку на сохранение csv, если кому-то это нужно, use case: игнорируем ненужные слова, а нужные выгружаем в файл для импорта в тот же Anki. Перевод будет выбран тот, в котором максимум голосов.
Исходный код доступен по ссылке на github [4], если есть какие-то предложения, пожелания — добро пожаловать в комментарии или pullrequests/issues.
Спасибо за внимание :)
Автор: conformist
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/264888
Ссылки в тексте:
[1] lemma: https://en.wikipedia.org/wiki/Lemma_(morphology)
[2] nltk: http://www.nltk.org/
[3] localhost:5000: http://localhost:5000
[4] github: https://github.com/conformist-mw/subtitles-with-leo
[5] Источник: https://habrahabr.ru/post/339258/
Нажмите здесь для печати.