[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