Skip to content
Biscaia021Public

About

No description, website, or topics provided.

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔍 Motor de Busca Semântica Otimizado para Notícias

Python SentenceTransformers Status

Uma pipeline de PLN de alta performance para busca vetorial semântica em corpus de notícias em português


📖 Sobre o Projeto

Este projeto implementa uma pipeline de Processamento de Linguagem Natural (PLN) de alta performance para:

  • ✅ Limpeza textual avançada em notícias brasileiras
  • ✅ Busca vetorial semântica eficiente
  • ✅ Representações geométricas em hiperesfera
  • ✅ Cálculo ultra-rápido de similaridade de cosseno

🧠 Justificativa do Modelo Escolhido

O modelo selecionado: paraphrase-multilingual-MiniLM-L12-v2 (SentenceTransformers)

Pilares da Escolha

Pilar Descrição
🌍 Multilíngue (PT-BR) Treinado com destilação de conhecimento multimodal, preserva a semântica do português brasileiro com robustez
⚡ Eficiência Computacional Baseado em MiniLM (12 camadas) = embeddings de alta qualidade + baixo consumo de memória e latência
🎯 Foco em Paráfrases Otimizado para mapear textos semanticamente similares para regiões próximas no espaço vetorial

🛠️ Arquitetura e Otimizações

1. Preservação de Capitalização (Case Sensitivity)

Remoção intencional do .lower():

  • ✅ Siglas (BCB, IBGE, MDIC) mantêm alto teor semântico
  • ✅ Nomes próprios capitalizados são distinguíveis
  • ✅ Tokenizadores inteligentes (WordPiece/SentencePiece) entendem estas nuances

2. Indexação Geométrica na Hiperesfera (L₂ Normalization)

Ao invés de calcular similaridade de cosseno a cada busca:

$$\text{Similaridade}_{\text{cosseno}} = \frac{\mathbf{u} \cdot \mathbf{v}}{|\mathbf{u}| \cdot |\mathbf{v}|}$$

Normalizamos todos os embeddings antes (L₂ normalization):

$$\text{Similaridade}_{\text{otimizada}} = \mathbf{u} \cdot \mathbf{v}$$

💡 Resultado: Simples produto escalar vetorial, processado instantaneamente via numpy.dot

3. Busca Top-K Eficiente com np.argpartition

Método Complexidade Uso
argsort (ordenação total) $\mathcal{O}(N \log N)$ ❌ Desperdício em larga escala
argpartition (particionamento) $\mathcal{O}(N)$ ✅ Isola K maiores elementos

4. Sanitização Textual Defensiva

A classe TextCleaner elimina:

  • 🗑️ Tags HTML residuais
  • 🗑️ Metadados de data/hora colados
  • 🗑️ Links quebrados por espaços
  • 🗑️ Barras invertidas de escapes JSON

🚀 Como Rodar o Projeto

✅ Pré-requisitos

  • Python 3.9 a 3.11
  • pip instalado
  • GPU NVIDIA (opcional, para acelerar)

📁 Estrutura de Diretórios

meu-projeto/
├── dados/
│   └── noticias_brutas.json
├── main.py
└── README.md

1️⃣ Instalar Dependências

pip install sentence-transformers numpy scikit-learn pandas

💡 Para GPU NVIDIA: Instale PyTorch com suporte CUDA para máximo desempenho

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

2️⃣ Formato do Arquivo de Entrada

O arquivo dados/noticias_brutas.json deve conter uma lista de objetos:

[
  {
    "id": 1,
    "titulo": "Banco Central Mantém Selic em 11,25%",
    "conteudo": "A decisão de manter a taxa básica...",
    "data": "2024-11-15",
    "fonte": "G1"
  },
  {
    "id": 2,
    "titulo": "Desemprego Cai para 7,8%",
    "conteudo": "Segundo dados do IBGE, a taxa de desemprego...",
    "data": "2024-11-14",
    "fonte": "Folha"
  }
]

3️⃣ Executar o Script

python main.py

Saída gerada:

  • ✅ dados/dados_limpos.json — corpus processado
  • ✅ Indexação automática
  • ✅ Resultados de busca exibidos

📈 Avaliação dos Resultados

Exemplo 1: "Mudanças na Taxa de Juros"

Resultado: O motor retorna artigos que:

  • ✅ Não mencionam "mudanças" ou "juros" explicitamente
  • ✅ Correlacionam com "Copom", "Selic", "Política Monetária"
  • ✅ Capturam relações semânticas intrínsecas

Vantagem sobre TF-IDF: Tradicional palavra-chave perderia estas conexões!

Exemplo 2: "Mercado de Trabalho e Desemprego"

Resultado: O motor identifica:

  • ✅ Taxa de desocupação (IBGE)
  • ✅ Geração de vagas (CAGED)
  • ✅ Remove ruídos de rodapés estruturais

Precisão: Foco no núcleo da notícia, não em metadados

Exemplo 3: Resiliência a Ruídos

  • ✅ Mantém maiúsculas em nomes de portais
  • ✅ Corrige URLs quebradas (g1 . globo . com → g1.globo.com)
  • ✅ Distingue siglas econômicas de palavras comuns

⚠️ Limitações Conhecidas

Busca por Valores Numéricos Exatos

Problema: Modelo bi-encoder prioriza contexto geral

  • ❌ Busca: "10,75%" pode retornar contexto econômico, não o valor exato

Solução Recomendada (Produção):

┌─────────────────┐
│ Busca Híbrida   │
├─────────────────┤
│ ✓ BM25 (exato)  │
│ + Vetorial      │
└─────────────────┘

Combinar busca lexical (BM25) com busca semântica para máxima precisão.


📊 Métricas de Performance

Métrica Valor
Tempo de Indexação ~2ms por notícia
Tempo de Busca <100ms (corpus 100k documentos)
Dimensionalidade 384 dimensions
Memória por Embedding 1.5 KB

🔧 Customizações Possíveis

Trocar Modelo de Embedding

from sentence_transformers import SentenceTransformer

# Alternativa 1: Melhor qualidade (mais lento)
model = SentenceTransformer('sentence-transformers/all-MiniLM-L12-v2')

# Alternativa 2: Português específico
model = SentenceTransformer('neuralmind/bert-base-portuguese-cased')

Ajustar Top-K de Resultados

results = index.search(query, top_k=10)  # Padrão: 5

About

No description, website, or topics provided.

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages