Пользователь
0,0
рейтинг
11 июня 2014 в 13:08

Разработка → Решаем проблему грамотности в интернете с помощью Яндекс.Спеллера


«Если человек умер, он об этом не знает, только другим тяжело. То же самое, когда он тупой...»

И то же самое, когда он безграмотный.

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

А что, если подойти к этой проблеме с другой стороны? Как было бы здорово иметь такой браузер, который при открытии страницы проверял бы текст и исправлял все ошибки. Или хотя бы часть. Ведь, по правде говоря, ошибки воспринимаются по-разному: забытая запятая скорее всего останется незамеченной, в то время как какие-нибудь «извени» или «правельно» вызывают кратковременное бешенство.

Что будет, если перед чтением страницы пропустить ее через фильтр и исправить орфографию, наподобие того как adblock режет рекламу?

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

Тогда зачем эта статья, если ничего не получилось?


Отрицательный результат — тоже результат. Эту статью я пишу по двум причинам:
Во-первых, чтобы следующий человек, которому придет эта идея в голову, не изобретал все с нуля, а мог опереться на мои результаты.
А во-вторых, вдруг найдется человек, который сможет развить эту идею дальше.

Реализация


Реализация проста — я написал букмарклет (wiki). Загружаем страницу, нажимаем на букмарклет — запускается js-скрипт, который проверяет орфографию и исправляет ошибки.

Для проверки орфографии я использовал прекрасный сервис — Яндекс.Спеллер — api.yandex.ru/speller (Условия использования сервиса «API Яндекс.Спеллер» — legal.yandex.ru/speller_api ).

Замена выполняется на первое предложенное сервисом слово.

Имеется ограничение — запрос не должен превышать 10000 символов. Учитывая то, что 1 русская буква — это 6 символов в URL-encoded виде (буква «а» — это %D0%B0), то получается существенное ограничение. Весь текст приходится разбивать на несколько фрагментов. Для средней страницы какого-нибудь форума приходится выполнять десяток-другой запросов.

Для тех, кто хочет испытать скрипт на себе, исходный кодссылка на bitbucket.

То же самое, но в одну строчку:

javascript:(function(){function main(){var text=document.body.innerHTML;text=text.replace(/<.*?>/g," "),text=text.replace(/[^а-яА-ЯёЁ]/g," "),text=text.replace(/\s+/g," ");var fragments=splitByLimit(text,1e4);for(var i=0,len=fragments.length;i<len;i++)checkAndReplace(fragments[i])}function splitByLimit(text,limit){var fragments=[],words=text.split(" "),fragment=[],fragmentLen=0;for(var i=0;i<words.length;i++){var word=words[i];fragmentLen+word.length*6>limit&&(fragments.push(fragment.join(" ")),fragment=[],fragmentLen=0),fragment.push(word),fragmentLen+=word.length*6+3,i==words.length-1&&fragments.push(fragment.join(" "))}return fragments}function checkAndReplace(text){var xhr=new XMLHttpRequest;xhr.onreadystatechange=function(){this.readyState==4&&(xhr.status==200?(data=JSON.parse(xhr.responseText),replaceWords(data)):console.log(xhr.status))},xhr.open("GET","http://speller.yandex.net/services/spellservice.json/checkText?options=7&text="+text,!0),xhr.send()}function replaceWords(data){if(!data)return;var body=document.body.innerHTML;for(var i=0,len=data.length;i<len;i++){var subst=data[i];if(subst.s.length!==0&&subst.word.length>4){var replacement='<span style="background-color: #cfc">'+subst.s[0]+" </span>";replacement+='<span style="background-color:#fcc"><span>'+subst.word.split("").join("</span><span>")+"</span></span>";var regexp=new RegExp(subst.word);body=body.replace(regexp,replacement)}}document.body.innerHTML=body}main()})();


Чтобы попробовать, нужно создать закладку в браузере и в поле URL вписать этот код.

Результаты


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

Вот несколько примеров.

Красным выделены исходные слова, зеленым — на что заменилось.

Пример 1:



Пример 2:



Пример 3:



Но, к сожалению, не все так радужно. Есть и обратная сторона — ложные срабатывания. Кажется, их даже побольше, чем исправленных ошибок. Особенно это заметно на тематических сайтах с переизбытком всяких терминов и сленга (как Хабр, например).

Пример 4:



Пример 5:



