LanguageTool — проверка правописания как в Grammarly, но опенсорс, локально и с кучей языков

 Публичный пост
29 июля 2024  4486

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

С машинным обучением проверка правописания стала сильно умнее, чем то, что раньше было в Microsoft Word. Не просто описки в словах — но и ошибки в грамматике (типа неправильного склонения или забытого the).

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

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

Поэтому я хочу рассказать о крутой альтернативе Grammarly — LanguageTool:

  • Это такая же новая умная система проверки орфографии, которая подсказывает и по грамматике.
  • Её можно (с некоторыми ограничениями) запустить локально и быть уверенным, что никто не читает ваши переписки.
  • Она поддерживает кучу языков включая русский, украинский, белорусский, испанский, каталонский (привет, барселонские) и кучу ещё языков.
  • Её можно интегрировать в браузер, VS Code, Obsidian, vim.
  • Бо́льшая её часть — опенсорс. Тайный культ среди программистов будет доволен.

Да, она английский будет проверять хуже Grammarly (но не так сильно). Но для многих поддержка русского или испанского будет важнее. А важный текст на английском всегда можно загнать в Grammarly.

Пробуем

Если интересно, то так можно попробовать LanguageTool:

  1. На их сайте есть поле, куда можно вбить любой текст и посмотреть, насколько много ошибок она находит.
  2. Если понравилось, то можно поставить расширение в браузер (поддерживаются практически все) и в систему (Windows, Mac, iOS).
  3. Посмотрите список ПО, куда можно добавить LanguageTool. Например, там есть VS Code и vim.

Эти шаги включат проверку правописания в облаке — то есть они будут видеть, всё что вы пишите.

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

Запускаем локально

Облако — это просто чей-то другой компьютер. Зачем там запускать то, что вы можете запускать локально.

LanguageTool с открытыми исходниками, а значит мы можем запустить её локально. Это даст нам:

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

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

Я ставлю локально, а не использую Docker, так как большинство образов идут без fasttext — без него LanguageTool часто путает язык текста. Плюс образы часто устаревшие.

Инструкция будет для Fedora. Но по ней можно понять, что нужно делать в другом дистрибутиве Линукса или Windows и Mac.

LanguageTool становится умнее с огромными n-граммами — вероятностями появления сочетаний букв в языках. Посмотрите список на сайте и скачайте те языки, которые вам нужны.

mkdir -p ~/.local/share/ngrams
cd ~/.local/share/ngrams
wget https://languagetool.org/download/ngram-data/ngrams-en-20150817.zip
wget https://languagetool.org/download/ngram-data/untested/ngram-ru-20150914.zip
unzip ngrams-en-20150817.zip
unzip ngram-ru-20150914.zip
rm ngram*.zip

Наличие fasttext сильно улучшает автоопределение языка:

sudo dnf copr enable fcsm/fasttext
sudo dnf install fasttext
mkdir -p ~/.local/share/fasttext
cd ~/.local/share/fasttext
wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin

Для работы нужна будет Java:

sudo dnf install java-17-openjdk

Скачиваем сервер и ставим его в систему (он не обновляется сам и лучше повторять операцию раз в полгода):

