2 September 2008

ХабраЧист или Самооборона против неграмотности

HabrGreaseMonkey
Вот что делать с человеком, который на все упреки и призывы к грамотности
отвечает одним аргументом — «Мне по***»?

Крик души

Не любо — не слушай, а врать не мешай!
— Поговорка



1. Введение


Совсем недавно на Хабре бушевали топики с призывами к всеобщей грамотности и использованию спелл-чекеров. Похоже, это сезонное явление, и нынешнее затишье — временное. Часть хабраюзеров всегда будет уверена, что в тексте главное смысл, а не правописание; другую же часть всегда будут раздражать постоянные ашибки, которые мешают восприятию этого самого смысла. Так или иначе, увещевания последних мало что меняют, а наиболее популярные ответы на призывы к грамотности можно прочесть в эпиграфе.

В этой статье я предлагаю частичное решение проблемы грамотности на Хабре, которое даст каждой из сторон желаемое: одни смогут писать как хотят, а другие — читать Хабр, не «спотыкаясь» на ошибках. В отличие от других методов («читайте учебники»), описываемый подход имеет прямое отношение к IT и потребует меньше минуты для освоения (если сразу перейдёте к «Заключению»).

2. Мотивация


Причиной написания этой статьи стала «интуитивная» грамотность, благодаря которой меня, как и многих, раздражают тексты с обилием ошибок. Более того, в последнее время я стал замечать, что чувство языка, приобретённое в детстве за несколько диоптрий, из-за невостребованности начинает улетучиваться, причём без адекватного утоньшения очков.

Второй, более технически-прозаической причиной данной статьи послужило давнее желание разобраться с регулярными выражениями. А без интересной задачи изучать что-то попросту скучно, поэтому меня и посетила мысль написать ХабраЧиста :)

3. Подход


3.1. Техническая сторона


ХабраЧист — это java-скрипт с набором правил для обнаружения и исправления наиболее распространённых ошибок. Для работы скрипта требуется Greasemonkey, расширение для Firefox. Процесс установки и использования Greasemonkey уже описывался на Хабре. При желании, скрипт можно адаптировать и для Оперы.

После загрузки страницы, ХабраЧист применяет каждое правило по очереди к заголовкам и текстам топиков, а также к комментариям. Правила жёстко заданы в коде скрипта в виде регулярных выражений и представляют собой множество пар вида

"(ж|ш)ы" -> "$1и"

В левой части указано регулярное выражение, которое используется для поиска ошибки. Правая часть, в свою очередь, описывает, на что нужно заменить найденную ошибку. Например, приведённое выше правило соответствует школьному "жи-ши пишем через и". Вместо "$1" будет подставлено содержимое скобок в найденном совпадении, то есть буква «ж» или «ш». Причём, в данном случае неважно, будет это строчная буква или прописная — вставлена будет именно та, которая использована в исходном тексте. В тех же случаях, когда первая буква исходного слова и его замены не совпадают (например, «щаз» → «сейчас»), приходится дублировать правило и для слов, начинающихся с прописной буквы («Щаз» → «Сейчас»).

3.2. Сбор данных


Основная сложность задачи состояла в том, чтобы найти самые распространённые ошибки. Сначала я отправился снизу вверх по хабрарейтингу читать комментарии. Однако, оказалось, что большинство хабралюдей с альтернативной позицией имеет на зависть высокий уровень грамотности. Поэтому пришлось сменить тактику: взяв какое-нибудь произвольное слово а-ля «кажеться», я отправился в гугл искать комментарии хабраюзеров, которые предпочитают использовать именно это слово. Разумеется, зачастую в их текстах встречались и другие «слова нетрадиционного написания». Несколько интересных ошибок я (не без удивления) узнал из FAQ «Правописание в русском языке».
База правил пополнялась на протяжении всего периода тестирования.

/>3.3. Ограничения


Разумеется, предложенный подход может отследить только простые ошибки, которые можно обнаружить поиском в строке. Более сложные способы, вроде задавания вопросов «что делать? что сделают?» для глаголов на -ться и -тся, находятся за гранью возможностей регулярных выражений (однако специфические правила вроде «ються→ются» и «аеться→ается» выполняются всегда). Многие ошибки невозможно определить однозначно, например, слитное и раздельное написание «не» (сравните «некрасивый интерфейс» и «интерфейс не красивый, а ужасный»). Тем не менее, в данном классе ошибок встречаются такие, которые, будучи неоднозначными, тем не менее, гораздо чаще используются в ошибочном написании, чем в корректном. Например, очень распространено ошибочное написание слова «кстати» («К_стати, хотел тебе сказать…»), хотя пробел в нём может быть и оправдан («К стати принца не придраться»). В данном случае я исходил из предположения, что сотня устранённых ошибок стоит пары добавленных.

Распространённость той или иной ошибки оценивалась по результатам гугла, в некоторых случаях — яндекса. Этот метод не слишком точен, т.к. всего одна ошибка в заголовке статьи повторяется гуглом для каждого комментария. К сожалению, популярность некоторых ошибок невозможно оценить посредством поисковых систем, хотя опыт свидетельствует о высокой их встречаемости. К ним относится, в частности, неиспользование мягкого знака в глаголах 2-го лица настоящего времени («качаеш», «слушаеш»), так как гугл не позволяет искать по маске "*еш".

