Comparar duas frases pela fonética – [MS – SQL]

Em algumas situações necessitamos comparar duas frases e tentar identificar a proximidade entre elas. O SQL server fornece a função SOUNDEX que nos permite comparar pela fonética se duas palavras são parecidas. Mas quando temos uma frase, é necessário comparar palavra por palavra, o que torna o processo um pouco chato de se realizar e oneroso no quesito performance.

Também, temos que levar em consideração que algumas palavras podem fornecer resultados parecidos. Mas não são a mesma palavra. Assim precisamos criar mecanismos para aumentar a acertividade de nossa função.

Veja o caso abaixo, quando comparamos duas palavras. Elas possuem a mesma fonética!

Experimente o seguinte no query analyzer:

select soundex('real'), soundex('royal')

Se comparmos uma frase, utilizando o SOUNDEX, iremos receber o comparativo da primeira palavra apenas… Isto pode ser visto no próximo exemplo:

select soundex('real Brasil'), soundex('Real America')

Bem, então poderiamos quebrar duas frases em várias palavras e comparar palavra por palavra se elas possuem a mesma fonética. A função abaixo foi utilizada para isto.

Para utilizá-la, é necessário passar 3 parâmetros… 2 Frases a comparar e o número de palavras dentro da frase que serão comparadas.Ela retorna 1 se a frase possuir a mesma fonética e 0 caso contrário.

Este exemplo utiliza duas variáveis de tabela… Quebra as frases em palavras dentro destas variáveis, mais ou menos como o comando SPLIT que muitos programadores utilizam em outras linguagens. Depois percorre linha a linha da tabela comparando uma palavra com outra que esteja na mesma posição.

Veja o código:

CREATE FUNCTION proximidadeNomes (
@texto as varchar(100),
@comparar as varchar(100),
@palavras int = 7
)
RETURNS int

AS
BEGIN

Declare @nomes1 table
(Id int primary key,nome1 varchar(50))

Declare @nomes2 table
(Id int primary key,nome2 varchar(50))

Declare @caracter char(1),
@total int,
@item int,
@ultimo int,
@words int,
@cursor1 Cursor,
@resultado int,
@palavras1 int,
@palavras2 int

SET @resultado =1
SET @item = 1
SET @ultimo =1
SET @total = LEN(@texto) +1
SET @words = 0
--PRIMEIRA FRASE
WHILE @item <=@total BEGIN --print substring(@texto,@item,1) IF substring(@texto,@item,1) = ' ' BEGIN SET @words = @words +1 IF @words<=@palavras INSERT INTO @nomes1 (Id,nome1) values (@words, substring(@texto,@ultimo,@item-@ultimo)) SET @ultimo= @item +1 END SET @item = @item +1 END --SEGUNDA FRASE SET @item = 1 SET @ultimo =1 SET @total = LEN(@comparar) +1 SET @words = 0 IF ABS(LEN(@texto) -LEN(@comparar)) <=20 BEGIN WHILE @item <=@total BEGIN --print substring(@texto,@item,1) IF substring(@comparar,@item,1) = ' ' BEGIN SET @words = @words +1 IF @words<=@palavras INSERT INTO @nomes2 (Id,nome2) values (@words, substring(@comparar,@ultimo,@item-@ultimo)) SET @ultimo= @item +1 END SET @item = @item +1 END --COMPARANDO OS RESULTADOS SET @cursor1 = CURSOR FOR SELECT CASE WHEN SOUNDEX(nome1)=SOUNDEX(nome2) THEN 1 ELSE 0 END [IGUAL] FROM @nomes1 t1, @nomes2 t2 WHERE t1.Id=t2.Id -- OPEN @cursor1 FETCH NEXT FROM @cursor1 INTO @resultado WHILE (@@FETCH_STATUS = 0) AND @resultado=1 BEGIN FETCH NEXT FROM @cursor1 INTO @resultado END CLOSE @cursor1 DEALLOCATE @cursor1 END ELSE BEGIN SET @resultado =0 END -- Return the result of the function RETURN @resultado END GO

Experimente realizar agora a seguinte comparação:

SELECT [DBO].[PROXIMIDADENOMES]('Real América Sul','Real Brasil AIC',1)

Repita agora modificando o número de palavras :

1-SELECT [DBO].[PROXIMIDADENOMES]('Real América','Real Brasil',2)

2-SELECT [DBO].[PROXIMIDADENOMES]('Real América ABC','Real América OMG ',2)

3-SELECT [DBO].[PROXIMIDADENOMES]('Real América ABC','Real América OMG ',3)

Tiago Gomes Larios

Back To Top