/ting

Aplicação que simula um algoritmo de indexação de documentos similar ao do Google capaz de identificar ocorrências de termos em arquivos TXT.

Primary LanguagePython

TING (Trybe is not Google)

Aplicação que simula um algoritmo de indexação de documentos similar ao do Google capaz de identificar ocorrências de termos em arquivos TXT. Foi desenvolvida como projeto de aprendizado no curso de desenvolvimento web da Trybe.

Ferramentas utilizadas
Habilidades trabalhadas
  • Manipular Pilhas;

  • Manipular Deque;

  • Manipular Nó e Listas Ligadas;

  • Manipular Listas Duplamente Ligadas.

Módulos

A aplicação conta com dois módulos e seus respectivos componentes:

  • ting_file_management: gerencia e anexa arquivos de texto (formato TXT):

    • Queue: estrutura de dados FIFO(First In First Out) utilizada para armazenar e manipular os arquivos que serão lidos.
    • txt_importer: função que importa notícias a partir de um caminho para um arquivo TXT. Retorna uma lista contendo as linhas do arquivo ou None em caso de erro.
    • process: função que transforma o conteúdo da lista gerada pela função txt_importer em um dicionário que será armazenado dentro da Queue.
      • is_file_unique: função que assegura que arquivos com o mesmo nome e caminho não devem ser readicionados a Queue.
      • remove: função que remove o primeiro arquivo processado da Queue.
      • file_metadata: função que imprime as informações superficiais de um arquivo processado.
    • PriorityQueue: Utiliza Queue para armazenar arquivos pequenos com prioridade. Arquivos com menos de 5 linhas são armazenados de forma prioritária na fila. Classe implementada pela Trybe.
  • ting_word_searches: operador de funções de busca sobre os arquivos anexados:

    • exists_word: Busca numeração das linhas em que a palavra ocorre nos arquivos processados
    • search_by_word: Busca numeração && conteúdo das linhas em que a palavra ocorre nos arquivos processados
Instalação
  1. Clone o repositório e entre na pasta do repositório que você acabou de clonar
git clone git@github.com:pennaor/ting.git
cd ./ting
  1. Crie o ambiente virtual para o projeto
python3 -m venv .venv && source .venv/bin/activate
  1. Instale as dependências
python3 -m pip install -r dev-requirements.txt
Utilização
  1. Abra um terminal Python importando as funções do arquivo main.py
python3 -i main.py
  1. Execute as funções exists_word ou search_by_word.
  • Ambas esperam receber uma palavra como primeiro argumento, seguido pelos caminhos dos arquivos a serem analisados
  • Arquivos de texto prontos podem ser encontrados no diretório ./statics/
  exists_word("acima", "statics/arquivo_teste.txt", "statics/nome_pedro.txt")

#   SAÍDA:

#   1. INFORMAÇÕES DO ARQUIVO PROCESSADO:
#     {'nome_do_arquivo': 'statics/arquivo_teste.txt', 'qtd_linhas': 3, 'linhas_do_arquivo': ['Acima de tudo,', 'é fundamental ressaltar que a adoção de políticas
#       descentralizadoras nos obriga', 'à análise do levantamento das variáveis envolvidas.']}
#     -- RESULTADO DA BUSCA:
#     {'palavra': 'acima', 'arquivo': 'statics/arquivo_teste.txt', 'ocorrencias': [{'linha': 1}]}

#   2. INFORMAÇÕES DO ARQUIVO PROCESSADO:
#     {'nome_do_arquivo': 'statics/nome_pedro.txt', 'qtd_linhas': 3, 'linhas_do_arquivo': ['Aqui contem um texto que fala sobre um menino pobre chamado Pedro.',
#      'Ele era um menino feliz e cativante.', 'Pedro tinha uma amiga chamada Carol.']}
#     -- RESULTADO DA BUSCA:
#     {'palavra': 'acima', 'arquivo': 'statics/nome_pedro.txt', 'ocorrencias': 'Sem ocorrência'}
  search_by_word("acima", "statics/nome_pedro.txt", "statics/arquivo_teste.txt")

#   1. INFORMAÇÕES DO ARQUIVO PROCESSADO:
#   {'nome_do_arquivo': 'statics/nome_pedro.txt', 'qtd_linhas': 3, 'linhas_do_arquivo': ['Aqui contem um texto que fala sobre um menino pobre chamado Pedro.',
#     'Ele era um menino feliz e cativante.', 'Pedro tinha uma amiga chamada Carol.']}
#   -- RESULTADO DA BUSCA:
#   {'palavra': 'acima', 'arquivo': 'statics/nome_pedro.txt', 'ocorrencias': 'Sem ocorrência'}

#   2. INFORMAÇÕES DO ARQUIVO PROCESSADO:
#   {'nome_do_arquivo': 'statics/arquivo_teste.txt', 'qtd_linhas': 3, 'linhas_do_arquivo': ['Acima de tudo,', 'é fundamental ressaltar que a adoção de políticas
#    descentralizadoras nos obriga', 'à análise do levantamento das variáveis envolvidas.']}
#   -- RESULTADO DA BUSCA:
#   {'palavra': 'acima', 'arquivo': 'statics/arquivo_teste.txt', 'ocorrencias': [{'conteudo': 'Acima de tudo,', 'linha': 1}]}
Teste da classe PriorityQueue

PriorityQueue utiliza Queue do pacote ting_file_management para armazenar arquivos pequenos com prioridade. Arquivos com menos de 5 linhas são armazenados de forma prioritária na fila. Classe implementada pela Trybe.

O teste verifica se:

  • Quando um arquivo prioritário (com menos de 5 linhas) é adicionado à fila de prioridades, este arquivo ficará "após" todos os arquivos prioritários já inseridos, mas ficará "antes" de todos os arquivos não-prioritários já inseridos.
  • Quando um arquivo não-prioritário (com 5 linhas ou mais) é adicionado à fila de prioridades, este arquivo ficará "após" todos os arquivos já inseridos.

Exemplo:

# Tamanhos dos arquivos, em ordem de inserção na fila: 
[9, 4, 2, 5, 7, 11, 3]

# Tamanhos dos arquivos, em ordem de remoção da fila:
[4, 2, 3, 9, 5, 7, 11]

Para executar o teste, digite em um terminal:

python3 -m pytest

⚠️ O ambiente virtual deve estar ativado!