Проект: vocabular.io — частотные словари текстов на иностранном языке  Публичный пост
27 августа 2022  1481
ОХУЕННО ⨯2
vocabular.io - частотные словари текстов на иностранном языке

Привет.

Несколько лет назад я написал сервис vocabular.io. Ключевые фичи сервиса:

  • строит частотный словарь текста
  • хранит личный словарь пользователя
  • считает статистику по словарям


Сейчас есть возможность загрузить тексты на английском или испанском языках. Поддерживаемые форматы файлов: txt, srt, pdf, epub. Есть встроенный тренажер для запоминания слов. Для тех, кто хочет погонять слова, например, в anki, есть экспорт в csv.

Ниже немного из истории проекта.

Идея

Я люблю читать книги. Беда в том, что нередко книги не переводятся на русский язык, а если переводятся, то с задержкой в год+ после релиза в оригинале. В определенный момент у меня накопилось несколько таких книг и появилось сильное желание их прочитать. Но читать книгу, заглядывая в словарь для почти каждого слова,- такое себе занятие. Так в 2015 году возникла идея сервиса.

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

  1. Большую часть top слов я уже знаю, но среди них иногда проскакивают незнакомые, поэтому просто отсекать top 1000/2000/3000+ для каждой книги - не совсем корректно. Нужна возможность хранения уже отсмотренных слов, чтобы для нового текста не было необходимости обрабатывать их заново.
  2. Одно и то же слово может повторяться в списке в разных формах (например, begin и begins). Во-первых, нет желания обрабатывать одно и то же слово несколько раз, во-вторых, не совсем честно считать для них частоту по отдельности, т.к. слово, по сути дела, одно.
  3. В языках есть устойчивые выражения и фразы. В английском, например, очень распространены фразовые глаголы, поэтому в случае give up правильней считать частоту для всего глагола, а не для give и up по отдельности.

Сперва я хотел сделать небольшие утилитки, которые решали бы указанные проблемы, но затем подумал, что такой инструмент мог бы быть интересным для кого-то еще, и имеет смысл сделать online версию.

Реализация

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

В 2015 году у меня был опыт в основном в Java мире и хотелось использовать уже имеющиеся знания. В то время Grails выглядел как хороший инструмент для быстрой разработки на Java стэке. На нем, собственно, и была реализована первая версия сервиса, но некоторые время назад у меня выкроилось немного свободного времени и я переписал все на Kotlin + Spring Boot + Postgres + React.

Инфраструктура:

  • собирается и запускается руками в Docker на DigitalOcean
  • CloudFlare
  • AWS CloudFront в качестве CDN для отдачи озвучки слов

Весь основной код лежит в открытом доступе:
https://github.com/vanzay/wiktionary-utils
https://github.com/vanzay/text-analyser
https://github.com/vanzay/vocabulario-utils
https://github.com/vanzay/vocabulario-api
https://github.com/vanzay/vocabulario-frontend

Трудности

Одной из основных задач, которые я поставил перед началом реализации: не использовать NLP-библиотеки, заточенные на какой-то конкретный язык, даже если эти библиотеки дают хорошие результаты. Я хотел сделать решение, которое можно было бы использовать для любых (или большинства) языков, чтобы при добавлении нового языка не было необходимости делать новые исследования и сильно дорабатывать ядро системы. В результате решил строить индекс слов для языка и с помощью этого индекса обрабатывать тексты. Возник вопрос: где взять хороший словарь для разных языков (желательно бесплатный или не очень дорогой)? После ресерча самым оптимальным решением оказалось использовать wiktionary.org, для парсинга которого было написано несколько утилит.

Следующей проблемой было достать где-то переводы слов. В качестве решения был написан скрипт, выгружающий переводы из Google translate (пришлось поразбираться с обходом защиты, т.к. прямые запросы блокировались гуглом). Для связки английский-русский гугл работает сносно, но для языков, отличных от английского, качество сильно падает. Поэтому для испанского я сделал выгрузку уже из reverso.net.

Еще одной проблемой было взять где-то озвучку слов. В итоге, часть слов была выгружена с forvo.com, а то, что там отсутствовало, было синтезировано штатным TTS в Windows, который был выбран из-за простоты и доступности, хотя качество сгенерированного аудио оставляет желать лучшего.

Outro

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

27 комментариев 👇

Крутая фича была бы: выгрузить слова для изучения в Anki карточки (или в csv файл). Они специализируются на spaced repetition, там внутри много логики для долгосрочного запоминания

  Развернуть 1 комментарий

@tchourko, в личном словаре есть выгрузка в csv, там можно выбрать необходимые слова из списка и выгрузить их

  Развернуть 1 комментарий

@vanzay, Круто! Попробую

  Развернуть 1 комментарий

