Nuvem de Tags em PHP

Enviado por Alfred R. Baudisch em PHP, Script PHP, Classe PHP.
Ir para os Comentários.

O novo modo de catalogar textos é baseado em tags (palavras, categorias), que por sua vez elas são exibidas em "nuvens", onde as palavras com maior freqüência aparecem com fonte maior, e assim a fonte vai diminuindo, de acordo com a freqüência de artigos com tal tag, exemplo (nuvem de tags do BlogBlogs):
Nuvem de Tags do BlogBlogs

Nessa nuvem de tags (ou cloud tags, em inglês) existem mais textos "taggado" com curiosidades, depois com bloppers e assim vai.

Vamos criar uma nuvem de tags bem básica, que retorna as palavras de modo aleatório (não organizada por nome ou freqüência). Primeiramente obtenha os códigos e depois explicação passo a passo:

- class.nuvemtags.php
- nuvemExemplo.php

Veja o exemplo em execução.

Dissecando o código:

  1. Devemos criar uma função para adicionar palavras à biblioteca. addPalavra serve para isso, e aceita uma string ou array de palavras. O nosso "banco de dados" de palavra fica no membro $listaPalavras.

    Cada palavra adicionada recebe um ponto ($this->listaPalavras[$palavras]++;), que é somado a cada aparição dela. Os "pontos" nada mais são que a quantidade de vezes que a palavra aparece.
  2. O modo como cada palavra será exibida de um tamanho é baseado no percentual. De acordo com o percentual ele recebe um número de classificação. Esse número, pode ser usado como classe CSS.

    if($pecentualUso >= 99)
       $classe = 10;
    else {
       $classe = floor(($percentualUso / 10));
    }

    Nesse caso o número é obtido da seguinte maneira: caso a palavra apareça 99% ou mais, ela recebe classificação 10. Caso receba entre 1 e 98%, a classificação é o valor da dezena do percentual. Como assim?
    Digamos que o percentual seja 32%. O retorno será 3. Caso seja 7%, o retorno é 0 (não tem dezena).

    E o que você faz com esse número? Crie classes CSS contendo esses números, conforme coloquei em nuvemExemplo.php:
    .tag10 contém o maior tamanho de fonte, tag9 um pouco menor e assim de modo decrescente, até chegar em tag0.

  3. function misturaPalavras()
    Coloca as palavras de modo aleatório no array. Como dito no começo do artigo, essa é uma nuvem de exibição aleatória.
  4. E finalmente, a função de retorno da nuvem: mostraNuvem().

    Como cada palavra contém a soma de vezes que aparece, obtemos a quantidade total das vezes que as palavras aparecem: $quantidadePresencas array_sum($this->listaPalavras); . Lembrando que array_sum soma todos os elementos de um array. Depois as palavras são misturadas: $this->misturaPalavras(); .

    E entramos no loop de criação da nuvem:
    foreach($this->listaPalavras as $palavra => $presenca)
    {
        
    $aparecimentoPercentual 
          ((
    100 $presenca) / $quantidadePresencas);
        
    $classeCss $this->obtemCss($aparecimentoPercentual);

        $nuvemTags[] = array(
            
    ‘palavra’    =>    $palavra,
            
    ‘classe’    =>    $classeCss,
            
    ‘percentual’=>  floor($aparecimentoPercentual)
        );
    }
    .
    Primeiro é calculado o percentual que uma palavra aparece. Pura regra de três:
    [Quantidade de Vezes Total que as Palavras Aparecem (obtido acima com array_sum - $quantidadePresencas) = 100%]
    X
    [Quantidade de Vezes que a palavra apareceu ($presenca) = Percentual dessa palavra ($aparecimentoPercentual)].
    Assim, $aparecimentoPercentual é passado para obtemCss, que obtem a classificação da palavra.

    Cada palavra é inserida na nuvem com a classe css (na verdade apenas o número de classificação) e o percentual (caso você queira usar para algum debug ou outro cálculo).

  5. A impressão da nuvem, como no exemplo, é iterando no array:
    $NuvemTags = $Nuvem->mostraNuvem();
    foreach($NuvemTags as $Tag)
    {
       echo '<span class="tag' . $Tag['classe'] . '">' . $Tag['palavra'] . '</span> ';
    }

Veja o exemplo em execução.

Como pode ver, nuvem de tags não tem nenhum segredo, é baseada em percentual. Em artigo futuro, criaremos uma nuvem de tag com ordenação baseada em nome ou peso, bem como adaptada de banco de dados. Se bem que por essa classe você já pode obter as palavras do banco de dados, basta obter suas categorias e passar para o objeto.


