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

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

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

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

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

Пример 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 .

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

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

  • awk: for-loop with break option
  • Как использовать Unindented строку в качестве записи отдельно в awk cli
  • суммирование двух матриц, каждый из которых в другом файле
  • Как я могу получить awk для печати как совпадений, так и несоответствий?
  • Как узнать содержимое файла XML с помощью Unix Sed / Awk?
  • Как добавить новый символ после каждой строки?
  • Почему более новые версии awk печатают большие целые числа вместо десятичных знаков?
  • Справка по сценарию awk / sed shell
  • 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

    USB-джойстик поддерживает строительство VICE от источника?

    Настроить bash для выполнения команды с последним аргументом, если аргумент не был предоставлен

    linux distro, который является легким и работает в бесшовном режиме для использования в командной строке на VirtualBox

    Где хранить медиафайлы на общем сервере linux

    Есть ли способ указать список закрытых ключей для добавления в ssh-agent?

    Синтаксическая ошибка в скрипте bash, который вызывает find

    Использование в реальном мире «suitless» initit

    Надежное обнаружение файлов разработки Python 3

    Как связать AtlGr с Ctrl + Alt в Debian 7

    Как я могу PGP расшифровать весь mbox?

    Как сохранить настройки ulimit в OSX Yosemite?

    Установите разрешения по умолчанию по типу файла (по крайней мере, в Vim)

    не удалось подписать сертификат letencrypt

    Как запустить службу при загрузке после получения учетной записи ldap

    Могу ли я использовать fio на смонтированном устройстве?

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