Очень крутая идея! Я учу испанский (с английского) и мне пару месяцев назад как раз очень хотелось что-то похожее найти, но еще запаренное на правильные интервалы для повторения слов. Пока нашла lingvist.com и уже пару месяцев плачу им по 10 баксов (FYI про монетизацию :).

Несколько рандомных мыслей:

  • лингвист не сортирует слова по частоте когда книжку загружаешь, и мне кажется это оч крутая фича
  • очень круто бы комьюнити библиотеку иметь из готовых карточек по книжкам
  • кроме книжек, супер круто было бы иметь словарики для сериалов / фильмов (из субтитров), потом что с ними та же самая проблема (и эту проблему никто не решает в отличие от текстов, хотя с субтитрами это то же самое)
  • в лингвисте, если я с первого раза правильно отвечаю на новую карточку, платформа считает что это слово я уже знаю, так очень быстро апп учит мой текущий словарный запас (сейчас около 2тыс слов для референса)
  • для меня киллер фича лингвиста что он в контексте предложений слова показывает на карточках (и еще очень удобно что говорит род, время, и тд. в подсказке), но было бы круто если бы предложения были из контекста книги
  • учить отдельно say | says | said для меня наоборот фича, потому что много irregulars, ну и вообще ближе к тому что я в книге вижу
  • фича которой нигде нет - для людей которые знаю несколько языков показывать переводы карточки на них всех (потому что например испанский иногда переводится в русский лучше чем в англ, а иногда наоборот)

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

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

В общем надеюсь что-то полезное :)

  Развернуть 1 комментарий

@gilevskaya, Спасибо, отзыв реально полезный.
По некоторым пунктам:

  • субтитры (в srt формате) сейчас можно загружать в сервисе, и, в целом, можно любой текст (в txt формате) загрузить
  • контекст для слов - это то, что мне самому не хватает сейчас в vocabular.io, наверно, надо возобновить разработку этой фичи
  • про say | says | said по отдельности; с одной стороны согласен, что для неправильных глаголов лучше разделять, но, с другой стороны, в том же испанском для правильных глаголов по несколько десятков форм, поэтому пришел к компромиссу: слова добавляются в личный словарь пачкой, а пользователь если хочет, то уже сам может конкретное слово добавить на изучение
  • переводы сразу на нескольких языках - интересная фича, надо подумать над этим
  • тренажер слов делался скорее как доп. фича, чтобы, не отходя от кассы, можно было погонять слова
  • для подсказок в тренажере есть вот такая логика
    if ((mode === "memory" && items[0].memoryProgress < 50)
      || (mode === "audition" && items[0].auditionProgress < 25)) {
      applyHint(false);
    }

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

  Развернуть 1 комментарий
Георгий Синельников , Начинающий режиссёр монтажа 29 августа в 13:55

Блин, шикарная идея. Мне очень актуально. Мне кажется, стоит развивать, прикрутить монетизацию и дело пойдёт. Ну и на Product Hunt попробовать запулить.

  Развернуть 1 комментарий

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

  Развернуть 1 комментарий

@return_none, чешский, к сожалению, пока не поддерживается, сейчас только английский и испанский

  Развернуть 1 комментарий

