Autor Tópico: Pesquisa Fonética  (Lida 5211 vezes)

Alcebiades

  • Novato
  • *
  • Mensagens: 28
    • Email
Pesquisa Fonética
« Online: Setembro 11, 2009, 01:36:58 pm »
Seria bom termos uma SC_fonetica(), para implementarmos a pesquisa fonética em português, para qualquer banco.
Hoje eu implementei uma pl/sql pro postgres, usei a função do maysql... mas se tenho de mudar de banco complica, não !!! eu quis dizer da trabalho. Não creio que seja tão difícil implementar. Já estou pensando em fazê-lo com uma biblioteca

Erico Oliveira

  • Iniciante
  • **
  • Mensagens: 80
    • Erico Oliveira
    • Email
Re: Pesquisa Fonética
« Responder #1 Online: Novembro 18, 2009, 10:31:27 am »
Prezado Alcebíades,

Em que casos seria utilizada essa pesquisa fonética???

Você poderia citar um exemplo prático para ver se temos alguma macro que possa lhe ajudar??

Aguardo contato

Atenciosamente

Érico Oliveira
Érico Oliveira

wanderlanlima

  • Intermediário
  • ***
  • Mensagens: 241
    • Email
Re: Pesquisa Fonética
« Responder #2 Online: Fevereiro 25, 2011, 06:39:40 pm »
Caro Erico Oliveira,

Um bom exemplo é o que estou fazendo onde trabalho, um sistema de questionários, tenho uma tabela de perguntas, e ao cadastrar perguntas, por exmplo:

codigo, descrição
1         quantos habitantes tem em São Paulo ?
2         quantos habitantes tem em Sao Paulo ?

as duas perguntas são diferentes, mesmo criando uma chave única para descrição ou até mesmo um metodo no before insert ou no onvalidate, concorda ?

com uma pesquisa fonética seria mais fácil evitar esse transtorno !

« Última modificação: Fevereiro 28, 2011, 10:33:34 am por wanderlanlima »

lowczy

  • Iniciante
  • **
  • Mensagens: 92
    • Email
Re: Pesquisa Fonética
« Responder #3 Online: Fevereiro 25, 2011, 07:19:27 pm »
trabalhei muito com banco de dados comprados para telemarketing

um outro exemplo seria quando o operador tem que procurar um nome

Maria da Silva
Mario da Silva

foneticamente o operador escuta proximo entao vc teria um nome do tipo
MrSlv que localizaria os dois

clifortravaini

  • Novato
  • *
  • Mensagens: 31
    • Email
Re: Pesquisa Fonética
« Responder #4 Online: Fevereiro 28, 2011, 01:54:14 pm »
Olá Alcebiades,

Utilizo postgres e estou a tempos atrás de um código para
resolver este problema da fonética,

Poderia postar a sua solução, ou enviar por email para eu
ver como resolveu este problema ?


Realmente seria de grande ajuda uma pesquisa fonetica()
principalmente se esta funcionar em busca auto-complete,
onde o usuário busca por exemplo:

Humberto ou Umberto, Souza ou Sousa, entre outros
exemplos.

Agradeço se me enviar como resolver.


Obrigado,

Clifor Travaini
Solução Informática Jundiaí Ltda.
www.solucaojundiai.com.br




jovitomelo

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 916
    • Simples Assim
    • Email
Re: Pesquisa Fonética
« Responder #5 Online: Maio 03, 2011, 11:39:48 pm »
Jovito Melo
Maceió - Alagoas

cledson

  • Novato
  • *
  • Mensagens: 17
Re:Pesquisa Fonética
« Responder #6 Online: Setembro 11, 2013, 01:35:46 pm »
Olá Alcebiades,

Tb utilizo postgres e me deparo com  o mesmo problema.
Poderia postar a sua solução  para eu ver como foi feito e ver se dar pra resolver o meu problema ?
valeu.


clifortravaini

  • Novato
  • *
  • Mensagens: 31
    • Email
Re:Pesquisa Fonética
« Responder #7 Online: Setembro 11, 2013, 02:03:12 pm »
À quem interessar, com algumas modificações dá para utilizar...


CREATE OR REPLACE FUNCTION fc_fonetica( text) RETURNS text AS
$BODY$
declare
        sString  text;
        sRetorno text;
        cLetra   char(1);
        cProximaLetra char(1);
        cLetraAnterior char(1);
        iConta   integer;
begin

        if ($1 is not null) then
        sString  := trim(upper($1));
        sRetorno := '';
       
        for iConta in 1..length(sString)
        loop
                cLetra         := substr(sString, iConta, 1);
                cProximaLetra  := substr(sString, iConta+1, 1);
                cLetraAnterior := substr(sString, iConta-1, 1);

                if cLetra = ' ' then
                        sRetorno := sRetorno || '0';
                       
                elsif cLetra = 'C' then
                       
                        if cProximaLetra = 'H' then
                                sRetorno := sRetorno || 'X';

                        elsif cProximaLetra in ('E', 'I') then
                                sRetorno := sRetorno || 'SS';

                        else
                                sRetorno := sRetorno || 'K';

                        end if;

                elsif cLetra in ('B', 'D', 'F', 'G', 'J', 'K', 'L', 'M', 'R',
'T', 'V', 'X')
then
                        sRetorno := sRetorno || cLetra;

                elsif cLetra = 'N' then
                       
                        if cProximaLetra in ('', '0') or cProximaLetra not in
('A', 'E', 'I', 'O', 'U') then
                                sRetorno := sRetorno || 'M';
                        else
                                sRetorno := sRetorno || 'N';
                        end if;
                       
                elsif cLetra = 'P' then
                       
                        if cProximaLetra = 'H' then
                                sRetorno := sRetorno || 'F';
                        else
                                sRetorno := sRetorno || 'P';
                        end if;
               
                elsif cLetra = 'Q' then
                        sRetorno := sRetorno || 'K';

                elsif cLetra = 'S' then
               
                        if cProximaLetra = 'H' then
                                sRetorno := sRetorno || 'X';
                        elsif cLetraAnterior = 'S' or cProximaLetra = 'S' or
cProximaLetra not in
('A', 'E', 'I', 'O', 'U') then
                                sRetorno := sRetorno || 'S';
                        elsif iConta = 0 or cProximaLetra not in ('A', 'E',
'I', 'O', 'U') then
                                sRetorno := sRetorno || 'SS';
                        else
                                sRetorno := sRetorno || 'Z';
                        end if;
                       
                elsif cLetra = 'W' then
                       
                        if cProximaLetra in ('A', 'E', 'I', 'O', 'U') then
                                sRetorno := sRetorno || 'V';
                        end if;

                elsif cLetra = 'Z' then

                        if cProximaLetra = 'Z' then
                                sRetorno := sRetorno || 'Z';
                        elsif cLetraAnterior = 'Z' then
                                sRetorno := sRetorno || '';
                        elsif cProximaLetra not in ('A', 'E', 'I', 'O', 'U')
then
                                sRetorno := sRetorno || 'S';
                        elsif cProximaLetra = '' then
                                sRetorno := sRetorno || 's';
                        else
                                sRetorno := sRetorno || 'Z';
                        end if;

                end if;

        end loop;

        return sRetorno;
else
        return '';
end if;
end;
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE;