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

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

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

С машинным обучением проверка правописания стала сильно умнее, чем то, что раньше было в 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 июля в 05:30

Глянул, прикрутили ли они 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 комментарий

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

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

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

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

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

Смотрел и на 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 июля в 09:37

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

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

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

  Развернуть 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 июля в 08:32

Увы, для русского языка бесполезна, разве что опечатки в словах заменять, и то, только совсем явные (см.ниже), но это и так в ворде и браузерах встроено. Например, в первой части этого поста нашел как минимум 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 июля в 12:04

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

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

Я давно еще на Мак поставил приложуху FridayGPT - это по факту клавиатурный ассистент, который применяет промпты к выделенному тексту. Грамар чек и рерайт стали самым частым юзкейсом. Работает на удивление очень быстро (главное юзать простую модель), правда тербует АПИ ключ к ОпенАИ/Клауде. Я теперь вери флуент спикер в Слаке.
Топ за свои, реально лайфченджер. Намного удобнее того же Грамарли, который назойливо пихает свою иконку во все щели, но все же эта апка его полностью не заменила мне.
Писал об этой апке еще давно у себя в конале. Там еще есть код на скидос, сама апка не очень дорогая - 30 баксов.

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

@DJVagina, а не страшно отдавать закрытую переписку в облако? Тем более у OpenAI и Claude больше смысла реально запоминать, что у них спрашивают.

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

@sitnik, Ну в отличии от того же Грамарли, который чекает весь твой инпут по кд, тут ты ж сам управляешь, что отправлять. Но в целом я такой паранойей не страдаю)

  Развернуть 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 комментарий

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

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

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

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

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

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

😎

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

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


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