Closed arademaker closed 4 years ago
Implementado um script para o issue. Tentei fazer o mais genérico possível, permitindo realizar para arquivo ou para diretório e usando a mesma idéia de argparse. Fiz também o sistema de tuplas como tinhamos discutido e os arquivos diff como enunciados. poderia verificar se assim está ok?
o processamento dos arquivos em lote, quando só especifico diretório, nao segue qualquer ordem. seria bom ordenar os arquivos encontrados e processar na ordem. assim podemos ter uma idéia e acompanhar... quando no modo verbose.
Eu não entendi sua lógica para chamar https://github.com/cpdoc/dhbb-nlp/blob/sentences/src/sent-analysis-plus.py#L69. Poderia explicar aqui? Me parece que vc está criando um conjunto de arquivos e percorrendo eles várias vezes para achar todos os arquivos com um dado prefixo? me pareceu mais lento que o necessário.
Depois de processar todos, olhando os diff:
% awk '{print $3, $4, $5, $6}' *.diff | sort | uniq -c
4229 fl
426 fl nk
1244 fl op
4418 nk
517 nk fl
3379 nk op
4068 op
1252 op fl
2823 op nk
as linhas op nk
e nk op
deveriam ser uma só. as linhas fl nk
e nk fl
idem. etc.
ou seja, deveria conseguir obter:
% awk '{print $3, $4, $5, $6}' *.diff | sort | uniq -c
4418 nk
4229 fl
4068 op
3379 nk op
2823 op nk
2496 op fl
943 nk fl
Commitei uma correção no sent-analysis-plus.py, esqueci de marcar o issue, mas está aqui. Creio que ele esteja funcional agora. tinha mais um bug que identifiquei e tive que reestruturar toda minha lógica de unir as tuplas pras diferentes ferramentas. Por isso, o script está um tanto diferente.
Quanto a implementação em Haskell, eu tenho que adimitir que estou apanhando bastante da linguagem ainda. É bem distinta do que conheço de programação. Cheguei à conclusão que tenho que trabalhar nela desvinculado de outras linguagens. Tentar traduzir a lógica de outras para ela parece dificultar mais. Estou determinado em implementar esse issue em Haskell, estou gostando BASTANTE da linguagem. Estou no momento seguindo um curso online de Haskell e implementando coisas simples para me habituar um pouco. Logo volto a tentar o issue, mas pretendo reformular a solução pensando em Haskell, e não apenas tentar traduzir do python.
proximos passos:
programa N DIR-IN DIR-OUT
o programa irá procurar no DIR-IN os arquivos N-???.sent, irá fazer a lógica e salvar no DIR-OUT os arquivos N.diff e N.sent. Alternativamente, para que não precisemos do haskell ficar procurando arquivos... o programa pode receber a lista:
programa N file1 file2 file3...
e gerar dois arquivos de saida n.diff e n.sent (o argumento informando directorio destino é bom, mas podemos tentar o que for mais fácil antes. terceira alternativa, usar o STDOUT e STDERR
programa N file1 file2 file3... > N.sent 2> N.diff
um script bash dará conta de chamar este código para valores de N e em cada passo, chamar o programa e se o código de saida for 0, apagar os arquivos N-???.sent
depois de tudo testado, podemos apagar o código python do repositório.
Faz sentido @igorcj ?
em bach podemos obter a lista dos N e os respectivos arquivos de entrada com algo como abaixo. Mas deve ter forma mais simples...
for f in `find -E . -type f -regex '.*[0-9]+\.sent' | sed -e 's/\.sent//' | sed -e 's/\.\///' | sort -n | uniq`; do
echo programa $f `find . -name "$f-*.sent"`;
done
Ok. Trabalharei nisso...
Tudo pronto. Até onde testei está funcionando como deveria. Após conpilar chama-se o código com ./sent-analysis file1 file2 file3 ...
e o script gera os arquivos .sent
e .diff
(se necessário) no mesmo diretório do file1
. Vou esperar que confira a implementação para fechar o issue @arademaker .
@igorcj fiz algumas correções, mais ainda temos problemas:
[ ] falta o FreeLing, ele é o mais chato porque depende de instalação mais complicada e do uso dos arquivos de configuração. mas abandonar ele por causa disso é ruim. Talvez via docker fique mais fácil... conhece https://www.docker.com?
[ ] atualizei o sents/Makefile para rodar o haskell e consolidar os arquivos depois de rodar openNLP e NLTK. Consolidação está demorando muito mais do que openNLP e NLTK juntos!
[x] alterei algumas coisas no haskell mas ainda temos problemas. O mais sério é que os arquivos sent e diff devem ser terminados com uma quebra de linha, veja o que acontece se rodar cat ?.diff
ultimo item da lista anterior resolvido em 2835a1cd9.
Não conheço o docker, teria de estudar o que é. Quanto ao tempo, a parte de simplificação está implementada daquela forma "esperta" que havíamos discutido. Acho que o que pode estar tomando tempo seja a ordenação. Não sei dizer se minha função de sort está muito eficiente. Esse pode ser o principal problema no quesito tempo. Talvez compense sibstrituri por algoritmos de orgenação da própria linguagem (que em tese devem ser otimizados)?
Fiz uma sugesrão em código com respeito a esse ultimo fator. Não tive ainda a oportunidade ainde de verificar se a alteração tem efeito no tempo de execussão (por isso mantive o codigo anterior comentado). Mas em teoria o sort da linguágem deve ser otimizado. Se minha hipótese com respeito do tmepo se concretizar, podemos ter uma melhoria com isso.
Acabo de enviar uma versão modificada do sent-analysis em haskell para o repositório. Creio que tenha conseguido implementar de forma razoável a ideia de Parser. Aproveitei o mesmo método para obter nome e sufixo dos arquivos, substituindo aquela 'mágica' que era feita antes trabalhando com as strings dos nomes. Aguardo a verificação das mudanças.
parece que melhorou bastante a performance. se eu tivesse mais tempo, gostaria de olhar a sua lógica de perto, mas agora não dá... enfim, podemos agora fechar este issue e focar no merge do branch no master...
produz no mesmo DIR os arquivos N.diff e N.sent
sendo o N.diff no formato
a b T1 c d T2 T3 ...
vide comentários sobre como obter