Ещё одно ограничение метода обусловлено самим подходом к сбору данных, многие ошибки попросту не были найдены. Это может быть быстро исправлено с вашей помощью: приводите в комментариях ошибки, которые мешают вам на Хабре, можно сразу в виде регулярных выражений.

4. Результат


Скачать ХабраЧиста можно c userscripts.org. Базовый набор из 157 правил исправляет более 70 тысяч ошибок из разных категорий: грамматические, сленг, олбанский, мат, и т.п.

Ниже приведён Топ-10 грамматических ошибок на Хабре.
Ошибка Правильно Количество1)
Всё таки, все таки всё-таки, все-таки ~50002)
Щас, ща сейчас ~4000
А так же а также ~3100
Незнаю, нехочу, немогу… не знаю, не хочу, не могу… ~3000
Чтото, что то, както, как то… что-то, как-то… ~29002)
Флэш флеш3) ~2800
Врядли, врятли, врят ли вряд ли ~2400
Не правильно, не правильный…4) неправильно, неправильный… ~2300
* ка (ну ка, дай ка…) *-ка (ну-ка, дай-ка…) ~18002)
Небыло, нибыло, небыл не было, ни было, не был ~1700
1) Цифры приблизительные, т.к. изменились на сотни в течение двух недель.
2) Т.к. гугл по запросу «всё таки» выдаёт, в основном, правильное написание «всё-таки», количество ошибок оценивалось следующим образом. Если на первой странице из десяти результатов встречается одно неправильное написание — принимаем среднее количество ошибок в 10%, и умножив общее количество результатов на 0.1 получаем оценку количества ошибок.
3) Предвидя возмущения, ссылаюсь на источник: Справочное бюро Грамота.Ру.
4) Пробел в данных случаях бывает нужен, но на Хабре употребляется чаще всего не к месту(смотри "Ограничения").

/>4.1. Тестирование


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

Наверняка вас интересует вопрос производительности многих десятков регулярных выражений при обработке сотен комментариев. Результаты приведены в таблице.
Место использования Время1)
Главная — Захабренные 1 с.
Топик с 142 комментариями 2 с.
Топик с 385 комментариями 5 с.
1) Тестирование проводилось на ноутбуке четырёхлетней давности (Pentium-M 1.6 ГГц, 1 ГБ оперативной памяти); время замерялось вручную, с округлением до ближайшей большей секунды.

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

/>4.2. Демонстрация


Для демонстрации возможностей скрипта, ниже приведён небольшой текст с большим количеством наиболее распространённых на Хабре ошибок. Сравните результаты с активным ХабраЧистом и без него.

Внимание! Текст составлен исключительно для тестирования ХабраЧиста, и может не совпадать с мнением автора.
Осторожно! Нижеприведённый текст может негативно повлиять на здоровую психику (чуть не свихнулся пока сочинял :)

Хуясе! Што делаеться-та, люди! Фсе кругом пишут не правельно.
Помоему, какойбы нибыл топик, там будет несколько ашипок. Например, какой небуть мудаг вывалит огромное кол-во букаф без проверки — не понятно никуя, мой моск ниасиливает черезчур многа неправельных букоф. Йа уж молчу про некоторых аццких далпаепов, пишущих чуш типа «в рот мне ноги!!!111одинадин» в каментах — таких надо жостка гнать накуй. Мне кажеться, есле уж пишеш — дык мож потрать ищо минуту на проверку, всётаки по лучше будет!
Хез, немогу етого понять.
И небуду. Пусть пишут как хотят, а читать йа буду как йа хочю :)

P.S. К стате, йа вот щяз попробывал писать с ашипками, ето же полный пистетс!
P.P.S. Ничё личного :) Извените есле чо нетак.


5. Заключение


В статье был представлен ХабраЧист — Greasemonkey скрипт для исправления грамматических ошибок на Хабре «на лету». Скрипт использует набор правил, основанный на регулярных выражениях. По приблизительным подсчётам, ХабраЧист устраняет более 70 тысяч ошибок правописания. Дальнейшее развитие проекта всецело зависит от ваших комментариев.

Благодарности



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

Отмазка. Как упоминалось в самом начале статьи, я не являюсь матёрым специалистом по регулярным выражениям (да и java-скрипту тоже). Конструктивная критика и советы по улучшению ХабраЧиста будут приняты с благодарностью.

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

UPD: ХабраЧист также работает с Safari+GreaseKit (как подсказал XuMiX) и Оперой (Инструменты > Настройки > Дополнительно > Содержимое > Параметры JavaScript > Файлы пользователя JavaScript, — указать папку в которой лежит js-файл. За how-to спасибо tequibo).
Tags:правописаниеХабраЧистgreasemonkeyрусский язык
Hubs: Habr GreaseMonkey
+104
908 23
Comments 174