sed one-liner para substituir maiúsculas da palavra-medial

4

Eu usei o OCR para transformar algumas digitalizações em texto simples, mas infelizmente as letras 'fi', que são comumente associadas a algumas fontes, foram lidas como maiúsculas. Agora eu preciso substituir todos os W's por 'fi', e estes podem ser facilmente distinguidos pelo fato de um W maiúsculo nunca ocorrer no meio de uma palavra em inglês verdadeiro. Então, eu preciso de um one-liner sed que substitua todos os W da palavra-medial com as letras fi.

    
por ixtmixilix 27.05.2011 / 01:47

3 respostas

2

Um W maiúsculo também não ocorre no final de uma palavra, mas pode ocorrer em uma abreviação de todos os maiúsculas. Então, eu substituo W quando é imediatamente após uma letra minúscula, ou quando segue uma letra maiúscula e precede uma letra minúscula (aWre).

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

Isso não cobre fifi (que minha maior lista de palavras só encontra em "fifing"). Mais importante, isso não cobre W no início de uma palavra; você pode capturar alguns casos observando a segunda letra, mas isso ainda vai perder muitas palavras que começam com fi . Em inglês, muitas letras nunca aparecem depois de um W:

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

Para obter resultados mais precisos e lidar com outras linguagens, você pode alternar para uma abordagem mais complexa baseada em dicionário (que os sofisticados sistemas de OCR usam com frequência, evidentemente que o seu não é sofisticado o suficiente).

    
por 27.05.2011 / 09:32
2

Uma resposta rápida e simples que deve resolver a maioria dos casos é:

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

Isso substituirá qualquer W que não tenha um espaço antes ou depois com fi . Ele pega o erro nesses casos de teste simples:

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

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

No entanto, ele não captura coisas como:

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

Como você pode ver, isso deve ter mudado para finger . Então, infelizmente, você ainda precisará verificar isso.

    
por 27.05.2011 / 03:33
2

Os caras já cobriram as coisas básicas do sed , mas há mais algumas coisas que você pode fazer para ajudar no seu texto.

O primeiro é treinar seu programa de OCR para reconhecê-los em primeiro lugar. A maioria dos sistemas de OCR tem algum tipo de sistema para ensinar novas letras e aprender com erros comuns como este. Se o seu corpus for grande o suficiente para ser pesquisado e substituído dessa forma, ele deve ser grande o suficiente para ensinar o mecanismo de OCR a não cometer esse erro.

Em segundo lugar, você pode executar o seu texto através de um mecanismo de verificação ortográfica. Muitos programas de OCR incluem essa etapa como parte de uma verificação interna, uma espécie de "essa palavra até faz sentido transcrita dessa maneira". Você pode certamente fazer isso sozinho como uma maneira de validar que tudo foi sanmente convertido.

    
por 27.05.2011 / 09:59

Tags