![sed는 중간 대문자의 단어를 한 줄씩 대체합니다.](https://linux55.com/image/2027/sed%EB%8A%94%20%EC%A4%91%EA%B0%84%20%EB%8C%80%EB%AC%B8%EC%9E%90%EC%9D%98%20%EB%8B%A8%EC%96%B4%EB%A5%BC%20%ED%95%9C%20%EC%A4%84%EC%94%A9%20%EB%8C%80%EC%B2%B4%ED%95%A9%EB%8B%88%EB%8B%A4..png)
일부 스캔을 일반 텍스트로 변환하기 위해 OCR을 사용하고 있지만 안타깝게도 일부 글꼴의 일반 문자 "fi"는 대문자 W로 읽혀집니다. 이제 모든 W를 "fi"로 바꿔야 하며 이러한 W는 실제 영어에서는 단어 중간에 대문자 W가 나타나지 않는다는 사실로 쉽게 구별할 수 있습니다. 따라서 모든 단어 중간에 있는 대문자 W를 문자 fi로 바꾸는 sed 한 줄 명령문이 필요합니다.
답변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 프로그램은 "이 단어를 이런 식으로 전사하는 것이 의미가 있나요?"와 같은 내부 자체 점검의 일부로 이 단계를 수행합니다. 물론 이 작업을 직접 수행하여 모든 것이 올바르게 변환되었는지 확인할 수 있습니다.