Этот факт огорчает и сводит на нет все плюсы от использования скрипта.
Но все же надеюсь, что кому-то мои эксперименты оказались полезными.
Дмитрий @amidart
карма
47,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (44)

  • +6
    Камасутру гамасутру — ровный спеллер!
  • +10
    судя по исправлениям, таки орфограф наци, а не граммар наци, знаете ли.
    чисто орфографические исправления бесполезны, имхо.
    • +8
      Да, только орфография.
      У всех разная степень грамотности. За себя скажу — орфографические ошибки раздражают намного сильнее. Пунктуация не очень беспокоит (только если автор вообще запятые не ставит и пишет в одно предложение)
      • 0
        Мне кажется, если не замахиваться на 100% исправление текста, можно получить результаты гораздо лучше.

        Во-первых, ограничиться стандартным лексиконом и словарем типичных школьных ошибок, игнорируя сленг. Во-вторых, возможно, подумать в сторону продвинутых эвристик. Определить стиль текста; исходя из этого, оценивать вероятность и допустимость замены слов-кандидатов. Скажем, в тексте официально-делового стиля маловероятно появление слов «мобы», «фармить» и прочих упячек. И наоборот, если мы имеем дело с комментарием из соц сети, то тут спелчекер должен быть особенно осторожен. Плюс ограничить исправления в цитатах и выделенных словах.

        Понятное дело, что это не позволит полностью избавиться от ошибок, но это может значительно снизить их число.

        P.S.: Еще бы научиться автоматически исправлять хронические проблемы с «-тся/-ться». Цены бы не было бы такому чекеру.
        • +4
          На самом деле, исправлять -тся/-ться в 100% случаев очень нетривиально, так как для этого нужно делать достаточно сложный анализ контекста. Вот простой прмер:
          Тебе не спится.
          Тебе бы не спиться.

          А иногда из контекста нужно даже смысл выдёргивать:
          Как учиться, так и веселиться.
          Как учится, так и вселится. (Здесь подразумевается неявное местоимение «он»)

          Но:
          на самом деле, около 65% (проверял на «Войне и Мире») слов с -тся/-ться на конце в принципе существуют только в одной форме (например: прислушиваться/прислушивается, захочется/захотеться, любоваться/любуется ...). И вот тут нам приходит на помощь Я.Спеллер. https://bitbucket.org/a_kazakov/bookmarklet-webpage-ru-spellchecker/src — форк кода автора исправляющий только -тся/-ться в таких случаях.
          Он же в минифицированном виде:
          javascript:(function(){SHOW_SOURCE=false;function b(){var k=document.body.innerHTML;k=k.replace(/<.*?>/g," ");k=k.replace(/[^а-яА-ЯёЁ]/g," ");k=k.replace(/\s+/g," ").trim();var j=k.split(" ");j=d(j);var i=a(j,10000);c(i,function(m){m=m.map(g);var l=m.filter(function(q){return q.found});var o=m.filter(function(q){return !q.found});var n=o.map(function(q){return q.to});var p=a(n,10000);c(p,function(q){var r={};n.forEach(function(s){r[s]=true});q.forEach(function(s){r[s.word]=false});good_corrections=o.filter(function(s){return r[s.to]});l=l.concat(good_corrections);f(l)})})}function g(j){var i;if(j.word.slice(-3,j.word.length)=="тся"){i=j.word.slice(0,-3)+"ться"}else{i=j.word.slice(0,-4)+"тся"}return{found:(j.s.indexOf(i)!=-1),from:j.word,to:i}}function e(j){j=j.sort();var l=0;for(var k=0;k<j.length-1;++k){if(j[k]!==j[k+1]){j[l++]=j[k]}}j[l++]=j[j.length-1];return j.slice(0,l)}function h(i){return i.match(/ть?ся$/)!==null}function d(j){var i=e(j);return i.filter(h)}function a(p,k){var j=[],l=[],o=0;for(var m=0;m<p.length;m++){var n=p[m];if(o+n.length*6>k){j.push(l.join(" "));l=[];o=0}l.push(n);o+=n.length*6+3}if(o!=0){j.push(l.join(" "))}return j}function c(i,j){queries_left=i.length;result=[];if(i.length==0){j([])}i.forEach(function(l){var k=new XMLHttpRequest();k.onreadystatechange=function(){if(this.readyState==4){if(k.status==200){result=result.concat(JSON.parse(k.responseText));if(--queries_left==0){j(result)}}else{console.log(k.status)}}};k.open("GET","https://speller.yandex.net/services/spellservice.json/checkText?options=7&text="+l,true);k.send()})}function f(o){if(!o){return}var j=document.body.innerHTML;for(var k=0;k<o.length;++k){var m=o[k];var l='<span style="background-color:#cfc">'+m.to+"</span>";if(SHOW_SOURCE){l+='<span style="background-color:#fcc">'+m.from+"</span>"}var n=new RegExp("([^а-яА-ЯёЁ]|^)"+m.from+"(?!=[а-яА-ЯёЁ])","g");j=j.replace(n,"$1"+l)}if(document.body.innerHTML!=j){document.body.innerHTML=j}alert("Replaces:"+o.length)}b()})();
          
          • 0
            исправлять -тся/-ться в 100% случаев очень нетривиально
            Разумеется, я потому и вынес это в постскриптуум, что задача очень нетривиальная и контекстно-зависимая.
      • +1
        Вопрос о том, кого что именно раздражает — весьма субъективный. Но сама проблема, на самом деле, чуть шире, и это ясно без эксперимента.
        Объективную проблему составляют люди, которые не безграмотно пишут, а не умеют формулировать свои мысли вообще. Это похоже своим результатом на безграмотность, потому что влечет за собой жуткую пунктуацию, но ни один робот не превратит «поток сознания» в осмысленный текст. Косметически можно причесать любой кошмар (можно даже научить робота разбирать жаргон, например), но вернуть письменной мысли смысл он, очевидно, не сможет.
  • –15
    Имхо тем, у кого грамматические ошибки «вызывают кратковременное бешенство» нужно прежде всего работать над собой.
    • 0
      Я, конечно, немного преувеличиваю, но если вы более-менее грамотны, то можете попробовать себя в этой роли:
      habrahabr.ru/post/204196/
      • +1
        К чему это? Я имел ввиду, что ярость вырабатывает кортизол и разрушает нас изнутри, поэтому если чьё-то поведение вызывает в ком-то бешенство — это прежде всего проблема бешеной стороны.

        Паработаю нимнога сирийным убийцей тех, хто асуждает других сам имея массу праблем, хатя бы с самокантролем :)
        • 0
          хто асуждает других сам имея массу праблем
          О, это из серии «сперва добейся»? :)
          Мол, чтобы говорить, что еда невкусная, поди сначала готовить научись!
        • +3
          У меня же есть защита:
          • 0
            И у меня =)

            image
          • 0
            хто
            хатя бы
            bullet_hits_Neo.gif
            К сожалению, на всех гифках до пули, зацепившей Нео, дело не доходит :)
      • –9
        Честно — никогда не понимал людей которых раздражают до бешенства ошибки в тексте… Хотя, возможно, я привык читать на высокой скорости и не могу находить ошибки читая не" побуквенно" и «посложно» а фрагментами предложений. Так что тут два плюса и нервы целы и информацию из текста получаю быстрее ;)
        PS: текст из ссылки я например прочитал совершенно спокойно (после пары секунд привыкания), без нервов — как обычны текст — просто одна из «разновидностей» текста ниже (только на других принципах):
        «По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, все-рвано ткест чтаитсея без побрелм. Пичрионй эгото ялвятеся то, что мы чиатем не кдаужю бкуву по отдльенотси, а все солво цликеом.»


        PPS: habrahabr.ru/post/148896/
        • +3
          Ну тагда ничо страшнаго, можите не ставить это допалнение.
        • +3
          Приведённый текст, кстати, жульничество сплошное :) Полный беспорядок, как же :) Вот, попробуйте прочитать:

          По рататьлузем иинаводелссй огондо агоксйилгно утетисревина, не иеемт зинечаня, в кокам пкдярое рнежолопсаы бвкуы в своле. Гонвале, чботы паврея и пянделсоя бвкуы блыи на мтсее, оыньлатсе бвкуы мугот ставодель в понлом бкдяропсее, все-рнвао тскет чстеатия без пелборм. Поничирй эгото ястеялвя то, что мы не чеатим куджаю бвкуу по отсоньледти, а все своло цокилем!
          • +2
            Если помнишь примерно оригинальный текст, этот читается без проблем)
        • +6
          У меня наоборот — когда быстро читаю и встречаю орфографическую ошибку, то сбиваюсь, так как мне начинает казатся, что это я допустил ошибку при чтении и прочитал слово не так.
  • +3
    Возможно, есть смысл для некоторых распространенных ошибок задать правила вручную. Так, в 99% случаев на Хабре мы получим корректное исправление, сделав следующие автозамены:
    что бы --> чтобы
    в течении --> в течение
    пол (раздельно) --> пол (слитно) (пр. полтонны)
    андройд --> андроид
    (\d+)-(х|ти) (пробел) --> /1- (без пробела) (пр. 50-тонный)

    Орфография — еще как бесит! Частая ошибка — «незакрытые» запятые, что кажется странным для Хабра, ведь логически фраза «Программа, написанная на Javascript не требует компиляции» соответствует коду вроде
    <a href="http://site.com title="oops>
    • 0
      что бы --> чтобы
      Протестую! Вариант «что бы» зачастую вполне правильный. Например, как в «что бы вы ни делали».
      • +1
        Так у меня все примеры «ошибок», кроме одного, могут и не быть ошибками. Поэтому я и говорю — «в 99% случаев». Потому что по ощущениям словосочетание «что бы» в значении «что бы» встречается в 99 раз реже, чем в значении «чтобы».

        P.S. Я там, кстати, описался — вместо «орфография» надо читать «пунктуация».
    • +2
      андройд --> андроид
      Войнам андройдов даже пальцы отрубать бесполезно. Если человек так пишет — значит, он так и произносит. Если человек говорит войн или андройд в устной речи — его просто хочется выбросить из окна высокой башни.
      • –1
        простите, ни разу не хотел про политегу, но некоторые жители западных окраин так пишут, потому что в их родном наречии… в-общем, бардак с буквой И
  • 0
    А есть что-нибудь подобное для пунктуации? Хотя бы на уровне API?

    Проверка орфографии, конечно, это хорошо, но такая возможность есть во всех современных браузерах без всяких букмарклетов.
    • 0
      Это вы, наверное, про проверку орфографии вводимого текста говорите. А в статье речь идет про проверку всего контента на странице. В каком браузере есть такое?
      Про пунктуацию — нет, не слышал.
      • 0
        Это есть во всех современных браузерах:

        javascript:document.body.contentEditable='true';document.designMode='on';void 0
        

        ПКМ -> выбираем нужный словарь.
        • 0
          И зачем оно такое, с нерабочими ссылками, нужно?
          • 0
            Ссылки открываются через ctrl+клик, shift+клик, среднюю кнопку мыши, меню правой кнопки мыши — способов более чем предостаточно.
            • 0
              Только по правой кнопке мыши, но это неудобно, однако. Chrome 35.
        • 0
          И все же цель была не подсвечивать ошибки, а наоборот, хотелось их не видеть совсем. Хочется читать текст без ошибок. В браузерах такого функционала нет.
    • +2
      Сам спросил, сам нашёл (вспомнил, что модуль грамматической проверки в LibreOffice с открытым исходным кодом) — wiki.languagetool.org/integration-on-websites.

      Как-то так
    • +1
      есть просто сервис проверки пунктуации orfogrammka.ru/
  • +7
    Решаем проблему грамотности в интернете с помощью Яндекс.Спеллер
    Названия в русском языке склоняются. Так нам проблему грамотности не решить…
    • +2
      ок, засчитано :)
  • +1
    Давно уже использую собственноручно написанное расширение, которое заменяет IMHO или ИМХО на нормальный текст «по моему мнению».

    При этом текст читается намного приятнее.

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

    Таки нет. Заметили!
  • +1
    Резюме: замены мозгу пока нет. И не надо.
  • +1
    Кстати говоря, очень классная штука для проверки собственных текстов. Отлично подсвечивает ошибки — удобно править.

    Спасибо!
    • 0
      Тут нужно уточнить, что подсвечиваются только слова, для которых есть замена.
      Но можно чуть подправить скрипт, чтобы подсвечивать все подозрительные для Яндекса слова.
  • 0
    Коллеги, а почему бы не сделать не автоматический, а ручной привод? В значительной мере может помочь — где не нужно, ничего не срабатывает, а если вы наблюдаете явно кривое написание — кнопку нажали, оно поправилось. Здесь же напрашивается исправление только выделенного текста: пишет человек на форуме криво, а остальные нормально — выделяем только кривые сообщения, жмем исправить — профит. И это можно даже просто открывать в неком своем окне, а не перечитывать уже загруженную страницу.
  • +1
    Может быть, после этого поста добавят подобный функционал в Яндекс-браузер.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.