cpdoc / dhbb-nlp

processamentos DHBB
Other
5 stars 2 forks source link

sent-segment.py #59

Closed arademaker closed 4 years ago

arademaker commented 4 years ago

modificar script para processar todos os arquivos do diretório de ENTRADA (raw) e gerar no diretório de SAIDA os SENT (offsets).

python sent-segment.py MODELO DIR-IN DIR-OUT
igorcj commented 4 years ago

Feito

arademaker commented 4 years ago

@igorcj, pensando melhor, acho que nossos scripts deveriam funcionar tanto recebendo um arquivo quanto recebendo um diretório e executando para todos os arquivos no diretório. Acho que assim teremos o máximo de flexibilidade. Algo como

python sent-segment.py --model MODELFILE --indir DIR-RAW --outdir DIR-SENT

ou

python sent-segment.py --model MODELFILE --infile FILE.RAW > FILE.SENT
python sent-segment.py --model MODELFILE < FILE.RAW > FILE.SENT
igorcj commented 4 years ago

@arademaker, pode verificar a nova implementação? eu alterei os aprametros para que possa chamar dos dois modos: arquivo ou diretório. todos os parâmetros e ordem de chamada estão especificados no cabeçalho do arquivo.

arademaker commented 4 years ago

@igorcj uma boa prática é sempre referenciar o issue no commit e sempre que comentar aqui também colocar alguma referencia para o arquivo ou commit. OK, vou olhar, obrigado.

arademaker commented 4 years ago

Pensei que vc usaria alguma coisa como https://docs.python.org/3.3/library/argparse.html, o que tornaria o código mais claro.

igorcj commented 4 years ago

Ah sim. Para falar a verdade não conhecia essa biblioteca. Posso implementar desta forma, só preciso estudar como funciona.

igorcj commented 4 years ago

Acabo de commitar uma versão do código usando argparse. Acho que assim funciona bem. É possivel chamar como: sent-segment.py pathin pathout -m MODELO -i -s Onde os parâmetros opicionais são, respectivamente, para especificar o arquivo do modelo, indicar que é INFILE, e não diretório, e ativar o "status" no stdout. Pode dar uma olhada e dizer se assim ficou bom?

arademaker commented 4 years ago

fiz algumas mudanças na sua lógica. ao invés de status, troquei para verbose, nome mais comum para este tipo de flag. transformei isso em flag, não recebe valor, apenas indicamos ou não o flag verbose.

% python sent-segment.py -h
usage: sent-segment.py [-h] [-m MODEL] [-i [INFILE]] [-v] indir outdir

positional arguments:
  indir                 directory where the raw files are located.
  outdir                directory to save the outputs.

optional arguments:
  -h, --help            show this help message and exit
  -m MODEL, --model MODEL
                        file with the model to be loaded.
  -i [INFILE], --infile [INFILE]
                        single file processing mode. Only this file will be processed.
  -v, --verbose         verbose mode, prints in the stdout.

então agora podemos processar com:

% python sent-segment.py -m model_punkt.pickle -i 10.raw -v ../raw ../sents
Carregando modelo model_punkt.pickle
Modelo carregado em: 0.034s
processed ../raw/10.raw => ../sents/10-nk.sent
Tempo total: 0.0391s

interessante como o tempo para carregar o modelo é impactante! Praticamente metade do tempo quando processamos apenas um arquivo. Para processar tudo temos agora:

(venv) ar@leme src % python sent-segment.py -m model_punkt.pickle -v ../raw ../sents
Carregando modelo model_punkt.pickle
Modelo carregado em: 0.0338s
...
processed ../raw/1294.raw => ../sents/1294-nk.sent
processed ../raw/700.raw => ../sents/700-nk.sent
Tempo total: 33.0s
igorcj commented 4 years ago

Legal. Gostei bastante da biblioteca. Não tinha encontrado esse "flag", bom saber. Aprendi bastante com esse código...

arademaker commented 4 years ago

Adaptei o sent-segment.sh (que chama o ABCL) para executar apenas o código OpenNLP. O script também pode ser chamado para processar apenas um arquivo ou o diretório raw inteiro. Não está 100% robusto, mas esta melhor. O processamento do raw inteiro agora com o openNLP tem performance comparável com o NLTK.

O processamento via feeling precisa ser revisto, possivelmente com um docker para facilitar instalação do freeling e API python que permita sua execução também em batch vs single file.