Skip to content
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

Merged
merged 5 commits into from
Dec 13, 2023
Merged

Conversation

ogecece
Copy link
Member

@ogecece ogecece commented Nov 29, 2023

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.

Jefersonalves and others added 5 commits December 13, 2023 13:11
- 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
@danielfireman
Copy link

Que momento feliz!! 🚀

@danielfireman
Copy link

@ogecece vocês já tem um plano para migração dos casos de teste? Temos uma massa bem grande aqui que pode dar uma confiança boa em futuras evoluções.

@trevineju
Copy link
Member

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):
Copy link
Contributor

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

@ogecece
Copy link
Member Author

ogecece commented Dec 13, 2023

@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!

@ogecece ogecece merged commit cc54af2 into main Dec 13, 2023
0 of 2 checks passed
@ogecece ogecece deleted the prototype branch December 13, 2023 20:41
ogecece pushed a commit to okfn-brasil/querido-diario that referenced this pull request Dec 13, 2023
**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**
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

Add support to gazettes published by AMA
5 participants