-
-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Integra base para segmentadores e segmentador da AMA #64
Conversation
- Cria módulo `segmentation` para organizar o código dos segmentadores - O módulo segue o padrão de classe base e classes derivadas para cada segmentador específico - O primeiro segmentador base é o `AssociationSegmenter` para segmentar documentos de associações de municípios - Uma dataclass para segmentos `GazetteSegment` também foi criada - Os segmentadores são instanciados por meio de uma fábrica `get_segmenter`
Deleta módulo associations para usar o segmentation Remove arquivo sem uso Move funções relacionadas aos territórios para um único arquivo Move arquivo que lida com territórios para o módulo utils Atualiza referências para o módulo territories Troca referência para o módulo segmentation Remove atribuição da url para usar a url da associação Remove uso dos territórios nos módulos superiores aos de segmentação Remove tratamento de exceção para nomes errados na limpeza Refatora forma de obtenção dos dados dos territórios Corrige type hinting da segmentação da AMA Adiciona chamada para obter os territórios para os segmentadores Corrige type hint no módulo segmentation factory Remove tratamentos específicos de associações do módulo territories Adapta segmentador da AMA para obter o territory id dos segmentos Correções no processo de extração Remove construção da url ao fazer upload do conteúdo dos segmentos
Torna a busca pelos territórios em uma task Melhora a obtenção de dados do município a partir do nome Trata erros que ocorreram em diários recentes Lança exceção ao obter território se este não for encontrado Faz ajustes para não ser preciso instanciar a database no segmentador Refatora bifurcação entre diários normais e de associações Modifica uso de territories e gazette por segmentadores Territories agora são utilizados por segmentadores por meio de um atributo de instância criado na inicialização da classe. Também não parecia necessária a atribuição do objeto `Gazette` à instância do segmentador, então o objeto passa a ser usado apenas como argumento na `.get_gazette_segments()` e não mais na inicialização. Como a instância do segmentador pode ser reutilizada sem problemas, um padrão de singleton foi utilizado na criação das instâncias. Corrige segmentação com marcador de início falso Na edição de 7 de Dezembro de 2023 do diário da Associação dos Municípios Alagoanos, o diário de Dois Riachos possui o cabeçalho ``` ESTADO DE ALAGOAS PREFEITURA MUNICIPAL DE EDUCAÇÃO SECRETARIA MUNICIPAL DE EDUCAÇÃO DE DOIS RIACHOS ``` no meio do texto de um ato. Isso fazia com que a segmentação fosse engatilhada novamente, resultando em um segmento anterior quase vazio (praticamente apenas o cabeçalho) e o segmento atual com o nome de município incorreto ("EDUCAÇÃO"). Agora, a palavra EDUCAÇÃO foi inserida no regex como uma exceção notável. Refatora mapeamento de município para python-slugify Biblioteca já implementa as transformações que usamos e ainda provê mais funcionalidades. Agora, a chave criada para um município fica em formato mais clássico de slug ("uf-nome-municipio"). Refatora split_text de al_associacao_municipios O método `split_text_by_territory()` estava com problemas de extração incompleta. Ex: ``` { "_index" : "querido-diario", "_type" : "_doc", "_id" : "7b7ed1557de74c25cff6a04023ed525f", "_score" : null, "_source" : { "id" : 6, "territory_name" : "Maribondo", "source_text" : "Alagoas , 02 de Outubro de 2023 • Diário Oficial dos Municípios do Estado de Alagoas • ANO XI | Nº 2145", "date" : "2023-10-02", "edition_number" : "2145", "is_extra_edition" : false, "power" : "executive_legislative", "file_checksum" : "7b7ed1557de74c25cff6a04023ed525f", "scraped_at" : "2023-12-11T20:25:43.705771", "created_at" : "2023-12-11T20:25:45.500616", "processed" : true, "file_path" : "2700000/2023-10-02/a4c2994ffab9f0dabc0d2c3ad46436f917d61efb.pdf", "file_url" : "https://www-storage.voxtecnologia.com.br?m=sigpub.publicacao&f=9878&i=publicado_91279_2023-09-29_564051d01bafcfea6f84735fc59f4d94.pdf", "state_code" : "AL", "territory_id" : "2704807", "file_raw_txt" : "/2704807/2023-10-02/7b7ed1557de74c25cff6a04023ed525f.txt", "url" : "http://google.com/2700000/2023-10-02/a4c2994ffab9f0dabc0d2c3ad46436f917d61efb.pdf" }, ``` Neste caso, o `source_text` está apenas com o cabeçalho. Além disso, o código estava um pouco confuso, então uma refatoração foi realizada para simplificar a segmentação, passando a utilizar mais `re.split()` ao invés de iterar diretamente linha-a-linha. Outra consequência dessa mudança é que além de mais segmentos estarem sendo coletados, os textos dos segmentos refletem o texto original mais fielmente, pois o tratamento de espaços em branco e quebras de linha não está sendo feito linha-a-linha no corpo do segmento. Refatora gazette_text_extraction por conta de associações O fluxo da task estava um pouco confuso, especialmente na bifurcação entre arquivo de diário agregado ou diário completo. Essa refatoração tem como objetivo simplificar esse fluxo e por consequência, assim como a task, os segmentadores também foram simplificados. Refatora criação de índices para tasks Corrige slug na segmentação Para eliminar a necessidade de exceções por conta de municípios com alguma palavra separada por espaço em seu nome indevidamente, o slug agora não utiliza mais um separador e concatena tudo. Ex: - al-senador-rui-palmeira -> alsenadorruipalmeira - al-senador-rui-palme-ira -> alsenadorruipalmeira
Que momento feliz!! 🚀 |
Tenho uma dúvida: em qual parte do código a decisão entre processar normal - por ser o diário de um município - e segmentar é feita? |
delete_gazette_files(gazette_file) | ||
|
||
document_ids = [] | ||
if gazette_type_is_aggregated(gazette): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aqui é feita a identificação o/
@trevineju
@danielfireman estamos migrando a infra para usar kubernetes e depois voltaremos ao esforço de manter uma cobertura de testes. Penso que os segmentadores irão usar algo bem próximo do que foi desenvolvido no exoonero. Gente, vou apertar o botão aqui! |
**AO ABRIR** um Pull Request de um novo raspador (spider), marque com um `X` cada um dos items do checklist abaixo. **NÃO ABRA** um novo Pull Request antes de completar todos os items abaixo. #### Checklist - Novo spider - [X] Você executou uma extração completa do spider localmente e os dados retornados estavam corretos. - [X] Você executou uma extração por período (`start_date` e `end_date` definidos) ao menos uma vez e os dados retornados estavam corretos. - [X] Você verificou que não existe nenhum erro nos logs (`log_count/ERROR` igual a zero). - [X] Você definiu o atributo de classe `start_date` no seu spider com a data do Diário Oficial mais antigo disponível na página da cidade. - [X] Você garantiu que todos os campos que poderiam ser extraídos foram extraídos [de acordo com a documentação](https://docs.queridodiario.ok.org.br/pt-br/latest/escrevendo-um-novo-spider.html#definicao-de-campos). #### Descrição A data inicial de publicação foi descoberta na força bruta, colocando a data inicial em 2009 e tendo o primeiro arquivo baixado apenas em 10/04/2014. Esqueci de salvar o log, mas executei a raspagem completa localmente algumas vezes sem maiores problemas e tudo foi devidamente processado pelo data-processing local. Estou adicionando uma entrada no `territories.csv` para a associação. Não necessariamente ficará lá, mas por enquanto é necessário para reproduzir o processamento de dados localmente (a inserção também já foi feita no banco de produção). **Não mesclar esse PR antes de okfn-brasil/querido-diario-data-processing#64 ser mesclado**
O desenvolvimento deste PR só foi possível graças ao trabalho de @alex-custodio, @emanuelucas04 e @danielfireman no desenvolvimento do Exoonero sob supervisão de @Luisa-Coelho no escopo do programa Querido Diário nas Universidades. Assim como o esforço de @Jefersonalves, @Winzen e @ogecece para integrar o que foi desenvolvido a esta base de código.