wget https://languagetool.org/download/LanguageTool-stable.zip
unzip LanguageTool-stable.zip
rm LanguageTool-stable.zip
mkdir -p ~/.local/lib/languagetool
mv LanguageTool-*/* ~/.local/lib/languagetool
rm -R LanguageTool-*

Создаем файл настроек, где связываем компоненты. У меня он будет лежать в ~/.config/languagetool.properties:

languageModel=/home/ai/.local/share/ngrams
fasttextModel=/home/ai/.local/share/fasttext/lid.176.bin
fasttextBinary=/usr/bin/fasttext

Создаём юнит systemd, чтобы запускать сервер автоматически — ~/.config/systemd/user/languagetool.service:

[Unit]
Description=LanguageTool Server

[Service]
ExecStart=java -Xms512m -Xmx2g \
          -cp .local/lib/languagetool/languagetool-server.jar \
          org.languagetool.server.HTTPServer \
          --config .config/languagetool.properties \
          --port 8081 --allow-origin

[Install]
WantedBy=default.target

Включаем сервис:

systemctl --user enable --now languagetool.service

Открываем настройки всех расширений и меняем сервер с облака на localhost.

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

Аватар Андрей Ситник
Андрей Ситник @sitnik
Глава отдела фронтендаЗлые марсиане
📍Барселона, Испания

Когда-то давно написал Автопрефиксер и PostCSS для фронтенда. Сейчас живу в Барселоне и хочу положить конец монополии соцсетей.

Пишу много в Мастодон (секс-позитив, фронтенд, local-first):
https://mastodon.social/@sitnik_ru

Связаться через Телеграм:
https://t.me/sitnik

Остальные соцсети и проекты:
https://sitnik.ru/

Связанные посты
40 комментариев 👇
Anton Lebedevich Data Engineer | Machine Learning Engineer | AB-testing 29 июля 2024

Глянул, прикрутили ли они LLM, похоже, что только в облаке, а локально всё те же старые n-grams и fasttext. Они нормально справляются с опечатками в стиле fat fingers, но неправильный выбор слов не подсветят. Пользовался одно время LanguageTool, но забросил, т.к. n-grams занимают очень много места на диске и заметно тормозят при проверке.
Сейчас появилось несколько условно-опенсорсных LLM, которые работают локально на CPU, было бы любопытно что-то на их основе для локальной правки текстов попробовать

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

@mabrek, увы локальные LLM из коробки не будут иметь интеграции в браузер и IDE.

Но да, было бы интересно сделать какой-то проект на их базе.

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

@sitnik, вроде бы что-то шевелится в этом направлении https://medium.com/@anchen.li/replace-grammarly-with-open-source-llm-e1751ad6cad2 , надо подробнее потыкать

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

@mabrek, го пробовать вместе)

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

@mabrek, но, кстати, LanguageTool не просто опечатки ловит.

Например, в английском она показывает упущенные the или a. В русской ловит пропущенные запятые и неправильное склонение. В испанском заметит несогласованность или необходимость поставить прилагательное вперёд.

  Развернуть 1 комментарий
Ильяс Бакенов Lead of international logistics 29 июля 2024

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

@IlyasBkn, надо зарепортить :D

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

@IlyasBkn, ну так надо без ошибок писать:

  Развернуть 1 комментарий
Юрий Кашницкий Staff GenAI Field Solutions Architect 31 июля 2024

Смотрел и на languagetool, и на Grammarly в проекте по коррекции языка в статьях. К сожалению, у language tool было слишком много false positives. И по бенчмаркам, и субъективно Grammarly - state of the art пока. Мы еще смотрели на кучу сторонних решений, слушал штук 7 питчей. С LLM-ками все экспериментируют, но они слишком словоохотливы, порой могут все начисто переписать, где ты ждешь от них просто коррекции. Так что тут юзкейс больше как раз для специализированных DL-моделей и эвристик, а не LLM (что Grammarly и делает).

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

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

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

@vnkr, да, все верно. Перечитал пост :) автор все правильно пишет.

Для нашего кейса точность language tool не подошла. Но если для себя, чисто опечатки ловить - вполне может быть достаточно.

Пост годный, побольше бы таких.

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

@yorko, а как кстати вообще делают коррекцию при помощи LLM? Условно, если тебе нужно уменьшить perplexity, внеся минимум смысловых изменений, LLM которая будет генерировать предложение заново, плохо с этим справится же?

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

@marinegor, могу только про наш кейс сказать, не копал одновременно вширь и вглубь.

У нас уже был немалый параллельный корпус из оригинальных драфтов статей и корректированных людьми (scientific proofreading). Мы делали instruction fine-tuning и он, кстати, сильно докидывал в сравнении с простым промптингом. Но да, сложность в том, что LLM-ки идут вразнос, порой переписывают большие куски (даже если температуру в ноль выставить и детально в промпте описать, что делать).

Если правильно понял второй вопрос, это оно и есть - instruction fine-tuning (i.e. уменьшение перплексии) с детальным промптом. В целом решение перспективное, но я ни у кого не увидел успешных попыток провалидировать «словоохотливость» (verbosity) такого решения. Мы делали small-scale, кто-то делал с LLM as a judge. Сложилось впечатление, что пока это все же речь про специализированные DL-модели, а LLM - только интересный эксперимент.

Но это чисто наш кейс. Легко представлю сценарии, где verbosity ничуть не мешает, и там LLM-proofreading только в путь.

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

@yorko,

У нас уже был немалый параллельный корпус из оригинальных драфтов статей и корректированных людьми

повезло вам🥲

да, про второе -- всё так, только у нас нет параллельного корпуса, поэтому сильно сложнее.

  Развернуть 1 комментарий
Дмитрий Екимов Подмастерье Звукорежа 31 июля 2024

Из забавного, если вы живёте в Бранденбурге, то ваши налоги спонсировали разработку этого проекта. (но премиум вам бесплатно не дадут)

  Развернуть 1 комментарий
Valia Walsk Программист на bash 29 июля 2024

Спасибо! Но особое спасибо за заголовок поста. Это - идеальный заголовок. Все бы такие были.

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

Language Tool легко разворачивается на своем сервере в Docker. Можно и свой комп не ковырять, и получить (почти) все бенефиты сервиса не отдавая им свой текст.

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

@vnkr, а какой именно образ вы используете?

У меня была проблема, что они или не обновляются или там нет fasttext.

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

@sitnik, я вот на этом последние полгода примерно.
https://github.com/Erikvl87/docker-languagetool

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

@vnkr, ага, этот образ я знаю и использовал.

Там нет fasttext из-за чего он часто английский принимает за французский и т. п.

Я вон даже ишью завёл давно
https://github.com/Erikvl87/docker-languagetool/issues/70

Именно из-за fasttext я в итоге поставил LanguageTool без Docker.

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

@sitnik, issue продвигается судя по всему, вот уже PR даже есть: https://github.com/Erikvl87/docker-languagetool/pull/92

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

@MrModest, ну моему ишью уже год, хорошо что кто-то создал PR

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
Alex V ORM (интернет репутация) 31 июля 2024

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

А вот чатгпт нашел обе (1 и 5 пункт), и кроме того кое-где исправил выражения, хотя я не просил:

  1. "ошибки в грамматика" — правильно "ошибки в грамматике".
  2. "неправильного склонения или забытого the" — необходимо исправить на "неправильного склонения или забытого артикля the".
  3. "Она поддерживает кучу языков" — более корректно "Она поддерживает множество языков".
  4. "Бо‌льшая её часть — опенсорс" — корректнее "Большая часть её кода — опенсорс".
  5. "Но для многие поддержка русского или испанского будет важнее" — правильно "Но для многих поддержка русского или испанского будет важнее".
  Развернуть 1 комментарий


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

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

@MyDen, неа она как раз сильно полезнее проверки орфографии в браузере. Эти ошибки они пропустила (хотя реальных там только 2, остальные — вопрос стиля), но зато мне подсказал про многие другие ошибки спряжения и грамматики.

Например, подсказывает про запятые.

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

@sitnik, ну хз, с запятыми у меня как раз пример на скрине. Видимо рандом.

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

@MyDen, у тебя тесты не очень. «Очепятка» — словарное слово. Оно ищем пропущенные запятые, а не предлагает убрать лишние (так как в русском языке всегда можно надобавлять лишних, например твой пример — это норма если ты хочешь передать речь очень злого человека, который делает паузу после каждого слова).

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

@sitnik, а "влд" что за слово такое? Про лишние запятые даже перепроверил специально, может нововведения какие в русском языке, а я и не слышал. Нет, всё же лишняя запятая - это ошибка, и не передают так речь злого человека. У меня у самого раньше была проблема с ошибками по лишним запятым, и до сих пор проскакивает.
Вот еще пример сделал. Я почти не подбирал специально, просто написал что первое в голову пришло:

"В каких словах используется запитая, а где нет.
Привет, как дела?
Автор, а шибается когда говорит что я не прав. Здесь нет ни одно ошибки."

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

В целом, я не против, главное чтобы пользователю инструмент нравился. Мне понравилась идея и я прям загорелся, но когда попробовал - сильно разочаровался, мое ИМХО, что как инструмент проверки грамотности "по-серьезному" не подходит, а очень жаль. Да и не по серьезному тоже не особо как-то. Но наверное на английском всё лучше, я только русский тестировал.

  Развернуть 1 комментарий
Anton Lebedevich Data Engineer | Machine Learning Engineer | AB-testing 29 июля 2024

связанный проект недавно запостили https://vas3k.club/project/25144/

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Пробовал одно время. Советую DeepL/Write ещё попробовать.

RayCast мне это всё заменил.

Конечно, всё отправляется на сервер openai/Claude, ждём когда Эпл выпустит свой приватный AI наконец.

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

@npanov, подскажи, диплу можно скормить тонну текстовых файлов, чтобы он их просканил и нашел ошибки, или надо текст агрегировать? И умеет ли он в русский?

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

@mammuthus,

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

  2. Нет, только английский, немецкий, французский и испанский пока.

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

А вот мой яндекс-ко^WДокерфайл:

https://github.com/shaman007/Dockerfiles/tree/main/languagetool

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

@AndreyBondarenko, у тебя тоже нет fasttext из-за чего LanguageTool часто будет неправильно определять язык.

  Развернуть 1 комментарий
Ivan Mir indie app developer 31 июля 2024

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

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

@ivmirx, ну я тут делю текст на быстрый и важный.

Для быстрого важнее интеграция и чтобы всегда работало.

А важное письмо можно уже через LLM.

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

😎

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

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


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