20 Respostas para “Nuvem de Tags em PHP”

  1. Marcos Seki Escreveu:

    muito estranho, vou tentar baixar outro navegador pra ve se é esse o problema, o pessoal da comunidade PHP Brasil no orkut disse que conseguiu também mandar foto, mas eu não consigo, e a foto que eu quero mandar tem menos de 500kb…
    muito estranho, hehe

  2. Alfred R. Baudisch Escreveu:

    Por via das dúvidas, acabei de enviar utilizando o IE e funcionou também, mesmo que eu coloque o arquivo em campos aleatórios, 1, 2 ou 3 arquivos. heheh Acho muito estranho não funcionar para você então.

    Para quem está vendo, o assunto é sobre:
    PHP: Formulários e upload de múltiplos arquivos e fotos - http://linhadecodigo.com.br/Artigo.aspx?id=970

  3. Marcos Seki Escreveu:

    Alfred, consegui mandar pelo FIREFOX,
    qual a versão do IE que você testou, aqui eu não consegui com o 6.0…

    muito estranho..

  4. Alfred R. Baudisch Escreveu:

    Descobri o problema. O IE 6.0 trata MimeType diferente.

    Mude a linha:
    if(preg_match(’/^image\/(gif|jpeg|jpg|png)$/’, $Tipo))

    para:
    if(preg_match(’/^image\/(.*)?(gif|jpeg|jpg|png)$/’, $Tipo))

    Veja que coloquei: (.*)? na frente de gif, etc.
    Porque o IE adiciona “x-png”, “pjpeg”, etc.

    Abraços.

  5. Marcos Seki Escreveu:

    aaa alfred, muito obrigado hehe :)
    acho que eu iria demorar muito tempo pra descobrir, obrigadão mesmo!!

    abraço..

  6. Cairo Noleto Escreveu:

    Cara, eu tenho uma duvida, mas naum tem nada a ver com o titulo e nem com o conteudo desse post.
    Eu quero saber, é como trabalho utilizando Orientação a Objeto e PHP. Eu trabalho usando o Code Igniter, framework PHP, e ele é orientado a objeto, mas nunca implementei algo simples e sem uso de framework. O que eu quero saber, é como se faz pra usar as classes, e métodos no meu browser, após eu achar q está td ok.

  7. Alfred R. Baudisch Escreveu:

    Cairo, poderia explicar melhor qual sua dúvida? Não ficou claro o que você realmente precisa: “é como se faz pra usar as classes, e métodos no meu browser, após eu achar q está td ok“.

    Abraços.

  8. Rafael Escreveu:

    mtu bommmm

  9. Erick Escreveu:

    Em breve o site www.midiaw3.com estará disponibilizando tutoriais sobre Photoshop CS3

  10. SkinTech » Blog Archive » Nuvem de tags PHP Escreveu:

    […] Link: http://www.auriumsoft.com.br/desenvolvedorphp/2007/nuvem-de-tags-com-php/ […]

  11. Victor Chaves Escreveu:

    Opa, parabéns pelo artigo, esta me ajudando muito. tenho uma dúvida que voce disse: “são exibidas em “nuvens”, onde as palavras com maior freqüência aparecem com fonte maior” esta frequencia em que elas aparecem seria: quando o visitante abre um artigo e as tags relacionadas a ele ganhariam pontuação? Se Sim colocaria uma sessao ou cookie para que este visitante pontue estas tags somente uma vez (nesta visita) se ele der reload na pagina? Obrigado!

  12. Alfred R. Baudisch Escreveu:

    A frequência, é na verdade, a frequência com que uma palavra é cadastrada.

    Digamos que você tenha um site de noticias, e você use palavras para indicar cada noticia, entao em 10 noticias você tem:
    #1: politica
    #2: economia
    #3: economia
    #4: economia
    #5: economia
    #6: mundo
    #7: cultura
    #8: politica
    #9: economia
    #10: brasil

    A palavra em maior frequência é economia -> politica -> etc.. Ou seja, Economia tera fonte maior na nuvem, politica um pouco menor e assim vai.

  13. Bruno Escreveu:

    Cara muito bom mas como funcionaria com banco de dados mysql, vc poderia dar um exemplo por favor?
    vlw e t+

  14. Andryon Escreveu:

    gostaria de saber como adiciono link as tags

  15. Andryon Escreveu:

    Como posso por links as tags?

  16. Marco Leandro do Prado Escreveu:

    Olá gostaria de colocar algo como link 1link 2

    mas no caso do seu algoritmo me trás da seguinte forma
    link 1link 2

    teria como você me mostrar aonde eu posso alterar para se adaptar ao meu caso.

    Grato pela ajuda

  17. Fabio Escreveu:

    Legal o artigo, e muito bem detalhado…Parabéns…

  18. Eduardo Escreveu:

    Boa tarde, Alfred.

    Tem como você criar um tutorial colocando links nas palavras, puxando-as do banco de dados?

    E outra opção puxando do input text de busca, ou seja, as palavras mais buscadas aparecerem na nuvem de tags?

    Aguardo seu retorno.

  19. frankzeffi Escreveu:

    Muito bom. Vou colocar em prática.

  20. gabriel Escreveu:

    Cara, como limitar o numerod e tags, adaptei ao mysql, mas o limit iria limitar tudo e não o numero de tags exibidas..

Comente!