SOS-RS / backend

Auxílio RS: Projetos de Resposta a Emergências por Chuvas e Alagamentos
https://sos-rs.com
MIT License
712 stars 306 forks source link

[BUG] Itens repetidos ou indevidamente cadastrados #112

Closed jeanbispo closed 3 months ago

jeanbispo commented 3 months ago

Esse problema foi citado em issues no front end, e acredito que parte da solução seja no backend.

Issue frontend #175 Issue frontend #167

O que penso como uma possível solução é usar um semantic search para o cadastro dos itens, ele evitaria o cadastro de Água e Agua, por exemplo. Para os que já estão cadastrados, caberia a criação e execução de um script para varrer o banco, identificar semelhanças e unificar os inputs.

O que conheço de recurso para isso demandaria um serviço a mais na infra, então peço que participem do debate com sugestões para resolver o problema, principalmente se por questões de infra não for viável o uso do Sonic ou Typesense por exemplo.

Obviamente a solução mais simples e sugerida nas outras issues citadas, seria criar uma página para curadoria dos itens, porém demandaria um trabalho manual e atuação constate de alguém, o que talvez não seja eficiente.

renanmpn commented 3 months ago

Criar um slugify como chave de produto deve resolver parte dos problemas também.

viniirbr commented 3 months ago

Não conheço nenhuma dessas ferramentas, @jeanbispo, mas temos que ter em mente que tem que haver uma flexibilidade para os abrigos criarem itens como "Água 20L" e "Roupas G". A depender da complexidade de implementar um semantic search, talvez uma verificação básica seja suficiente para prevenir coisas absurdas como "Água" e "agua". Pensei em algo que alertasse que já existem itens parecidos, mas que não fosse proibitivo. Se uma pessoa criasse "Roupa M", por exemplo, ele exibiria uma lista de itens com a palavra "roupa" para a pessoa verificar se algum deles se enquadra no que ela quer criar

viniirbr commented 3 months ago

Como isso ajudaria, @renanmpn?

gregdusoli commented 3 months ago

Penso que a primeira abordagem para começar a resolver o problema seria um tratamento (sanitização) nos inputs de forma a:

viniirbr commented 3 months ago

Sim, é um bom começo. Mas como o autocomplete ajudaria, se estamos tentando prevenir justamente que a pessoa preencha valores que já existem? Não seria melhor algum tipo de alerta ou sugerir a seleção de itens já cadastrados?

alexanderscheibler commented 3 months ago

Talvez não necessariamente autocomplete...

Mas e se a pessoa digitasse o item e embaixo aparecesse umas pílulas com os itens semelhantes ao que ela está digitando?

Poderia ter uma mensagem do tipo: "Encontramos esses itens já no cadastro. É um deles ou precisa criar um novo?"

Não sei quão complexo ou difícil isso seria de implementar. Mas acho que ajudaria um pouco já a filtrar repetição e/ou erros de digitação.

jeanbispo commented 3 months ago

A solução do @gregdusoli é excelente e cobre a flexibilidade que é muito pertinente citada pelo @viniirbr, resolveria boa parte dos problemas sim. Creio que dá para evoluir ela, eu me coloco à disposição para executar, exceto caso alguém tenha interesse e mais tempo disponível que eu, mas acho que seria legal construirmos essa arquitetura aqui juntos antes de executar, até mesmo pra exaurimos o máximo de possibilidades.

Botando um pouco de pimenta no debate, acredito que podemos ir mais além no problema da compreensão das semânticas, podem existir inúmeros erros de digitação ou semelhança possíveis. Cobrir um a um via código é inviável.

Pesquisei e encontrei uma solução que não exige infra como as engines de semantic search. https://github.com/xenova/transformers.js Resumidamente a ideia é usar NLP para compreender o novo input e sugerir com base no que temos no backend como contexto. Seria bom alguém com experiência nisso pra ajudar a encontrar um modelo adequado que aceite português e funcione bem para esse caso. Claro, a complexidade disso é maior que a sanitização, porém aumentaria consideravelmente a qualidade e quantidade das sugestões.

thiagoalvesfoz commented 3 months ago

Um filtro search com case-insensitve LIKE não resolveria? ai basta finalizar no frontend para procurar e mostrar todos itens encontrados após 3 palavras digitadas?

É uma solução simples, porém a depender do volume de acessos de usuários, pode ser um pouco punitivo na quantidade idas no banco de dados.

BrunoPC66 commented 3 months ago

Não li todos os comments ainda, mas imagino que poderíamos criar uma busca para os itens e criar subcategorias (como X litros, tamanho x, etc). Não sou expert em nada, mas será que uma função básica de verificação quebrando o input e verificando a existência de alguma parte desse input no DB e mostrando as opções para a pessoa, não seria o suficiente? Caso não exista o item, a pessoa pode inserir no nosso DB, porém colocamos um pedido a pessoa que seja objetiva ao identificar o item. Exemplo no campo do input seria "Nome genérico do item: xxxxxxx", depois "Especificação do item: xxxxxxx".

BrunoPC66 commented 3 months ago

Se criarmos essa objetividade nos itens, isso irá quebrar uma barreira e ajudar e muito na hora de pessoas buscarem fazer doações. Para que não seja necessário clicar em cada palavra semelhante para descobrir para onde doar, criando uma visão mais macro, porém direcionada, de quem precisa do que.

alexanderscheibler commented 3 months ago

Faltou mencionar a issue https://github.com/SOS-RS/frontend/issues/160

A ideia do gustavocs é boa.

giggio commented 3 months ago

Duplicado do SOS-RS/frontend#254.