Re: [delphi-br] Similaridade entre duas Strings
Guionardo, tu tá de sacanagem, né.. Quando descansar bem, completa a explanação com um componente aqui prá nois, Matou a cobra, agora mostra o componente (se ainda houver fosfato). Parabéns e entenda a brincadeira como elogio Abraço Roberto (RJ) - Original Message - From: Guionardo Furlan To: delphi-br@yahoogrupos.com.br Sent: Tuesday, October 07, 2008 10:13 PM Subject: Re: [delphi-br] Similaridade entre duas Strings um bom exercício, vou dar meu palpite: 1. transformar os textos para a mesma caixa (alta ou baixa) 2. Verificar se os textos são iguais: se forem, similaridade 100% e termina o processo. 3. para cada caracter do texto origem verificar se ele existe no texto destino, e em caso positivo, incrementar 1 no contador de similaridade. 4. o quociente contador / número de caracteres no destino indica a similaridade sem considerar a ordem dos caracteres. Por exemplo, pedto e pedro são similares 4 caracteres em 5, indicando 80% de similaridade sem verificação de ordem. 5. considerando a ordem, remove-se os caracteres da origem que não existem no destino e os caracteres do destino que não existem na origem, igualando os dois textos 6. agora, com uma função que gere uma lista de palavras formadas pelos caracteres da origem, da seguinte forma: origem ajustada: peto, com os caracteres não coincidentes removidos, a lista gerada seria a seguinte p, e, t, o, pe, et, to, pet, eto, peto: 4 caracteres = 10 palavras map = m, a, p, ma, ap, map: 3 caracteres = 6 palavras jorge = j, o, r, g, e, jo, or, rg, ge, jor, org, rge, jorg, orge, jorge: 5 caracteres = 15 palavras O número de palavras dentro da lista é definido pela fórmula 0,5j^2+0,5j, onde j é o número de caracteres do texto origem ajustado. Cada palavra da lista encontrada dentro da palavra destino ajustada incrementa uma unidade no contador de similaridade de ordem. A similaridade de ordem é o quociente do contador sobre o número de palavras da lista. No exemplo acima, temos a mesma ordem dos caracteres e portanto, 100% de similaridade por ordem. Multiplicando os dois quocientes, teríamos um fator de similaridade entre as palavras, neste caso, 80% x 100% = 80% com outro exemplo, poderíamos ter: JOAO e JONAS As letras J, O, A e O existem todas dentro de JONAS, portanto temos 100% até aqui Fazendo a intersecção, temos os dois textos ajustados: JOAO e JOA com a lista de palavras temos J (1), O (1), A (1), O (1), JO (1), OA (1), AO (0), JOA (1), OAO (0), JOAO (0), somando 7 coincidências em 10 possibilidades, resultando em 70%. Multiplicando os dois quocientes, temos 70% de similaridade. Agora é só codificar pra OP e ver se a coisa serve. PS: fiz isso depois da janta, e meio cansado. Provavelmente deve haver um algoritmo mais elaborado, usando redes neurais, ou até mesmo uma função do delphi que resolve a parada. Mas é legal pra gente queimar um pouco de fosfato fora dos problemas comuns. 2008/10/7 Osmar Souza [EMAIL PROTECTED]: Olá Pessoal, Alguem já precisou comparar a similaridade entre duas strings e supor a porcetagem de similaridade entre elas? Exemplo: Em uma caixa de texto a pessoa digitou pedto. O sistema analisou e pergunta se o que ele esta procurando não é pedro. Como no Google. Estou precisando de um algoritimo desses para tentar diminuir o número de erros no cadastro. Como os requisitos do sistema diz que o nome é o mais importante e que o resto não é necessário, vemos uma mesma pessoa jurídica, por exemplo, cadastradas de 10 formas diferentes. -- Timeo hominem unius libri Cogito ergo sum - Carpe diem []s Guionardo Furlan http://guionardo.blogspot.com -- No virus found in this incoming message. Checked by AVG - http://www.avg.com Version: 8.0.173 / Virus Database: 270.7.6/1712 - Release Date: 7/10/2008 09:41 [As partes desta mensagem que não continham texto foram removidas]
RE: [delphi-br] Similaridade entre duas Strings
How to determine if a string matches a pattern (http://delphi.about.com/cs/adptips2003/a/bltip0203_3.htm?nl=1) { Usage: if IsLike('About Delphi', 'Abo?? Delp*') then ShowMessage('A match!') ; } uses SysUtils; function IsLike(AString, Pattern: string): boolean; var j, n, n1, n2: integer ; p1, p2: pchar ; label match, nomatch; begin AString := UpperCase(AString) ; Pattern := UpperCase(Pattern) ; n1 := Length(AString) ; n2 := Length(Pattern) ; if n1 n2 then n := n1 else n := n2; p1 := pchar(AString) ; p2 := pchar(Pattern) ; for j := 1 to n do begin if p2^ = '*' then goto match; if (p2^ '?') and ( p2^ p1^ ) then goto nomatch; inc(p1) ; inc(p2) ; end; if n1 n2 then begin nomatch: Result := False; exit; end else if n1 n2 then begin for j := n1 + 1 to n2 do begin if not ( p2^ in ['*','?'] ) then goto nomatch ; inc(p2) ; end; end; match: Result := True end; ~ Sds. To: delphi-br@yahoogrupos.com.br From: [EMAIL PROTECTED] Date: Tue, 7 Oct 2008 23:40:49 -0300 Subject: Re: [delphi-br] Similaridade entre duas Strings Caramba que se faz como hobby ? resolve problemas quanticos heheheheh... []s Luiz Escobar - Original Message - From: Guionardo Furlan To: delphi-br@yahoogrupos.com.br Sent: Tuesday, October 07, 2008 10:13 PM Subject: Re: [delphi-br] Similaridade entre duas Strings PS: fiz isso depois da janta, e meio cansado. Provavelmente deve haver um algoritmo mais elaborado, usando redes neurais, ou até mesmo uma função do delphi que resolve a parada. Mas é legal pra gente queimar um pouco de fosfato fora dos problemas comuns. _ Confira vídeos com notícias do NY Times, gols direto do Lance, videocassetadas e muito mais no MSN Video! http://video.msn.com/?mkt=pt-br
Re: [delphi-br] Similaridade entre duas Strings
Elogio de vez em quando vai bem, eheh. Bom, tá aí o código, testado por aqui e funcionando. No meu cálculo manual deu diferença ao comparar os nomes JOÃO e JONAS porque não considerei a diferença de tamanho das strings. Não é um componente, é uma função. unit GStrings; interface /// Obtém a similaridade entre duas strings retornando um valor entre 0 e 1 function Similaridade(Origem, Destino: string): Single; implementation uses SysUtils, GuioUtils; function Similaridade(Origem, Destino: string): Single; var i: Integer; SimCar: Integer; // Similaridade de caracteres SimOrd: Integer; // Similaridade de ordem Lista: array of string; function Validacao: Boolean; begin Result := (Length(Origem) 0) and (Length(Destino) 0); end; procedure SimilaridadeCaracter; var j: Integer; begin SimCar := 0; for j := 1 to Length(Origem) do if Pos(Origem[j], Destino) 0 then Inc(SimCar); end; procedure RemoveNaoCoincidentes(var s1, s2: string); begin i := 1; while i = Length(s1) do if Pos(s1[i], s2) = 0 then Delete(s1, i, 1) else Inc(i); end; procedure GeraLista; var npalavras: Integer; // Número de palavras j, k: Integer; begin npalavras := (Sqr(Length(Origem)) + Length(Origem)) div 2; SetLength(Lista, npalavras); i := 0; for j := 1 to Length(Origem) do // j recebe o tamanho de cada palavra for k := 1 to Length(Origem) - j + 1 do // k recebe a posicao de cada palavra begin Lista[i] := Copy(Origem, k, j); Inc(i); end; end; procedure SimilaridadeOrdem; var j: Integer; begin SimOrd := 0; for j := 0 to Length(Lista) - 1 do if Pos(Lista[j], Destino) 0 then Inc(SimOrd); Result := Result * (SimOrd / Length(Lista)); SetLength(Lista, 0); end; begin // 1. Transformar os textos para a mesma caixa e remover espaços em branco Origem := AnsiUpperCase(Trim(RemoveAcentos(Origem))); Destino := AnsiUpperCase(Trim(RemoveAcentos(Destino))); // 2a. Verificar se os textos são vazios: se forem, similaridade 0 e sai if not Validacao then begin Result := 0; Exit; end; // 2b. Verificar se os textos são iguais: se forem, similaridade 100% // e termina o processo if SameText(Origem, Destino) then begin Result := 1; Exit; end; // 3. para cada caracter do texto origem verificar se ele existe no texto // destino, e em caso positivo, incrementar 1 no contador de similaridade. SimilaridadeCaracter; // 4. o quociente contador / número de caracteres no destino indica a // similaridade sem considerar a ordem dos caracteres. Result := SimCar / Length(Destino); if Result = 0 then Exit; // 5. considerando a ordem, remove-se os caracteres da origem que não // existem no destino e os caracteres do destino que não existem na // origem, igualando os dois textos RemoveNaoCoincidentes(Origem, Destino); RemoveNaoCoincidentes(Destino, Origem); // 6. agora, com uma função que gere uma lista de palavras formadas // pelos caracteres da origem, da seguinte forma: // origem ajustada: peto, com os caracteres não coincidentes removidos, // a lista gerada seria a seguinte // p, e, t, o, pe, et, to, pet, eto, peto: 4 caracteres = 10 palavras // map = m, a, p, ma, ap, map: 3 caracteres = 6 palavras // jorge = j, o, r, g, e, jo, or, rg, ge, jor, org, rge, jorg, orge, // jorge: 5 caracteres = 15 palavras // O número de palavras dentro da lista é definido pela fórmula // 0,5j^2+0,5j, onde j é o número de caracteres do texto origem ajustado. GeraLista; // Cada palavra da lista encontrada dentro da palavra destino ajustada // incrementa uma unidade no contador de similaridade de ordem. // A similaridade de ordem é o quociente do contador sobre o número de // palavras da lista. SimilaridadeOrdem; end; end. - PS: Duas referências no código (guioutils e RemoveAcentos) não estão disponíveis. É que minha função de remoção de acentos usa uma tecnologia avançadíssima com algoritmos genéticos e inteligência artificial, portanto não disponibilizarei de grátis aqui. :-) 2008/10/8 Roberto [EMAIL PROTECTED]: Guionardo, tu tá de sacanagem, né.. Quando descansar bem, completa a explanação com um componente aqui prá nois, Matou a cobra, agora mostra o componente (se ainda houver fosfato). Parabéns e entenda a brincadeira como elogio Abraço Roberto (RJ) - Original Message - From: Guionardo Furlan To: delphi-br@yahoogrupos.com.br Sent: Tuesday, October 07, 2008 10:13 PM Subject: Re: [delphi-br] Similaridade entre duas Strings um bom exercício, vou dar meu palpite: 1. transformar os textos para a mesma caixa (alta ou baixa) 2. Verificar se os textos são iguais: se forem, similaridade 100% e termina o processo. 3. para cada caracter do texto origem verificar se ele existe no texto destino, e em caso positivo, incrementar 1 no contador de similaridade. 4. o quociente contador / número de caracteres no destino indica
Res: [delphi-br] Similaridade entre duas Strings
Olá pessoal, Guionardo, você não é brincadeira não, matou a dúvida e mostrou a função, rsrsrsrsrsrsrs. Desse jeito os 2 demos que coloquei na 4shared vão virar sarcófagos, rsrsrsrsrsrsrs. Você é fera, isso não é um elogio, é a realidade. Funções úteis para strings (as que iniciam com 'sc' foram escritas por mim): --- function scRemoveAllChars(Ch: Char; S: string): string; var I: Integer; begin I := Length(S); while (Length(S) 0) and (I 0) do begin if S[I] = Ch then Delete(S, I, 1); Dec(I); end; Result := S; end; --- function scRemoveCharactersOfString(Chrs: array of Char; Str: string): string; var I: Integer; S: string; begin S := Str; for I := 0 to High(Chrs) do S := scRemoveAllChars(Chrs[I], S); Result := S; end; --- function RemovesAccent1(S: string): string; const WithAccent = 'àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ'; Stressless = 'aaeouaoaeioucuAAEOUAOAEIOUCU'; var I: Integer; begin for I := 1 to Length(S) do if Pos(S[I], WithAccent) 0 then S[I] := Stressless[Pos(S[I], WithAccent)]; Result := S; end; --- function RemovesAccents2(S: string ): string; var I: Integer; begin for I := 1 to Length(S) do case S[I] of 'á': S[I] := 'a'; 'é': S[I] := 'e'; 'í': S[I] := 'i'; 'ó': S[I] := 'o'; 'ú': S[I] := 'u'; 'à': S[I] := 'a'; 'è': S[I] := 'e'; 'ì': S[I] := 'i'; 'ò': S[I] := 'o'; 'ù': S[I] := 'u'; 'â': S[I] := 'a'; 'ê': S[I] := 'e'; 'î': S[I] := 'i'; 'ô': S[I] := 'o'; 'û': S[I] := 'u'; 'ä': S[I] := 'a'; 'ë': S[I] := 'e'; 'ï': S[I] := 'i'; 'ö': S[I] := 'o'; 'ü': S[I] := 'u'; 'ã': S[I] := 'a'; 'õ': S[I] := 'o'; 'ñ': S[I] := 'n'; 'ç': S[I] := 'c'; 'Á': S[I] := 'A'; 'É': S[I] := 'E'; 'Í': S[I] := 'I'; 'Ó': S[I] := 'O'; 'Ú': S[I] := 'U'; 'À': S[I] := 'A'; 'È': S[I] := 'E'; 'Ì': S[I] := 'I'; 'Ò': S[I] := 'O'; 'Ù': S[I] := 'U'; 'Â': S[I] := 'A'; 'Ê': S[I] := 'E'; 'Î': S[I] := 'I'; 'Ô': S[I] := 'O'; 'Û': S[I] := 'U'; 'Ä': S[I] := 'A'; 'Ë': S[I] := 'E'; 'Ï': S[I] := 'I'; 'Ö': S[I] := 'O'; 'Ü': S[I] := 'U'; 'Ã': S[I] := 'A'; 'Õ': S[I] := 'O'; 'Ñ': S[I] := 'N'; 'Ç': S[I] := 'C'; end; Result := S; end; Um abraço! Silvio Clécio Contatos/Blog Skype: silvioprog Yahoo! Messenger: [EMAIL PROTECTED] MSN (Hotmail): [EMAIL PROTECTED] BlogSpot: http://silvioclecio.blogspot.com/ - Mensagem original De: Guionardo Furlan [EMAIL PROTECTED] Para: delphi-br@yahoogrupos.com.br Enviadas: Quarta-feira, 8 de Outubro de 2008 17:34:22 Assunto: Re: [delphi-br] Similaridade entre duas Strings Elogio de vez em quando vai bem, eheh. Bom, tá aí o código, testado por aqui e funcionando. No meu cálculo manual deu diferença ao comparar os nomes JOÃO e JONAS porque não considerei a diferença de tamanho das strings. Não é um componente, é uma função. unit GStrings; interface /// Obtém a similaridade entre duas strings retornando um valor entre 0 e 1 function Similaridade( Origem, Destino: string): Single; implementation uses SysUtils, GuioUtils; function Similaridade( Origem, Destino: string): Single; var i: Integer; SimCar: Integer; // Similaridade de caracteres SimOrd: Integer; // Similaridade de ordem Lista: array of string; function Validacao: Boolean; begin Result := (Length(Origem) 0) and (Length(Destino) 0); end; procedure SimilaridadeCaracte r; var j: Integer; begin SimCar := 0; for j := 1 to Length(Origem) do if Pos(Origem[j] , Destino) 0 then Inc(SimCar); end; procedure RemoveNaoCoincident es(var s1, s2: string); begin i := 1; while i = Length(s1) do if Pos(s1[i], s2) = 0 then Delete(s1, i, 1) else Inc(i); end; procedure GeraLista; var npalavras: Integer; // Número de palavras j, k: Integer; begin npalavras := (Sqr(Length( Origem)) + Length(Origem) ) div 2; SetLength(Lista, npalavras); i := 0; for j := 1 to Length(Origem) do // j recebe o tamanho de cada palavra for k := 1 to Length(Origem) - j + 1 do // k recebe a posicao de cada palavra begin Lista[i] := Copy(Origem, k, j); Inc(i); end; end; procedure SimilaridadeOrdem; var j: Integer; begin SimOrd := 0; for j := 0 to Length(Lista) - 1 do if Pos(Lista[j] , Destino) 0 then Inc(SimOrd); Result := Result * (SimOrd / Length(Lista) ); SetLength(Lista, 0); end; begin // 1. Transformar os textos para a mesma caixa e remover espaços em branco Origem := AnsiUpperCase( Trim(RemoveAcent os(Origem) )); Destino := AnsiUpperCase( Trim(RemoveAcent os(Destino) )); // 2a. Verificar se os textos são vazios: se forem, similaridade 0 e
Re: Res: [delphi-br] Similaridade entre duas Strings
Se for útil, uma função para retirar acentos que utilizo a muito tempo sem problemas. function RemoveAcentos(DadosAcentos : String) : String; var C_k, i : Integer; C_y, ComAcentos, SomAcentos : String; begin C_y := ''; ComAcentos := 'ÃÁÀÄÂÉÈÊËÍÌÎÏÓÒÔÕÖÚÙÜÛãáàäâéèêëíìîïóòôõöúùüû'; SomAcentos := 'AOao'; for i := 1 to Length(Trim(DadosAcentos)) do begin C_k := Pos(DadosAcentos[i], ComAcentos); if C_k 0 then C_y := C_y + SomAcentos[C_k] else C_y := C_y + DadosAcentos[i]; end; Result := C_y; end; Zucchi --- Em delphi-br@yahoogrupos.com.br, Silvio Clécio [EMAIL PROTECTED] escreveu Olá pessoal, Guionardo, você não é brincadeira não, matou a dúvida e mostrou a função, rsrsrsrsrsrsrs. Desse jeito os 2 demos que coloquei na 4shared vão virar sarcófagos, rsrsrsrsrsrsrs. Você é fera, isso não é um elogio, é a realidade. Funções úteis para strings (as que iniciam com 'sc' foram escritas por mim): --- function scRemoveAllChars(Ch: Char; S: string): string; var I: Integer; begin I := Length(S); while (Length(S) 0) and (I 0) do begin if S[I] = Ch then Delete(S, I, 1); Dec(I); end; Result := S; end; --- function scRemoveCharactersOfString(Chrs: array of Char; Str: string): string; var I: Integer; S: string; begin S := Str; for I := 0 to High(Chrs) do S := scRemoveAllChars(Chrs[I], S); Result := S; end; --- function RemovesAccent1(S: string): string; const WithAccent = 'àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ'; Stressless = 'aaeouaoaeioucuAAEOUAOAEIOUCU'; var I: Integer; begin for I := 1 to Length(S) do if Pos(S[I], WithAccent) 0 then S[I] := Stressless[Pos(S[I], WithAccent)]; Result := S; end; --- function RemovesAccents2(S: string ): string; var I: Integer; begin for I := 1 to Length(S) do case S[I] of 'á': S[I] := 'a'; 'é': S[I] := 'e'; 'í': S[I] := 'i'; 'ó': S[I] := 'o'; 'ú': S[I] := 'u'; 'à': S[I] := 'a'; 'è': S[I] := 'e'; 'ì': S[I] := 'i'; 'ò': S[I] := 'o'; 'ù': S[I] := 'u'; 'â': S[I] := 'a'; 'ê': S[I] := 'e'; 'î': S[I] := 'i'; 'ô': S[I] := 'o'; 'û': S[I] := 'u'; 'ä': S[I] := 'a'; 'ë': S[I] := 'e'; 'ï': S[I] := 'i'; 'ö': S[I] := 'o'; 'ü': S[I] := 'u'; 'ã': S[I] := 'a'; 'õ': S[I] := 'o'; 'ñ': S[I] := 'n'; 'ç': S[I] := 'c'; 'Á': S[I] := 'A'; 'É': S[I] := 'E'; 'Í': S[I] := 'I'; 'Ó': S[I] := 'O'; 'Ú': S[I] := 'U'; 'À': S[I] := 'A'; 'È': S[I] := 'E'; 'Ì': S[I] := 'I'; 'Ò': S[I] := 'O'; 'Ù': S[I] := 'U'; 'Â': S[I] := 'A'; 'Ê': S[I] := 'E'; 'Î': S[I] := 'I'; 'Ô': S[I] := 'O'; 'Û': S[I] := 'U'; 'Ä': S[I] := 'A'; 'Ë': S[I] := 'E'; 'Ï': S[I] := 'I'; 'Ö': S[I] := 'O'; 'Ü': S[I] := 'U'; 'Ã': S[I] := 'A'; 'Õ': S[I] := 'O'; 'Ñ': S[I] := 'N'; 'Ç': S[I] := 'C'; end; Result := S; end; Um abraço! Silvio Clécio Contatos/Blog Skype: silvioprog Yahoo! Messenger: [EMAIL PROTECTED] MSN (Hotmail): [EMAIL PROTECTED] BlogSpot: http://silvioclecio.blogspot.com/ - Mensagem original De: Guionardo Furlan [EMAIL PROTECTED] Para: delphi-br@yahoogrupos.com.br Enviadas: Quarta-feira, 8 de Outubro de 2008 17:34:22 Assunto: Re: [delphi-br] Similaridade entre duas Strings Elogio de vez em quando vai bem, eheh. Bom, tá aí o código, testado por aqui e funcionando. No meu cálculo manual deu diferença ao comparar os nomes JOÃO e JONAS porque não considerei a diferença de tamanho das strings. Não é um componente, é uma função. unit GStrings; interface /// Obtém a similaridade entre duas strings retornando um valor entre 0 e 1 function Similaridade( Origem, Destino: string): Single; implementation uses SysUtils, GuioUtils; function Similaridade( Origem, Destino: string): Single; var i: Integer; SimCar: Integer; // Similaridade de caracteres SimOrd: Integer; // Similaridade de ordem Lista: array of string; function Validacao: Boolean; begin Result := (Length(Origem) 0) and (Length(Destino) 0); end; procedure SimilaridadeCaracte r; var j: Integer; begin SimCar := 0; for j := 1 to Length(Origem) do if Pos(Origem[j] , Destino) 0 then Inc(SimCar); end; procedure RemoveNaoCoincident es(var s1, s2: string); begin i := 1; while i = Length(s1) do if Pos(s1[i], s2) = 0 then Delete(s1, i, 1) else Inc(i); end; procedure GeraLista; var
[delphi-br] Similaridade entre duas Strings
Olá Pessoal, Alguem já precisou comparar a similaridade entre duas strings e supor a porcetagem de similaridade entre elas? Exemplo: Em uma caixa de texto a pessoa digitou pedto. O sistema analisou e pergunta se o que ele esta procurando não é pedro. Como no Google. Estou precisando de um algoritimo desses para tentar diminuir o número de erros no cadastro. Como os requisitos do sistema diz que o nome é o mais importante e que o resto não é necessário, vemos uma mesma pessoa jurídica, por exemplo, cadastradas de 10 formas diferentes. Grato, Osmar.
Re: [delphi-br] Similaridade entre duas Strings
um bom exercício, vou dar meu palpite: 1. transformar os textos para a mesma caixa (alta ou baixa) 2. Verificar se os textos são iguais: se forem, similaridade 100% e termina o processo. 3. para cada caracter do texto origem verificar se ele existe no texto destino, e em caso positivo, incrementar 1 no contador de similaridade. 4. o quociente contador / número de caracteres no destino indica a similaridade sem considerar a ordem dos caracteres. Por exemplo, pedto e pedro são similares 4 caracteres em 5, indicando 80% de similaridade sem verificação de ordem. 5. considerando a ordem, remove-se os caracteres da origem que não existem no destino e os caracteres do destino que não existem na origem, igualando os dois textos 6. agora, com uma função que gere uma lista de palavras formadas pelos caracteres da origem, da seguinte forma: origem ajustada: peto, com os caracteres não coincidentes removidos, a lista gerada seria a seguinte p, e, t, o, pe, et, to, pet, eto, peto: 4 caracteres = 10 palavras map = m, a, p, ma, ap, map: 3 caracteres = 6 palavras jorge = j, o, r, g, e, jo, or, rg, ge, jor, org, rge, jorg, orge, jorge: 5 caracteres = 15 palavras O número de palavras dentro da lista é definido pela fórmula 0,5j^2+0,5j, onde j é o número de caracteres do texto origem ajustado. Cada palavra da lista encontrada dentro da palavra destino ajustada incrementa uma unidade no contador de similaridade de ordem. A similaridade de ordem é o quociente do contador sobre o número de palavras da lista. No exemplo acima, temos a mesma ordem dos caracteres e portanto, 100% de similaridade por ordem. Multiplicando os dois quocientes, teríamos um fator de similaridade entre as palavras, neste caso, 80% x 100% = 80% com outro exemplo, poderíamos ter: JOAO e JONAS As letras J, O, A e O existem todas dentro de JONAS, portanto temos 100% até aqui Fazendo a intersecção, temos os dois textos ajustados: JOAO e JOA com a lista de palavras temos J (1), O (1), A (1), O (1), JO (1), OA (1), AO (0), JOA (1), OAO (0), JOAO (0), somando 7 coincidências em 10 possibilidades, resultando em 70%. Multiplicando os dois quocientes, temos 70% de similaridade. Agora é só codificar pra OP e ver se a coisa serve. PS: fiz isso depois da janta, e meio cansado. Provavelmente deve haver um algoritmo mais elaborado, usando redes neurais, ou até mesmo uma função do delphi que resolve a parada. Mas é legal pra gente queimar um pouco de fosfato fora dos problemas comuns. 2008/10/7 Osmar Souza [EMAIL PROTECTED]: Olá Pessoal, Alguem já precisou comparar a similaridade entre duas strings e supor a porcetagem de similaridade entre elas? Exemplo: Em uma caixa de texto a pessoa digitou pedto. O sistema analisou e pergunta se o que ele esta procurando não é pedro. Como no Google. Estou precisando de um algoritimo desses para tentar diminuir o número de erros no cadastro. Como os requisitos do sistema diz que o nome é o mais importante e que o resto não é necessário, vemos uma mesma pessoa jurídica, por exemplo, cadastradas de 10 formas diferentes. -- Timeo hominem unius libri Cogito ergo sum - Carpe diem []s Guionardo Furlan http://guionardo.blogspot.com
Res: [delphi-br] Similaridade entre duas Strings
Olá pessoal, Bem, eu utilizo o Auto-Complete, no link (http://www.4shared.com/dir/5679510/48848609/Uploads.html) tem o arquivo (Auto-Complete texto) AutoComplete.zip que mostra como faço isso, é tipo no Google, cada texto digitado é gravado, servindo de sugestão para auto-completar um texto posteriormente. No exemplo tem um arquivo data.txt que tem os nomes Pedro e Silvio, caso você digite 'P', 'p', 'S' ou 's', ele já dá uma sugestão de texto, ou seja, os nomes Pedro ou Silvio. Cara, o Guionardo é fera mesmo! Um abraço! Silvio Clécio Contatos/Blog Skype: silvioprog Yahoo! Messenger: [EMAIL PROTECTED] MSN (Hotmail): [EMAIL PROTECTED] BlogSpot: http://silvioclecio.blogspot.com/ - Mensagem original De: Osmar Souza [EMAIL PROTECTED] Para: delphi-br@yahoogrupos.com.br Enviadas: Terça-feira, 7 de Outubro de 2008 20:31:15 Assunto: [delphi-br] Similaridade entre duas Strings Olá Pessoal, Alguem já precisou comparar a similaridade entre duas strings e supor a porcetagem de similaridade entre elas? Exemplo: Em uma caixa de texto a pessoa digitou pedto. O sistema analisou e pergunta se o que ele esta procurando não é pedro. Como no Google. Estou precisando de um algoritimo desses para tentar diminuir o número de erros no cadastro. Como os requisitos do sistema diz que o nome é o mais importante e que o resto não é necessário, vemos uma mesma pessoa jurídica, por exemplo, cadastradas de 10 formas diferentes. Grato, Osmar. . Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua cara @ymail.com ou @rocketmail.com. http://br.new.mail.yahoo.com/addresses [As partes desta mensagem que não continham texto foram removidas]
Re: [delphi-br] Similaridade entre duas Strings
Caramba que se faz como hobby ? resolve problemas quanticos heheheheh... []s Luiz Escobar - Original Message - From: Guionardo Furlan To: delphi-br@yahoogrupos.com.br Sent: Tuesday, October 07, 2008 10:13 PM Subject: Re: [delphi-br] Similaridade entre duas Strings PS: fiz isso depois da janta, e meio cansado. Provavelmente deve haver um algoritmo mais elaborado, usando redes neurais, ou até mesmo uma função do delphi que resolve a parada. Mas é legal pra gente queimar um pouco de fosfato fora dos problemas comuns.
Res: Res: [delphi-br] Similaridade entre duas Strings
Olá pessoal, No link (http://www.4shared.com/dir/5679510/48848609/Uploads.html) inseri também o arquivo (Auto-completa texto) AutoComplete2.zip, outra possibilidade de auto-completar texto. Um abraço! Silvio Clécio Contatos/Blog Skype: silvioprog Yahoo! Messenger: [EMAIL PROTECTED] MSN (Hotmail): [EMAIL PROTECTED] BlogSpot: http://silvioclecio.blogspot.com/ - Mensagem original De: Silvio Clécio [EMAIL PROTECTED] Para: delphi-br@yahoogrupos.com.br Enviadas: Terça-feira, 7 de Outubro de 2008 23:51:08 Assunto: Res: [delphi-br] Similaridade entre duas Strings Olá pessoal, Bem, eu utilizo o Auto-Complete, no link (http://www.4shared. com/dir/5679510/ 48848609/ Uploads.html) tem o arquivo (Auto-Complete texto) AutoComplete. zip que mostra como faço isso, é tipo no Google, cada texto digitado é gravado, servindo de sugestão para auto-completar um texto posteriormente. No exemplo tem um arquivo data.txt que tem os nomes Pedro e Silvio, caso você digite 'P', 'p', 'S' ou 's', ele já dá uma sugestão de texto, ou seja, os nomes Pedro ou Silvio. Cara, o Guionardo é fera mesmo! Um abraço! Silvio Clécio Contatos/Blog Skype: silvioprog Yahoo! Messenger: [EMAIL PROTECTED] com.br MSN (Hotmail): silvio_prog@ hotmail.com BlogSpot: http://silvioclecio .blogspot. com/ - Mensagem original De: Osmar Souza osmar_listas@ yahoo.com. br Para: [EMAIL PROTECTED] os.com.br Enviadas: Terça-feira, 7 de Outubro de 2008 20:31:15 Assunto: [delphi-br] Similaridade entre duas Strings Olá Pessoal, Alguem já precisou comparar a similaridade entre duas strings e supor a porcetagem de similaridade entre elas? Exemplo: Em uma caixa de texto a pessoa digitou pedto. O sistema analisou e pergunta se o que ele esta procurando não é pedro. Como no Google. Estou precisando de um algoritimo desses para tentar diminuir o número de erros no cadastro. Como os requisitos do sistema diz que o nome é o mais importante e que o resto não é necessário, vemos uma mesma pessoa jurídica, por exemplo, cadastradas de 10 formas diferentes. Grato, Osmar. . Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua cara @ymail.com ou @rocketmail.com. http://br.new.mail.yahoo.com/addresses [As partes desta mensagem que não continham texto foram removidas]