Метод командной строки для поиска повторяющихся опечаток с номерами строк

Обновлено : Уточнение номера строки, некоторые сокращения слов

В командной строке есть способ:

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

чтобы помочь исправить их?

Пример 1

В настоящее время, чтобы помочь закончить статью или другую часть английского письма, aspell -c text.txt полезен для обнаружения орфографических ошибок. Но не полезно, когда ошибка является непреднамеренным последовательным повторением слова.

highlander_typo.txt :

 There can be only one one. 

Запуск aspell :

 $ aspell -c highlander_typo.txt 

Вероятно, поскольку aspell – это средство проверки орфографии, а не средство проверки грамматики, поэтому повторные опечатки слов за пределами его предполагаемой возможности. Таким образом, результат заключается в том, что этот файл проходит проверку aspell , потому что ничто не является «неправильным» с точки зрения индивидуального правописания.

Правильное предложение: There can be only one. , вторая – непреднамеренная оговорка повторяющегося слова.

Пример 2.

Но другой ситуацией является, например, kylie_minogue.txt :

 La la la 

Здесь повторение не опечатка, поскольку они являются частью песни исполнителя.

Таким образом, решение не должно допускать и «фиксировать» что-либо само собой, иначе оно может перезаписать преднамеренные повторяющиеся слова.

Пример 3: Многострочный

jefferson_typo.txt :

 He has has refused his Assent to Laws, the most wholesome and necessary for the public good. He has forbidden his Governors to pass Laws of immediate and and pressing importance, unless suspended in their operation till his Assent should be be obtained; and when so suspended, he has utterly neglected to attend to them. 

Изменено из Декларации независимости

В приведенных выше шести строках,

  • 1: He has has refused должен быть, He has refused , второй – это повторное слово опечатки
  • 5: should be be obtained должно быть, should be obtained , второе – это оговорка повторного слова

Однако вы заметили третье повторение слов?

  • 3: ... immediate and
  • 4: and pressing ...

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

Предполагаемый выход

  • интерактивная программа с процессом, подобным aspell -c но способным обнаруживать повторяющиеся слова или,

  • сценарий или комбинацию команд, способных извлекать номера строк и предполагаемые повторяющиеся слова. Эта информация упрощает использование редактора, такого как vim для перехода к повторяющимся словам и, при необходимости, исправления.

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

 1: has has 3: and 4: and 5: be be 

или:

 1: He [has has] refused his Assent to Laws, the most wholesome and necessary 3: He has forbidden his Governors to pass Laws of immediate [and] 4: [and] pressing importance, unless suspended in their operation till his 5: Assent should [be be] obtained; and when so suspended, he has utterly 

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

Но я надеюсь, что, как и выше, это показывает:

  • номер соответствующей исходной строки ввода
  • каким-то образом обратить внимание на то, что повторяется, особенно полезно, если строка текста также довольно длинная.
  • если отображается полная строка, чтобы дать контекст (кредит: @Wildcard), тогда должен быть способ каким-то образом сделать повторяющееся слово или слова отчетливо. Пример, показанный здесь, обозначает повторение, заключая их в символы ASCII [ ] . Альтернативно, возможно, имитировать grep --colors=always чтобы раскрасить совпадения строк для отображения в цветовом терминале

Другие соображения

  • текст, должен оставаться в виде текстовых файлов
  • нет графических решений, пожалуйста, просто текстовые. ssh -X X X11 не надежно доступна и нуждается в редактировании по ssh

Неудачные попытки

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

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

 $ tr ' ' '\n' < highlander_typo.txt There can be only one one. 

К сожалению:

 $ tr ' ' '\n' < highlander_typo.txt | uniq -D 

Ничего.

Это связано с тем, что для опции -D , которая обычно показывает дубликаты, вход должен быть точно дублирующейся строкой. К сожалению, период . в конце повторяющегося слова это отрицает это. Это похоже на другую линию. Не уверен, как я буду работать с произвольными знаками пунктуации, такими как этот период, и как-то добавить их обратно после обработки tr .

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

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

  • простой стол поворота скрипта
  • Как получить сервис, который гарантирует, что программа будет работать?
  • Использование in / out именованных каналов для TCP-соединения
  • Выполнять независимые greps в одном сценарии оболочки
  • Исправлено ли исправление shellshock bash базовыми инструментами командной строки, такими как echo и cat?
  • В то время как цикл с результатом от функции - BASH
  • Вызов команды подзаголовка с загруженным rcfile
  • Альтернатива для jq в debian wheezy для синтаксического анализа json в bash
  • 6 Solutions collect form web for “Метод командной строки для поиска повторяющихся опечаток с номерами строк”

    Отредактировано: добавлена ​​установка и демонстрация

    Вы должны позаботиться, по крайней мере, о крайних случаях, например

    • повторяющиеся слова в конце (и начале) строки.
    • поиск должен быть нечувствительным к регистру, из-за частых ошибок, таких The the apple .
    • вероятно, вы хотите ограничить поиск только компонентом слова, чтобы не соответствовать чему-то вроде ( ( a + b) + c ) (повторяющиеся открывающиеся круглые скобки.
    • только полные слова должны совпадать, чтобы устранить the thesis
    • Когда речь заходит о человеческом языке, символы Unicode внутри слов должны правильно интерпретироваться

    В целом я рекомендую решение pcregrep :

     pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' file 

    Очевидно, что цвет и номер строки (опция n ) являются необязательными, но обычно приятны.

    устанавливать

    В дистрибутивах Debian вы можете установить через:

     $ sudo apt-get install pcregrep 

    пример

    Запустите команду на jefferson_typo.txt чтобы увидеть:

     $ pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' jefferson_typo.txt 1:He has has refused his Assent to Laws, the most wholesome and necessary 3:He has forbidden his Governors to pass Laws of immediate and and pressing importance, unless suspended in their operation till his 5:Assent should be be obtained; and when so suspended, he has utterly 

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

    • имеет
    • а также
    • а также
    • быть

    Вы должны заглянуть в команды почтенной diction(1) и style(1) . Они ловят множество бу-бо. Появились новые версии (GPLv3 здесь, на Fedora 23).

    устанавливать

    Например, в дистрибутивах на основе Debian установите пакетную diction , которая включает в себя style :

     $ sudo apt-get install diction 

    По крайней мере, в Fedora это:

     $ dnf install diction 

    Red Hat Enterprise (и клоны), вероятно, необходимо:

     $ yum install diction 

    В любом случае, это происходит из пакета GNU выше по течению, называемого diction , поэтому его следует называть почти везде.

    пример

     $ diction jefferson_typo.txt jefferson_typo.txt:1: He has [has] refused his Assent to Laws, the [most] wholesome and necessary for the public good. jefferson_typo.txt:3: He has forbidden his Governors to pass Laws of immediate and [and] pressing importance, unless suspended in their operation till his Assent should be [be] obtained; and when [so] suspended, he has utterly neglected to attend to them. 2 phrases in 2 sentences found. 

    Pros

    • ловит повторяющиеся слова, среди прочего

    Cons

    • вводит [] метки для элементов, не связанных с повторяющимися словами. Например, [so] , вероятно, отмечен, потому что его можно считать посторонним в Elements of Style by Strunk . См. man diction
    • указанное число не всегда является номером строки исходного ввода, но вместо этого является номером строки, с которого начинается предложение. Например, [be] является исходной строкой ввода 5, но здесь она показывает 3 только потому, что [be] является частью предложения, начинающегося в строке 3 . Так что это немного отличается от того, что вы хотели

    Это будет печатать строки (с именем файла и номером строки) с повторяющимися словами:

     for f in *.txt; do perl -ne 'print "$ARGV: $.: $_" if /\b(\w+)\W+\1/' "$f" done 

    Для многострочного сопоставления есть это, но вы теряете номера строк, потому что это фрагментируется в файле по абзацам (это эффект от опции -00 ). \W+ между двумя словами означает любые символы «не-слова», включая символы новой строки.

     perl -00 -nE ' @matches = /\b((\w+)\W+\2)/g; while (@matches) { ($match,$word) = splice @matches, 0, 2; say "dup: $match"; } ' jefferson_typo.txt 
     dup: has has dup: and and dup: be be 

    Вот что я закончил:

     tr '[:space:]' '\n' < highlander_typo.txt | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | uniq -D 

    Я считаю, что это синтаксис GNU tr .

    Поскольку вы отметили этот вопрос awk , почему бы просто не использовать awk ?

     $ awk ' BEGIN{RS=FS="\\W+"} $0==t{printf("%s:%s\t%s %s\n", FILENAME, FNR, t, $0)} {t=$0} ' *.txt highlander_typo.txt:6 one one jefferson_typo.txt:3 has has jefferson_typo.txt:29 and and jefferson_typo.txt:42 be be kylie_minogue.txt:3 la la 

    Я не сохранил новую jefferson_typo.txt в jefferson_typo.txt потому что это не визуально полезно для меня, но вы можете настроить на свой вкус.

    В качестве дополнения к ответу vonbrand re: инструмент командной строки 'diction'

    Если вы хотите искать только повторяющиеся слова и отключать другие элементы стиля, вы можете сделать что-то вроде этого:

     diction -n file_to_scan.txt --file empty_file.txt 

    Флаг -n указывает ему игнорировать встроенный список слов. Однако он не будет работать без списка слов, поэтому --file empty_file.txt , где empty_file.txt является пустым файлом, дает ему список нулевых слов.

    Итак, единственное, что он делает, это распознавание повторений слов.

    Interesting Posts

    Использование exec и tee для перенаправления журналов на stdout и файл журнала в одно и то же время

    В Gedit, как я могу перейти из командной строки (нижний кадр) в фреймворк файла в рамку текстового редактора с помощью сочетаний клавиш

    Каков самый простой способ проверить, имеют ли значения столбца A и B оба пути с AWK?

    Не удается установить / обновить пакеты на вновь установленном CentOS

    Переместите все файлы в новый каталог, за исключением этого каталога

    Запуск комбинации клавиш vim при запуске

    Как написать этот псевдокод, где условие

    Ключ дома не работает в терминале

    Должен ли я закончить мои текстовые / скриптовые файлы с помощью новой строки?

    Как просыпать неактивные процессы в Linux?

    Многоканальный звук для звуковых эффектов Хэллоуина

    Добавление других прав rw для файла

    Именованная служба не запускается – кажется, это кеширование ошибок

    Почему существует множество способов измерения использования диска?

    Где $ _ определяется POSIX?

    Linux и Unix - лучшая ОС в мире.