Extratores
src.extratores
Modulo de extratores do Pede AI.
Fornece ferramentas de processamento de linguagem natural (NLP) para extrair informacoes de mensagens do usuario.
Example
extrair(mensagem: str) -> list[dict]
Extrai itens do cardapio de uma mensagem do usuario.
API compativel com a versao procedural — retorna list[dict].
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
list[dict]
|
Lista de dicionarios com as chaves: - item_id: ID do item no cardapio. - quantidade: Quantidade solicitada. - variante: Variante selecionada (ou None). - remocoes: Lista de ingredientes a remover. |
Example
Source code in src/extratores/extrator.py
extrair_variante(mensagem: str, item_id: str) -> str | None
Extrai e valida uma variante de uma mensagem para um item especifico.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
item_id
|
str
|
ID do item no cardapio para validacao. |
required |
Returns:
| Type | Description |
|---|---|
str | None
|
Texto da variante valida ou None. |
Source code in src/extratores/extrator.py
extrair_item_carrinho(mensagem: str, carrinho: list) -> list[dict]
Extrai itens do carrinho para remocao.
API compativel com a versao procedural — retorna list[dict].
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
carrinho
|
list
|
Lista de itens no carrinho atual. |
required |
Returns:
| Type | Description |
|---|---|
list[dict]
|
Lista de dicionarios com item_id, variante, indices. |
Source code in src/extratores/__init__.py
extrair_itens_troca(mensagem: str, carrinho: list[dict]) -> dict
Extrai informacoes de troca da mensagem.
API compativel com a versao procedural — retorna dict.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Mensagem do usuario. |
required |
carrinho
|
list[dict]
|
Carrinho atual. |
required |
Returns:
| Type | Description |
|---|---|
dict
|
Dict com 'caso', 'item_original' e 'variante_nova'. |
Source code in src/extratores/__init__.py
src.extratores.extrator
Extrator principal de itens do cardapio.
API publica com compatibilidade retroativa — retorna dicts para nao quebrar consumidores existentes.
Example
Extrator(engine: NlpEngine, config: ExtratorConfig, cardapio: dict)
Extrator de itens do cardapio via spaCy + fuzzy fallback.
Inicializa o extrator.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
engine
|
NlpEngine
|
NlpEngine com modelo spaCy lazy-loaded. |
required |
config
|
ExtratorConfig
|
Configuracao do extrator. |
required |
cardapio
|
dict
|
Dados do cardapio (get_cardapio()). |
required |
Source code in src/extratores/extrator.py
extrair(mensagem: str) -> list[ItemExtraido]
Extrai itens do cardapio de uma mensagem.
Tenta EntityRuler (spaCy) primeiro. Se nao encontrar itens, usa fuzzy matching como fallback para tolerar typos.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
list[ItemExtraido]
|
Lista de ItemExtraido. |
Source code in src/extratores/extrator.py
extrair_variante(mensagem: str, item_id: str) -> str | None
Extrai e valida uma variante de uma mensagem para um item especifico.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
item_id
|
str
|
ID do item no cardapio para validacao. |
required |
Returns:
| Type | Description |
|---|---|
str | None
|
Texto da variante valida ou None. |
Source code in src/extratores/extrator.py
extrair(mensagem: str) -> list[dict]
Extrai itens do cardapio de uma mensagem do usuario.
API compativel com a versao procedural — retorna list[dict].
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
list[dict]
|
Lista de dicionarios com as chaves: - item_id: ID do item no cardapio. - quantidade: Quantidade solicitada. - variante: Variante selecionada (ou None). - remocoes: Lista de ingredientes a remover. |
Example
Source code in src/extratores/extrator.py
extrair_variante(mensagem: str, item_id: str) -> str | None
Extrai e valida uma variante de uma mensagem para um item especifico.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
item_id
|
str
|
ID do item no cardapio para validacao. |
required |
Returns:
| Type | Description |
|---|---|
str | None
|
Texto da variante valida ou None. |
Source code in src/extratores/extrator.py
src.extratores.nlp_engine
Engine NLP com lazy initialization.
Wrapper do spaCy que elimina side effects no import. O modelo so e carregado na primeira chamada de processar().
Example
NlpEngine(config: ExtratorConfig, cardapio: dict)
Wrapper do spaCy com lazy initialization.
Elimina side effects no import. O modelo spaCy e o EntityRuler so sao inicializados na primeira chamada de processar().
Attributes:
| Name | Type | Description |
|---|---|---|
config |
Configuracao do extrator. |
|
cardapio |
Dados do cardapio para gerar patterns. |
Inicializa o engine sem carregar o modelo.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
config
|
ExtratorConfig
|
Configuracao com thresholds e parametros. |
required |
cardapio
|
dict
|
Dados do cardapio para gerar patterns. |
required |
Source code in src/extratores/nlp_engine.py
inicializado: bool
property
Retorna True se o modelo ja foi carregado.
nlp: spacy.language.Language | None
property
Retorna o objeto spaCy (ou None se nao inicializado).
Para uso interno — prefira processar().
processar(mensagem: str) -> Doc
Processa mensagem com o pipeline NLP.
Carrega o modelo na primeira chamada (lazy).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
Doc
|
Documento spaCy processado com entidades. |
Source code in src/extratores/nlp_engine.py
src.extratores.patterns
Geracao de patterns para o EntityRuler do spaCy.
Funcoes puras — nao dependem de estado global.
Example
gerar_patterns(cardapio: dict, normalizar: Callable[[str], str]) -> list[dict]
Gera patterns de entidade para o EntityRuler.
Cria patterns para todos os itens, aliases, variantes do cardapio e numeros escritos por extenso.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cardapio
|
dict
|
Dicionario com dados do cardapio. |
required |
normalizar
|
Callable[[str], str]
|
Funcao de normalizacao (ex: normalizar_para_busca). |
required |
Returns:
| Type | Description |
|---|---|
list[dict]
|
Lista de patterns no formato spaCy EntityRuler. |
Source code in src/extratores/patterns.py
src.extratores.normalizador
Normalizacao de texto para extracao.
Duas funcoes nomeadas com semantica clara: - normalizar_para_busca: para EntityRuler (remove pontuacao, troca hifen) - normalizar_para_fuzzy: para fuzzy matching (so unicode + lowercase)
Example
normalizar_para_busca(texto: str) -> str
Normaliza para busca no EntityRuler.
Aplica lowercase, normalizacao Unicode (remove acentos), remove pontuacao e normaliza espacos. Troca hifen por espaco.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto original. |
required |
Returns:
| Type | Description |
|---|---|
str
|
Texto normalizado em minusculas sem acentos ou pontuacao. |
Source code in src/extratores/normalizador.py
normalizar_para_fuzzy(texto: str) -> str
Normaliza para fuzzy matching.
Aplica lowercase e normalizacao Unicode (remove acentos). Preserva pontuacao interna e espacos.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto original. |
required |
Returns:
| Type | Description |
|---|---|
str
|
Texto normalizado em minusculas sem acentos. |
Source code in src/extratores/normalizador.py
src.extratores.config
Configuracao do extrator de itens do cardapio.
Centraliza thresholds, stopwords, numeros escritos e parametros do spaCy.
Example
ExtratorConfig(fuzzy_item_cutoff: int = 75, fuzzy_variante_cutoff: int = 75, ambiguidade_limite: int = 5, palavras_remocao: frozenset[str] = (lambda: frozenset({'sem', 'tira', 'remove', 'retira', 'nao coloca'}))(), palavras_parada: frozenset[str] = (lambda: frozenset({',', '.', 'com'}))(), conectivos: frozenset[str] = (lambda: frozenset({'e', 'ou'}))(), pos_ignoraveis: frozenset[str] = (lambda: frozenset({'DET', 'ADP'}))(), numeros_escritos: Mapping[str, int] = (lambda: {'um': 1, 'uma': 1, 'dois': 2, 'duas': 2, 'tres': 3, 'quatro': 4, 'cinco': 5, 'seis': 6, 'sete': 7, 'oito': 8, 'nove': 9, 'dez': 10})(), stop_words: frozenset[str] = (lambda: frozenset({'quero', 'quer', 'me', 'da', 'de', 'do', 'um', 'uma', 'uns', 'umas', 'o', 'a', 'os', 'as', 'e', 'ou', 'pra', 'para', 'por', 'pelo', 'pela', 'no', 'na', 'nos', 'nas', 'muda', 'mudar', 'troca', 'trocar', 'coloca', 'bota', 'veja', 'ver', 'mostra', 'mostrar', 'pode', 'favor', 'por favor', 'aqui', 'ali', 'isso', 'isto', 'esse', 'essa'}))(), spacy_model: str = 'pt_core_news_sm', palavras_complemento: frozenset[str] = (lambda: frozenset({'com', 'extra', 'adicional'}))(), numeros_fracionarios: Mapping[str, float] = (lambda: {'meio': 0.5, 'meia': 0.5, 'um e meio': 1.5, 'uma e meia': 1.5})(), palavras_negacao: frozenset[str] = (lambda: frozenset({'nao', 'não', 'nem', 'quero nao', 'quero não', 'esquece', 'esqueça', 'cancela', 'cancelar', 'deixa pra la', 'deixa para lá', 'deixa', 'desisto', 'muda de ideia'}))(), palavras_filtro_remocao: frozenset[str] = (lambda: frozenset({'favor', 'gentileza', 'obrigado', 'obrigada', 'também', 'tambem', 'ainda', 'mais', 'so', 'só', 'apenas', 'alem', 'além', 'depois', 'antes', 'durante', 'basico', 'básico', 'normal', 'padrao', 'padrão', 'nada', 'tudo', 'algo', 'coisa', 'pode', 'ser', 'poder', 'será', 'sera', 'por', 'pra', 'para', 'com', 'sem', 'de', 'do', 'da'}))())
dataclass
Configuracao imutavel do extrator.
Attributes:
| Name | Type | Description |
|---|---|---|
fuzzy_item_cutoff |
int
|
Score minimo para fuzzy match de itens (0-100). |
fuzzy_variante_cutoff |
int
|
Score minimo para fuzzy match de variantes (0-100). |
ambiguidade_limite |
int
|
Diferenca maxima entre top-2 scores para considerar ambiguo. |
palavras_remocao |
frozenset[str]
|
Palavras que indicam remocao de ingrediente. |
palavras_parada |
frozenset[str]
|
Palavras que interrompem captura de remocoes. |
conectivos |
frozenset[str]
|
Conectivos que podem separar remocoes. |
pos_ignoraveis |
frozenset[str]
|
POS tags do spaCy a ignorar (DET, ADP). |
numeros_escritos |
Mapping[str, int]
|
Mapeamento de numeros por extenso para inteiros. |
stop_words |
frozenset[str]
|
Stop words para fuzzy matching. |
spacy_model |
str
|
Nome do modelo spaCy a carregar. |
palavras_complemento |
frozenset[str]
|
Palavras que indicam complementos de um item. |
numeros_fracionarios |
Mapping[str, float]
|
Mapeamento de numeros fracionarios por extenso. |
palavras_negacao |
frozenset[str]
|
Palavras e expressoes que indicam negacao/cancelamento. |
palavras_filtro_remocao |
frozenset[str]
|
Palavras comuns que NUNCA devem ser capturadas como remocoes. |
get_extrator_config() -> ExtratorConfig
Retorna configuracao do extrator (cached).
Returns:
| Type | Description |
|---|---|
ExtratorConfig
|
ExtratorConfig com todos os parametros. |
src.extratores.modelos
Value objects imutaveis para extracao de itens do cardapio.
Todos os models sao frozen dataclasses — representam valores, nao entidades.
Example
ItemExtraido(item_id: str, quantidade: int | float, variante: str | None, remocoes: list[str], complementos: list[str] = list(), observacoes: list[str] = list(), confianca: float = 1.0, fonte: Literal['ruler', 'fuzzy', 'llm', 'slot_fill'] = 'ruler')
dataclass
Item extraido da mensagem do usuario.
Attributes:
| Name | Type | Description |
|---|---|---|
item_id |
str
|
ID do item no cardapio. |
quantidade |
int | float
|
Quantidade solicitada (inteira ou fracionaria). |
variante |
str | None
|
Variante selecionada (ou None). |
remocoes |
list[str]
|
Lista de ingredientes a remover. |
complementos |
list[str]
|
Lista de complementos adicionados ao item. |
observacoes |
list[str]
|
Lista de observacoes/modificadores do item. |
confianca |
float
|
Nivel de confianca na extracao (0.0 a 1.0). |
fonte |
Literal['ruler', 'fuzzy', 'llm', 'slot_fill']
|
Fonte que realizou a extracao. |
ItemOriginal(item_id: str, nome: str, indices: list[int])
dataclass
Item do carrinho identificado para troca.
Attributes:
| Name | Type | Description |
|---|---|---|
item_id |
str
|
ID do item no cardapio. |
nome |
str
|
Nome legivel do item. |
indices |
list[int]
|
Indices no carrinho que matcham este item. |
ExtracaoTroca(caso: Literal['A', 'B', 'C', 'vazio'], item_original: ItemOriginal | None, variante_nova: str | None)
dataclass
Resultado da extracao de troca.
Attributes:
| Name | Type | Description |
|---|---|---|
caso |
Literal['A', 'B', 'C', 'vazio']
|
Tipo de troca ('A', 'B', 'C', 'vazio'). |
item_original |
ItemOriginal | None
|
Item do carrinho a ser trocado (ou None). |
variante_nova |
str | None
|
Nova variante desejada (ou None). |
MatchCarrinho(item_id: str, variante: str | None, indices: list[int])
dataclass
Match de item mencionado com item do carrinho.
Attributes:
| Name | Type | Description |
|---|---|---|
item_id |
str
|
ID do item no cardapio. |
variante |
str | None
|
Variante do item no carrinho (ou None). |
indices |
list[int]
|
Indices no carrinho que matcham. |
ItemMencionado(texto: str, variante: str | None, ent_id: str)
dataclass
Item mencionado na mensagem (uso interno).
Attributes:
| Name | Type | Description |
|---|---|---|
texto |
str
|
Texto normalizado do item mencionado. |
variante |
str | None
|
Variante mencionada junto com o item (ou None). |
ent_id |
str
|
ID da entidade no spaCy (ent_id_). |
src.extratores.remocoes
Captura de remocoes de ingredientes.
Funcao pura para capturar itens a remover apos sinais como 'sem', 'tira', etc.
Example
from src.extratores.remocoes import capturar_remocoes, capturar_remocoes_v2
from src.extratores.config import get_extrator_config
config = get_extrator_config()
remocoes = capturar_remocoes(doc, config)
# Versao scope-aware (filtra ITEMs do cardapio):
itens_ids = frozenset({'hamburguer', 'batata', 'coca'})
remocoes = capturar_remocoes_v2(doc, config, itens_ids)
capturar_remocoes(doc: Doc, config: ExtratorConfig) -> list[tuple[str, int]]
Captura itens a remover apos sinais como 'sem', 'tira', etc.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
doc
|
Doc
|
Documento spaCy processado. |
required |
config
|
ExtratorConfig
|
Configuracao com palavras de remocao, conectivos, etc. |
required |
Returns:
| Type | Description |
|---|---|
list[tuple[str, int]]
|
Lista de tuplas (texto, indice_do_token). |
Source code in src/extratores/remocoes.py
capturar_remocoes_v2(doc: Doc, config: ExtratorConfig, itens_ids: frozenset[str]) -> list[tuple[str, int]]
Captura remocoes filtrando tokens que sao ITEMs do cardapio.
Diferenca para capturar_remocoes(): filtra tokens cujo nome normalizado esta em itens_ids, evitando que nomes de lanches/bebidas/acompanhamentos sejam capturados como ingredientes a remover.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
doc
|
Doc
|
Documento spaCy processado. |
required |
config
|
ExtratorConfig
|
Configuracao com palavras de remocao, conectivos, etc. |
required |
itens_ids
|
frozenset[str]
|
Set de nomes + aliases do cardapio (normalizados). |
required |
Returns:
| Type | Description |
|---|---|
list[tuple[str, int]]
|
Lista de tuplas (texto, indice_do_token). |
Source code in src/extratores/remocoes.py
src.extratores.carrinho_extrator
Extrator de itens do carrinho para remocao.
Substitui extrair_item_carrinho() do modulo procedural.
Example
CarrinhoExtrator(engine: NlpEngine, config: ExtratorConfig)
Extrai itens do carrinho para remocao.
Inicializa o extrator de carrinho.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
engine
|
NlpEngine
|
NlpEngine com modelo spaCy lazy-loaded. |
required |
config
|
ExtratorConfig
|
Configuracao do extrator. |
required |
Source code in src/extratores/carrinho_extrator.py
extrair(mensagem: str, carrinho: list[dict]) -> list[MatchCarrinho]
Extrai itens do carrinho para remocao.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Texto da mensagem do usuario. |
required |
carrinho
|
list[dict]
|
Lista de itens no carrinho atual. |
required |
Returns:
| Type | Description |
|---|---|
list[MatchCarrinho]
|
Lista de MatchCarrinho com item_id, variante e indices. |
Source code in src/extratores/carrinho_extrator.py
src.extratores.troca_extrator
Extrator de informacoes de troca de itens.
Substitui extrair_itens_troca() do modulo procedural.
Example
TrocaExtrator(engine: NlpEngine, config: ExtratorConfig)
Extrai informacoes de troca da mensagem.
Inicializa o extrator de troca.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
engine
|
NlpEngine
|
NlpEngine com modelo spaCy lazy-loaded. |
required |
config
|
ExtratorConfig
|
Configuracao do extrator. |
required |
Source code in src/extratores/troca_extrator.py
extrair(mensagem: str, carrinho: list[dict]) -> ExtracaoTroca
Extrai informacoes de troca da mensagem.
Classifica em casos: - 'A': 2+ ITEMs (troca item por item) - 'B': 1 ITEM (com ou sem variante, busca no carrinho) - 'C': 0 ITEMs + 1 VARIANTE isolada - 'vazio': nenhuma entidade relevante encontrada
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Mensagem do usuario. |
required |
carrinho
|
list[dict]
|
Carrinho atual. |
required |
Returns:
| Type | Description |
|---|---|
ExtracaoTroca
|
ExtracaoTroca com caso, item_original e variante_nova. |
Source code in src/extratores/troca_extrator.py
src.extratores.fuzzy_extrator
Fuzzy matching para fallback do extrator spaCy.
Funcoes puras para correcao de typos em nomes de itens e variantes do cardapio usando rapidfuzz.
Example
match_variante_numerica(typo: str, variantes: list[str]) -> str | None
Resolve typos em variantes numericas do tipo NNNml.
Usa substring matching: se o numero do typo e substring do numero da variante, e um match. Ex: '50' em '500' → match.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
typo
|
str
|
Texto digitado pelo usuario. |
required |
variantes
|
list[str]
|
Lista de variantes validas do cardapio. |
required |
Returns:
| Type | Description |
|---|---|
str | None
|
Variante matchada, ou None se ambiguo ou sem match. |
Example
Source code in src/extratores/fuzzy_extrator.py
extrair_tokens_significativos(texto: str) -> list[str]
Remove stop words e retorna tokens relevantes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto da mensagem do usuario. |
required |
Returns:
| Type | Description |
|---|---|
list[str]
|
Lista de tokens significativos. |
Example
Source code in src/extratores/fuzzy_extrator.py
fuzzy_match_item(texto: str, alias_para_id: dict[str, str], cutoff: int | None = None) -> tuple[str | None, float, str | None]
Fuzzy match de texto contra aliases do cardapio.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto digitado pelo usuario. |
required |
alias_para_id
|
dict[str, str]
|
Mapeamento alias → item_id. |
required |
cutoff
|
int | None
|
Score minimo (0-100). Usa config se None. |
None
|
Returns:
| Type | Description |
|---|---|
tuple[str | None, float, str | None]
|
Tupla (alias_match, score, item_id) ou (None, 0, None). |
Source code in src/extratores/fuzzy_extrator.py
fuzzy_match_variante(texto: str, variantes: list[str], cutoff: int | None = None) -> tuple[str | None, float]
Fuzzy match de texto contra variantes validas.
Usa match_variante_numerica primeiro para variantes do tipo NNNml. Depois tenta fuzzy normal com deteccao de ambiguidade.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto digitado pelo usuario. |
required |
variantes
|
list[str]
|
Lista de variantes validas do cardapio. |
required |
cutoff
|
int | None
|
Score minimo (0-100). Usa config se None. |
None
|
Returns:
| Type | Description |
|---|---|
tuple[str | None, float]
|
Tupla (variante_match, score) ou (None, 0). |
Source code in src/extratores/fuzzy_extrator.py
extrair_item_fuzzy(mensagem: str, quantidade: int = 1) -> list[ItemExtraido]
Fallback fuzzy completo quando EntityRuler nao encontra itens.
Tenta match do item via fuzzy e extrai variante dos tokens significativos da mensagem.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
mensagem
|
str
|
Mensagem original do usuario. |
required |
quantidade
|
int
|
Quantidade extraida de outra fonte (ou 1). |
1
|
Returns:
| Type | Description |
|---|---|
list[ItemExtraido]
|
Lista com 0 ou 1 ItemExtraido encontrado via fuzzy. |
Example
Source code in src/extratores/fuzzy_extrator.py
normalizar(texto: str) -> str
Normaliza para fuzzy matching.
Aplica lowercase e normalizacao Unicode (remove acentos). Preserva pontuacao interna e espacos.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
texto
|
str
|
Texto original. |
required |
Returns:
| Type | Description |
|---|---|
str
|
Texto normalizado em minusculas sem acentos. |