Crie uma lista de palavras personalizada

3

Eu quero criar uma lista personalizada de palavras (científicas) para fins como verificação ortográfica e OCR com base na minha coleção de artigos científicos em formato pdf. Usando pdftotext eu posso criar facilmente um arquivo de texto que contém as palavras desejadas para o meu campo científico. No entanto, o arquivo será poluído com

  • palavras que não são específicas para a ciência (e que também estariam contidas em um dicionário comum)
  • palavras que resultam da conversão imprópria de, e. fórmulas (incluindo palavras que incluem caracteres especiais, etc.)

Eu quero me livrar do último, exigindo que palavras individuais tenham um tamanho mínimo, não contenham caracteres especiais e apareçam várias vezes na lista. Em segundo lugar, quero me livrar do primeiro comparando com uma segunda lista de palavras. Minhas perguntas:

Isso soa como um bom plano para você? Existem ferramentas existentes para esta tarefa? Como você faria?

    
por highsciguy 18.05.2013 / 22:25

2 respostas

3

Para selecionar palavras de pelo menos 4 caracteres encontrados pelo menos 5 vezes e não encontradas em / usr / share / dict / words nos arquivos PDF no diretório atual.

 find . -name '*.pdf' -exec pdftotext {} - \; |
   tr -cs '[:alpha:]' '[\n*]' |
   tr '[:upper:]' '[:lower:]' |
   grep -E '.{4}' |
   sort |
   uniq -c |
   awk '$1 > 4 {print $2}' |
   comm -23 - <(tr '[:upper:]' '[:lower:]' < /usr/share/dict/words|sort -u)

Você precisa de um shell com suporte para substituição de processo ( ksh , zsh ou bash ).

Se você for usar perl de qualquer maneira, também poderá fazer a coisa toda em perl :

find . -name '*.pdf' -exec pdftotext {} - \; |
  perl '-Mopen ":locale"' -nle '
     s/^\S+//;s/\S+$//;y/ \t/ /s;
     next unless length > 40;
     $w{lc$_}++ for /[[:alpha:]]{4,}/g;
     END{open W,"</usr/share/dict/words";
     while(<W>){chomp;delete $w{lc$_}};
     print for grep {$w{$_}>4} keys %w}'
    
por 18.05.2013 / 22:53
1

Parece um plano muito típico. Eu usaria scripts de shell para fazer isso. Você não está lidando com quantidades escandalosamente grandes de texto, portanto, o desempenho deve ser adequado, e os scripts de shell são fáceis de escrever e executar novamente. Meu primeiro corte seria um roteiro como este:

pdf2text files |
tr -cs '[A-Za-z]' '\n' |  
tr '[A-Z]' '[a-z]' |
awk '{ if (length > 6) {print $1;}}' |
fgrep -v -f /usr/share/groff/current/eign |
sort | 
uniq -c |
awk '{print $2, $1}' |
sort -nr +1 -2 |
head -20

Isso te dará as 20 palavras mais frequentes com comprimento maior que 6.

Você pode adicionar etapas, eliminar etapas, ajustar parâmetros para ver o que recebe.

A etapa fgrep é a única ímpar e requer que o GNU troff seja instalado. O arquivo / usr / share / groff / current / eign é algo como as 100 palavras de maior frequência em inglês. O sinalizador "-v" apenas passa as palavras que não aparecem no arquivo "eign", por isso está usando "eign" como uma lista de parada. Se você não gosta do GNU troff como palavras comuns, você pode fazer o seu próprio e usar esse arquivo na etapa fgrep .

    
por 18.05.2013 / 22:49