【问题标题】:Using awk for conditional find/replace使用 awk 进行条件查找/替换
【发布时间】:2011-10-23 20:24:53
【问题描述】:

我想解决一个常见但非常具体的问题:由于 OCR 错误,很多字幕文件包含字符“I”(大写 i)而不是“l”(小写 L)。

我的进攻计划是:

  1. 逐字处理文件
  2. 将每个单词传递给 hunspell 拼写检查器(“echo the-word | hunspell -l”如果有效则根本不产生响应,如果不正确则产生响应)
  3. 如果它是一个坏词,并且其中包含大写字母 Is,则将其替换为小写字母 l 并重试。如果现在是有效词,请替换原来的词。

我当然可以在脚本中标记和重建整个文件,但在我走这条路之前,我想知道是否可以在单词级别使用 awk 和/或 sed 进行这些类型的条件操作?

也非常欢迎任何其他建议的方法!

【问题讨论】:

    标签: bash sed awk hunspell spell-checking


    【解决方案1】:

    你真的不需要比 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!哈哈!我不知道 hunspell 处理标点符号,我会删除我的帖子 :)
    • 这几乎就是我最终在 bash 中所做的事情,尽管我在进行第一次 hunspell 测试之前首先检查了是否存在“I”。然后又做了两次 hunspell 通行证:第二次将所有“I”替换为 l,第三次将除第一个“I”以外的所有内容都替换为 l(对于“IdIot”之类的词)。这产生了一个足以满足我需求的解决方案,当然它在处理器方面非常密集 - 在 i7-920 上处理一个 120KB 的文件大约需要 2 分钟。如果没有更有效的答案,我当然会接受。
    • 更有效的答案是像hunspell -options file | parse_the_output &gt; new_file 这样的东西——只需要生成一次hunspell,而不是文件中的每个单词一次。
    【解决方案2】:

    两个建议:

    1. 将问题修复到更靠近问题的位置,即靠近 OCR 软件。能不能查字典,连非“我”的词都查不出来?如果没有,请尝试其他 OCR 程序。
    2. 通过 hunspell 运行每个单词都会为每个单词创建一个进程,这是对 CPU 周期的大量浪费。 尝试使用多遍,其中第一遍查找所有“我”单词,然后过滤掉正确的单词,然后替换每个可纠正的单词。

    【讨论】:

    • 感谢您的提示。您对 (1) 的看法当然是正确的,但不幸的是,我只有生成的 .SRT 文件可供使用。我通过将 hunspell 的使用限制为仅包含“I”的单词,使 (2) 稍微好一些,但你说得对,它的计算成本仍然很高。我将调查是否可以将整个文件的 hunspell 输出与原始文件相协调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2014-07-07
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多