Использование awk для условного поиска / замены - PullRequest
0 голосов
/ 23 октября 2011

Я хочу решить общую, но очень специфическую проблему: из-за ошибок распознавания многие файлы субтитров содержат символ «I» (верхний регистр i) вместо «l» (нижний регистр L).

Мой план атаки:

  1. Обработка файла слово за словом
  2. Передать каждое слово в проверку орфографии hunspell («echo the-word | hunspell -l» вообще не дает ответа, если оно действительно, и ответа, если оно плохое)
  3. Если это плохое слово, и в нем есть заглавные буквы Is, замените их на строчные l и попробуйте снова. Если теперь это верное слово, замените исходное слово.

Я, конечно, мог бы разбить на части и восстановить весь файл в скрипте, но прежде чем идти по этому пути, мне было интересно, возможно ли использовать awk и / или sed для такого рода условных операций на уровне слов?

Любые другие предложенные подходы также будут приветствоваться!

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Для этого вам не нужно больше, чем bash:

while read line; do
  words=( $line )
  for ((i=0; i<${#words[@]}; i++)); do
    word=${words[$i]}
    if [[ $(hunspell -l <<< $word) ]]; then
      # hunspell had some output
      tmp=${word//I/l}
      if [[ $tmp != $word ]] && [[ -z $(hunspell -l <<< $tmp) ]]; then
        # no output for new word, therefore it's a dictionary word
        words[$i]=$tmp
      fi
    fi
  done
  # print the new line
  echo "${words[@]}"
done < filename > filename.new

Кажется, имеет смысл передать весь файл в hunspell и проанализировать его вывод.

1 голос
/ 23 октября 2011

Два предложения:

  1. Исправьте проблему ближе к месту, где она возникла , то есть рядом с программным обеспечением OCR.Можно ли сделать это, чтобы обратиться к словарю и даже не придумывать не слова, содержащие «я»?Если нет, попробуйте другую программу распознавания текста, которая может.
  2. Запуск каждого слова через hunspell создает процесс для каждого слова, что является массивной тратой циклов ЦП. Попробуйте использовать несколько проходов , где первый проход находит все слова «I», затем отфильтровывает правильные слова, а затем заменяет каждое корректируемое слово.
...