Jump to content


Photo

Voce_quis_dizer()


  • Faça o login para participar
12 replies to this topic

#1 Dantetekanem

Dantetekanem

    Normal

  • Usuários
  • 74 posts
  • Sexo:Não informado

Posted 17/05/2007, 13:08

Título: voce_quis_dizer()
Descrição: Calcula a distância levenshtein() da string, faz um calculo de porcentagem e trás as palavras mais próximas a postada dentro de uma array();

---------------------------------------------------------

Sintaxe: voce_quis_dizer(str Palavra , array Biblioteca de palavras)
Retorno: String
Descrição: Use a função para buscar similiraridades da palavra com outras, caso a anterior esteja escrita de modo incorreto.
Bibliotecas: Nenhuma
Limitações: PHP 4.0+

Função:
<?PHP
function voce_quis_dizer($output,$library){
   for($i=0;$i<count($library);$i++){
	  $suggestion[$i]['proximity'] = levenshtein(soundex($output),soundex($library[$i]))*100/strlen($library[$i]);
	  $suggestion[$i]['word'] = $library[$i];
   }
   sort($suggestion);
   return $suggestion[0]['word'];
}
?>



-------------------------------------------------------------------
Exemplo:

<?PHP
$array = array('crayo','cachorro','cadela','cão','carinho','carneiro','carne','cor','leonardo','leopardo','guepardo');
print('Você quis dizer: <b>'.voce_quis_dizer('l30nard0',$array).'</b> ?');
function voce_quis_dizer($output,$library){
   for($i=0;$i<count($library);$i++){
	  $suggestion[$i]['proximity'] = levenshtein(soundex($output),soundex($library[$i]))*100/strlen($library[$i]);
	  $suggestion[$i]['word'] = $library[$i];
   }
   sort($suggestion);
   return $suggestion[0]['word'];
}
?>


#2 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 17/05/2007, 13:44

Parece ser legal, mas ainda não testei. Só uma dúvida, eu vi que você usou a função soundex(), mas a uns anos atrás eu usei-a também sem resultados satisfatórios, se não me engano é porque soundex() calcula a pronuncia em inglês, nosso idioma tem outra pronuncia, tanto que no comentário da função tem um link para a versão (feito por ususários) em francês. Eu até devo ter em casa a versão em português se não me engano.

Tem também o fato que eu usei na versão 3 ou 4 do php, não lembro ... as vezes ela foi melhorada nas versões mais recentes.
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#3 Dantetekanem

Dantetekanem

    Normal

  • Usuários
  • 74 posts
  • Sexo:Não informado

Posted 17/05/2007, 13:46

Você tem razão nessa parte, mas caso não queira usar isso pode usar o conjunto de você quis dizer só com a levenshtein(), retirando a soundex(). E também existe uma função, phonebr() que pega a fonética em português, acho que tem para download no site do www.phpbrasil.com

Um abraço.

#4 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 18/05/2007, 09:45

Duas coisas:

- Qual palavra, por exemplo, poderia conflitar com soundex()?
- Pelo jeito, como a base da função está, funciona com poucas palavras. Por acaso existe alguma alma caridosa que tenha um "dicionário" completo pronto, para armazenar em um BD?

#5 Dantetekanem

Dantetekanem

    Normal

  • Usuários
  • 74 posts
  • Sexo:Não informado

Posted 18/05/2007, 12:34

Pelo as que eu testei nenhuma palavra causa erro, mas não tentei com acentos e etc. Pode ser que haja.

Agora do dicionário, não sei não. XD

#6 fredbh

fredbh

    Novato no fórum

  • Usuários
  • 2 posts
  • Sexo:Não informado

Posted 21/05/2007, 11:08

pois eh... poderiamos tentar imaginar um modo de otimizar essa funçao... pois eh muito interessante....
Um dicionario no Banco de Dados... com milhares de palavras...

Mas nao compensa carregar essas milhares de palavras em um array e joga-lo na funçao...

Vamos pensar num modo legal...

Quem puder ajudar....

Eu estarei pensando aki uma maneira....
qualquer coisa posto aki...

faloww

#7 Luis Otávio

Luis Otávio

    Super Veterano

  • Usuários
  • 3113 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre
  • Interesses:- Desenvolvimento de aplicações Web com linguagem server-side PHP.

    - Desenvolvimento de aplicações Web com linguagem cliente-side JavaScript, conhecedor e utilizador da biblioteca jQUERY e todas suas características.

    - Otimização de Desempenho aplicados a performance de banco de dados Mysql.

    - Otimização de Desempenho para servidores Web utilizando-se como Webserver NGINX em conjunto com Varnish.

    - Sólidos conhecimentos no CMS WordPress para novas implementações, manutenção, criação e otimização de Plugins.

    - Práticas de atendimento, relacionamento e suporte ao cliente. Trabalhando voltado ao público desde o lançamento da empresa iPORTO.COM, criando laços e vínculos com os mais de Mil clientes da empresa e os braços do grupo.

Posted 21/05/2007, 11:23

Da para usar direto no mysql tb
http://dev.mysql.com...unction_soundex

e no sqlserver
http://msdn2.microso...35(sql.80).aspx

:)
* Otávio Nogueira
* Administração e Configuração de Servidores;
* Combinação Perfeita: NGINX + PHP + VARNISH + HAPROXY
* otavio*iporto.com ~ Tel: +55 51 3366 0177 | +55 51 4063 7343 |
* @iporto

#8 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 21/05/2007, 12:54

Soundex() não é confiável para usar no nosso idioma porque ela calcula essa semelhança baseado na pronuncia das palavras, que se comparado com o inglês tem muitas diferenças, além do que temos um idioma rico em acentuação. E a função soundex do mysql faz exatamente a mesma coisa, só em inglês.

Eu precisei fazer algo assim uns tempos atrás, mas é meio complicado, fazer um dicionário enorme no BD e verificar tudo a cada consulta é coisa de louco ... ^^

Pensamos em fazer algo assim para busca de produtos:

Nome_Produto | Palavras
Maçã		 | maca maça maçã mçaa mçãa ...

Ou seja, ao cadastrar um produto, uma função faria essa sugestão das palavras, e a busca seria no campo palavras ao invés do campo nome_produto.

Mas como o projeto era pequeno acabou morrendo só com uma ER e pronto.

Se não me engano no fórum já tem um tópico sobre isso, criar algo para fazer o 'você quis dizer'. Em PHP mesmo.

----------
Achei: http://forum.wmonlin...howtopic=112791

Edição feita por: bimonti, 21/05/2007, 13:00.

WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#9 Bruno Augusto

Bruno Augusto

    ∙•● Restarting... ●•∙

  • Usuários
  • 1968 posts
  • Sexo:Não informado
  • Localidade:Itajubá

Posted 21/05/2007, 14:10

Bem, a função criada para esse tópico não tem problemas para maçã, por exemplo, mesmo nas variedades que o bimonti passou.

Entretanto se adicionar casa e massa no array ebuscar-se por kaza, me retorna o massa. :blink:

Já essa phonebr() não saquei o que ela faz pois buscanco kasa me retornou:

Texto: kasa
Resultado: KZ

A menos que a fonebr() tenha de ser passada no meio da função do amigo, por exemplo, no lugar da soundex(). Isso não testei (ainda).

Edição feita por: Bruno Augusto, 21/05/2007, 14:12.


#10 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 21/05/2007, 15:03

Já essa phonebr() não saquei o que ela faz pois buscanco kasa me retornou:

Texto: kasa
Resultado: KZ

A menos que a fonebr() tenha de ser passada no meio da função do amigo, por exemplo, no lugar da soundex(). Isso não testei (ainda).


Exatamente ... ^^
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#11 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 06/06/2007, 14:08

Minutos depois ... :lol:

Tem umas funções nativas do php pra isso: http://br.php.net/ma.../ref.pspell.php

Se é boa ou se funciona eu não sei, só to informando que tem. <_<
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#12 etapombas

etapombas

    Novato no fórum

  • Usuários
  • 1 posts
  • Sexo:Não informado

Posted 19/07/2007, 21:44

cara achei mto massa essa funcao ai
bom no meu caso ela se encaixa perfeitamente, pois meu site usa palavras em ingles
bom ate o momento estou carregando mais de mil palavras numa array
Pesquisei, fussei mas naum consegui entender como faço pra usa-la direto no mysql

Se alguem puder me ajudar ficarei muiiiiiitooooo feliz

meu site: www.baixar.info

#13 Dantetekanem

Dantetekanem

    Normal

  • Usuários
  • 74 posts
  • Sexo:Não informado

Posted 31/01/2008, 21:47

Opa, o usuário Orides Tomkiel Zmovirzynsk do fórum Imasters postou uma versão dessa voce_quis_dizer() que busca pelos próprios resultados do Google.

Dei uma leve mexida na função para ficar mais fácil de ser executada, segue a mesma abaixo:

function voce_quis_dizer($q){    $content = file_get_contents("http://www.google.com/search?hl=pt-BR&q=".urlencode($q)."");    return (@preg_match("/voc.\squis\sdizer:\s.+?class=['\"]?p[\"']?>(.+?)<\/a>/i", $content, $palavra)) ? strip_tags($palavra[1]) : false;}

Modo de usar: <?PHP print ( voce_quis_dizer ( 'pezquisa' ) ); ?>

Como busca logo no Google, e em português. Não temos problemas para altos banco de dados e etc. Só pode demorar um pouquinho pra responder, mas ai é da internet mesmo.

Vale a pena, um abração.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq