sed 一行行替换单词中间大写

sed 一行行替换单词中间大写

我使用 OCR 将一些扫描结果转换为纯文本,但不幸的是,某些字体中常见的字母“fi”被读为大写 W。现在我需要将所有 W 替换为“fi”,并且可以通过以下事实轻松区分这些 W:在真正的英语中,大写 W 不会出现在单词中间。因此,我需要一个 sed 单行语句,用字母 fi 替换所有单词中间大写的 W。

答案1

大写 W 也不出现在单词末尾,但可能出现在全大写缩写中。因此W,当它紧接在小写字母之后,或者当它在大写字母之后且在小写字母之前(aWre)时,我会进行替换。

sed -e 's/\([[:lower:]]\)W/\1fi/g' -e 's/\([[:alpha:]]\)W\([[:lower:]]\)/\1fi\2/g'

这不包括fifi(我最大的单词列表只在“fifing”中找到它)。更重要的是,这不包括W单词的开头;您可以通过查看第二个字母来捕获某些情况,但这仍然会错过许多以 开头的单词fi。在英语中,许多字母从来不会出现在 W 之后:

… -e 's/\([^[:alnum:]]\)W\([b-dfgj-npqstv-xz]\)/\1fi\2/g' \
  -e 's/^W\([b-dfgj-npqstv-xz]\)/fi\2/'

为了获得更精确的结果并处理其他语言,您可以切换到更复杂的基于字典的方法(高级 OCR 系统经常使用这种方法,显然您的系统还不够高级)。

答案2

应该解决大多数情况的快速而简单的答案是:

sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"

这将替换任何W之前或之后没有空格的内容fi。它捕获了这些简单测试用例中的错误:

$ echo "blah blah blah trafWc" | sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"
blah blah blah traffic

$ echo "blah blah blah Wallaby" | sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"
blah blah blah Wallaby

但是,它不会捕获以下内容:

$ echo "blah blah blah Wnger" | sed "s/\([^ ]\)W\([^ ]\)/\1fi\2/"
blah blah blah Wnger

正如你所看到的,这应该更改为手指。所以不幸的是你仍然需要检查这些。

答案3

这些人已经介绍了基本的sed内容,但是您还可以做一些其他事情来帮助您的文本。

首先是训练您的 OCR 程序首先识别这些内容。大多数 OCR 系统都有某种系统来教它新字母并从像这样的常见错误中学习。如果您的语料库足够大,需要像这样进行搜索和替换,那么它应该足够大,可以教会 OCR 引擎不要犯这样的错误。

其次,您可以通过拼写检查引擎运行文本。许多 OCR 程序都将此步骤作为内部自我检查的一部分,类似于“这个单词以这种方式转录是否有意义”。您当然可以自己执行此操作,以验证所有内容都已正确转换。

相关内容