@vanzay, вот это главный фатальный недостаток ;(

но идея отличная, ждём экспансии в другие языки

  Развернуть 1 комментарий
Захар Кириллов , Амбассадор ЕРАМ в Клубе 27 августа в 11:40

Чувствую себя глупым — зарегался, попробовал, но ничего не понял :(

  1. Правильно ли я понял, что я выбираю книжку, просматриваю список слов от самых частых к самым редким (а это, на минуточку, 5000+ слов на книжку) и относительно каждого слова я должен как-то понять — знаю я его или нет? То есть только на анализ и подготовку к учебе уйдут... часы.
  2. Если я решил, что я этого слова не знаю (слово скажем находится на 300-й позиции, к которой я пришел 10 раз кликнув на Show more, то я добавляю его в Add for studying? Для этого надо проскроллить страницу в самый верх.
  3. Но при этом я никак не могу узнать значение незнакомых слов, потому что колонка переводов у меня состоит из прочерков. Даже если я пойду сам в Гугл Транслейт, посмотрю там перевод, то я никак не могу его сохранить прямо в In my vocabulary. Это, как я понял, можно сделать только из Dictionary?
  4. Когда я иду в Репетишен, сбивается кодировка и я не вижу слова (у меня последний хром):

  1. Примеров использования слова в составе предложений, где оно появлялось у автора, нет? Очень жаль — как раз то, что я искал: посмотреть, как автор использует слово, в каком контексте.
  2. Я добавил в Vocabulary слово Say, а в Dictinary у меня появились: said, say, sayed, says, sayth. Я вообще не понимаю, что такое sayed и sayth — перевода нет, контекста тоже. Как они оказались в словаре?
  3. ОК, я добавил переводы ручками в Dictionary, но когда я вернулся в книжку и смотрю там Vocabulary — переводов по-прежнему нет.

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

  Развернуть 1 комментарий

@zahhar, ты попробуй язык, в котором у тебя словарный запас хуже. Мне кажется, это не слишком полезная тулза для языков, которые ты неплохо знаешь.

  Развернуть 1 комментарий

@zahhar, 1. На первую книгу может уйти достаточно много времени, но как раз это и есть одна из задач, которую я пытался решить. После того, как пользователь обработает слова из первой книги, эти слова попадают в личный словарь, и при обработке следующей книги эти слова уже не нужно будет просматривать заново. Можно немного схитрить и для первой книги top 1000 слов (или больше) сразу добавить в известные, не совсем честно, но сэкономит время.
Если словарный запас почти нулевой или наоборот очень хороший, то этот сервис, наверно, не будет очень полезным.

  1. Как эффективней обрабатывать слова из книги:
  • загрузить книгу
  • пройти по списку top 100, выбирать все что знаете и отправить эти слова в знакомые
  • потом нажать галку "Select all" (выберутся оставшиеся из top 100) и отправить их в незнакомые
  • затем нажать на "Show more", тогда загрузится следующие top 100
  • и т.д.
  1. Насколько я понял, в браузере нет русской локализации, поэтому автоматом подключается английская. По этой причине нет переводов слов (прочерки). Свои переводы можно добавить только в Dictinary. В планах было добавить переключение локализации, но руки так и не дошли до этого.

  2. Кодировка в Репетишен не съехала, "???" показываются когда у слова нет перевода. Логичней тоже показывать прочерк, поправлю, чтобы не смущало.

  3. Примеры использования слова в контексте - это была одна из основных фич на развитие проекта. Но пока тоже руки не дошли.

  4. В частотном списке показываются только базовые формы слов, но при добавлении в словарь добавляются сразу и словоформы. sayed и sayth это устаревшие формы глагола, в словаре они появились, т.к. словарь по большей части сгенерирован автоматически https://en.wiktionary.org/wiki/say#Conjugation

  5. То, что личные переводы не отображаются в книге,- это недоработка. Гляну как время будет.

  Развернуть 1 комментарий

@vanzay, оу, спасибо за такой подробный ответ.

У меня в браузере русский есть, но он не первый язык. Список языков: немецкий (он же язык интерфейса), английский, эстонский, русский.

Сделаю тогда ещё один подход, когдаесли появится настойка локали.

  Развернуть 1 комментарий
Ruslan Urmeev , девелопер-андроид 29 августа в 08:23

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

  Развернуть 1 комментарий

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

У меня есть два предложения в беклог:

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

Сорри, если очень очевидные идеи. У меня есть опыт с NLP (правда на питончике), так что буду рада ещё побрейнштормить на тему улучшения сервиса, если вдруг будет такое желание.

  Развернуть 1 комментарий

Есть похожий проект, которым давно пользуюсь - https://wordsfromtext.com Его киллер-фича в том, что он не просто строит словарь, а позволяет загрузить текст и читать его, размечая незнакомые слова и показывая перевод in-place.
Энивей, автору - респект, особенно за опенсурс.

  Развернуть 1 комментарий

@nbayborodin, классный ресурс, спасибо! Недостаток – только англ.

  Развернуть 1 комментарий
Yury Katkov , миддл формошлёп 27 августа в 08:52

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

  Развернуть 1 комментарий

@ganqqwerty, спасибо

  Развернуть 1 комментарий
Nikita Petrov , Главный по жалобам 27 августа в 11:30

ахуенно, надо мобилку делать

  Развернуть 1 комментарий

😱 Комментарий удален его автором...

  Развернуть 1 комментарий
Eugene Dmitrenko , Lead of infrastructure security 27 августа в 13:10

Это очень круто! А скушает он вместо книги файл с сабами от фильма/сериала?

  Развернуть 1 комментарий

@f0x1sland, да, srt файлы поддерживаются

  Развернуть 1 комментарий

@vanzay, огонь, пошел пробовать

  Развернуть 1 комментарий
Efim Luboshnikov , Делаю аномали детекшн тулз 29 августа в 14:16

😱 Комментарий удален его автором...

  Развернуть 1 комментарий

А как тебе такая версия монетизации?

Ты можешь предложить существующим владельцам контента(от O'Reilly до Netflix предлагать интеграцию с аккаунтами твоих пользователей).

Короче, мне очень нравится эта идея)

  Развернуть 1 комментарий

@Vagabond, да, если монетизацию прикручивать, то интеграция с контент-сервисами - это, наверно, самый рабочий вариант

  Развернуть 1 комментарий

Нет ли в планах добавить польский?

  Развернуть 1 комментарий

@geo81, пока не планировал

  Развернуть 1 комментарий

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб