cpdoc / dhbb-nlp

processamentos DHBB
Other
5 stars 2 forks source link

sent-analysis.py #60

Closed arademaker closed 4 years ago

arademaker commented 4 years ago
python sent-analysis.py DIR N 

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

for l in listas:
(i,f) -> (i,f,t)

Para cada duas triplas (i1,f1,t1)  (i2,f2,t2) se i1 == i2 AND f1 == f2 ~> (i1,f1, t1 t2)

gerar arquivos sent e diff
igorcj commented 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?

arademaker commented 4 years ago

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.

arademaker commented 4 years ago

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
igorcj commented 4 years ago

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.

arademaker commented 4 years ago

proximos passos:

  1. converter para haskell, tratando

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

  1. 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

  2. depois de tudo testado, podemos apagar o código python do repositório.

Faz sentido @igorcj ?

arademaker commented 4 years ago

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
igorcj commented 4 years ago

Ok. Trabalharei nisso...

igorcj commented 4 years ago

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 .

arademaker commented 4 years ago

@igorcj fiz algumas correções, mais ainda temos problemas:

  1. [ ] 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?

  2. [ ] 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!

  3. [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

arademaker commented 4 years ago

ultimo item da lista anterior resolvido em 2835a1cd9.

igorcj commented 4 years ago

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)?

igorcj commented 4 years ago

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.

igorcj commented 4 years ago

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.

arademaker commented 4 years ago

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...