"Dice's coefficient, named after Lee Raymond Dice and also known as the Dice coefficient, is a similarity measure over sets."
Código para PSQL (POSTGRESQL)
CREATE OR REPLACE FUNCTION cgu_planilha.dice(texto1 character varying, texto2 character varying)
RETURNS double precision AS
$BODY$
DECLARE
qtde1 integer;
qtde2 integer;
tam_texto1 integer;
tam_texto2 integer;
tam_texto integer;
nt float;
nx float;
ny float;
ch1 varchar;
ch2 varchar;
t1 varchar;
t2 varchar;
BEGIN
qtde1 := 0;
t1 := lower(texto1);
t2 := lower(texto2);
t1 := translate(t1, 'áéíóúàèìòùãõâêîôôäëïöüçÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇ', 'aeiouaeiouaoaeiooaeioucAEIOUAEIOUAOAEIOOAEIOUC');
t2 := translate(t2, 'áéíóúàèìòùãõâêîôôäëïöüçÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇ', 'aeiouaeiouaoaeiooaeioucAEIOUAEIOUAOAEIOOAEIOUC');
tam_texto1 := length(t1);
tam_texto2 := length(t2);
nx = tam_texto1-1;
ny = tam_texto2-1;
if (tam_texto2 > tam_texto1) then
tam_texto := tam_texto1;
else
tam_texto := tam_texto2;
end if;
nt := 0;
LOOP
ch1 = substr(t1, qtde1, 2);
ch2 = substr(t2, qtde1, 2);
if (ch1 = ch2) then
nt := nt +1;
end if;
qtde1 := qtde1 + 1;
IF qtde1 > tam_texto THEN
EXIT; -- exit loop
END IF;
END LOOP;
RETURN (2*nt)/(nx+ny);
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION cgu_planilha.dice(character varying, character varying) OWNER TO postgres;
Aplicação do algoritmo para uma frase
CREATE OR REPLACE FUNCTION dice_frase2(texto1 character varying, texto2 character varying)
RETURNS boolean AS
$BODY$
DECLARE
alvo_pesquisa varchar;
t1 varchar;
t2 varchar;
tamanho2 integer;
tamanho1 integer;
i integer;
j integer;
texto_original varchar;
BEGIN
-- determinando o tamanho da segunda palavra
tamanho2:=length(texto2);
tamanho1:=length(texto1);
-- pesquisando na primeira frase
i := 1;
texto_original := texto1;
loop
alvo_pesquisa := substr(texto_original, i, tamanho2);
insert into lixo values(alvo_pesquisa, texto2, dice(alvo_pesquisa, texto2));
if (dice(alvo_pesquisa, texto2)>0.75) then
return true;
end if;
i := i+1;
if (tamanho1 <= i) then
exit;
end if;
end loop;
return false;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
Aplicação do algoritmo para um conjunto de palavras em qualquer ordem
CREATE OR REPLACE FUNCTION dice_frase3(texto1 character varying, texto2 character varying)
RETURNS boolean AS
$BODY$
DECLARE
ch2 varchar;
t1 varchar;
t2 varchar;
i integer;
j integer;
k integer;
BEGIN
j := 1;
k := 1;
loop
t2 = split_part(texto2, ' ',j);
if (length(t2)=0) then
exit;
end if;
i:=1;
loop
t1 = split_part(texto1, ' ',i);
if (length(t1)=0) then
exit;
end if;
insert into lixo values (t1, t2, i ||' '|| j || ' '|| k);
if (dice(t1, t2)>0.75) then
k := k+1;
exit;
end if;
i := i+1;
end loop;
j := j+1;
end loop;
if (j = k) then
return true;
else
return false;
end if;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION dice_frase(character varying, character varying)
OWNER TO postgres;