[Cascavel-pm] Comparacao aproximada entre duas strings
Gabriel Vieira
gabriel.vieira em gmail.com
Domingo Outubro 16 07:23:35 PDT 2005
Hum...
creio que isso não é bom para comparação de frases, mas sim de palavras das
frases.
Exemplo seria se eu colocasse um NÃO em uma das duas, a resposta deveria ser
0%, o que não deve ocorrer..
Quem deve utilizar muito esse recurso/lógica são os programadores de
inteligência artificial, exemplo os 'robôs' de páginas web onde você escreve
uma pergunta e uma resposta exata, senão aproximada ou informando que não
tem a resposta, lhe é retornada.
Isso é complicado, acho que pra cada idioma surge uma lógica bastante
diferente... Creio que pra inglês seria muito mais fácil, e ajudaria
bastante se tivesse um banco de dados com Verbos para se situar sobre cada
frase.
No caso, o código iria entender a frase e então compará-la com outras e não
ver semelhanças de palavras.
Será que mudei o rumo da dúvida original?
Abraços ;)
----- Original Message -----
From: "Nelson Ferraz" <nferraz em gmail.com>
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Sent: Sunday, October 16, 2005 3:11 AM
Subject: Re: [Cascavel-pm] Comparacao aproximada entre duas strings
Hmm...
Eu começaria "limpando" as strings, eliminando a) caracteres especiais
e b) "stop words", palavras comuns que não carregam muita informação e
poderiam distorcer os resultados.
sub Clean {
my $str = shift;
my @stop_words = qw/a an the for and is are to/;
$str =~ s/[^\w\s]//g;
foreach (@stop_words) {
$str =~ s/^$_ //;
$str =~ s/ $_$//;
$str =~ s/ $_ / /;
}
return $str;
}
Em seguida, eu contaria o número de palavras coincidentes nas duas strings:
sub Similarity {
my ($str1,$str2) = @_;
my (%words1,%words2);
map({ $words1{$_} = 1 } split(/\s+/,$str1));
map({ $words2{$_} = 1 } split(/\s+/,$str2));
my ($common,$total);
foreach ((keys %words1,keys %words2)) {
$total++;
$common++ if defined $words1{$_} and defined $words2{$_};
}
return ($common/$total);
}
Exemplos:
Similarity(
"WIM: an Information Mine Model for the World Wide Web",
"WIM: World Wide Web Information Mine Model",
); # => 100%
Similarity(
"WIM: an Information Mine Model for the World Wide Web",
"WIM: an Information Mining Model for the Web"
); # => 66,7%
Similarity(
"A Practical Minimal Perfect Hashing Method",
"WIM: an Information Mining Model for the Web"
); # => 0
Espero que isso possa ser útil! : )
[]s
Nelson
--
Nelson Ferraz
GNU BIS - www.gnubis.com.br
_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm
Mais detalhes sobre a lista de discussão Cascavel-pm