Jump to content

[Resolvido] Tag cloud generator


jfosorio
 Share

Recommended Posts

Boas,

Tenho uma página que carrega registos dinamicamente e preciso de gerar uma tag cloud, de acordo com o conteúdo de cada registo. Alguém sabe se existe algum plugin para fazer isto, ou é preciso fazer isto "à unha"? Tenho pesquisado na net e encontrei alguns plugins que fazem a cloud, mas temos de dar as palavras previamente. Ou seja, os plugins que vi não descobrem quais os termos mais recorrentes para gerar a cloud, que é no fundo aquilo que se pretende.

Alguém pode dar uma ajuda?

CSS 3D Text - Partilha mensagens em 3D com os teus amigos no Facebook!

Portal de Informática it4life - Emprego, notícias, fórum, comunidade.

Link to comment
Share on other sites

Yoda, eu sei que és moderador e tens de mostrar serviço, mas sinceramente já não é a 1ª vez que respondes a posts meus sem contribuires no sentido de ajudar a esclarecer uma dúvida. Escreves por escrever e fazes observações que não fazem sentido nenhum. Eu disse que estava a fazer alguma coisa à mão? E mesmo que estivesse, porque é que não faria sentido chamar-lhe plugin? Não posso fazer um plugin à mão do zero? E disses também que um plugin exige um contexto. Ok! E eu não expliquei o contexto?

Mas eu repito a dúvida:

Eu tenho uma página que carrega registos dinamicamente. Ou seja, carrega texto. Preciso de uma solução (server-side ou client-side, tanto faz) que analise o texto que é carregado na página e verifique quais os termos mais repetidos, para depois gerar uma tag cloud. Eu preferia um plugin em jQuery, já que seria mais fácil e rápido de implementar, mas se for uma solução server-side também serve.

CSS 3D Text - Partilha mensagens em 3D com os teus amigos no Facebook!

Portal de Informática it4life - Emprego, notícias, fórum, comunidade.

Link to comment
Share on other sites

pretendes criar uma tag cloud de um único texto ?

quer dizer que a tua fonte de informação da tag cloud não são várias fontes de texto, mas sim um texto que está a ser apresentado na página no momento que pretendes ter a tag cloud visível, certo ?

esse texto tem HTML ? (é que se for, é necessário remover as tags primeiro)

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Exatamente Hippo. O texto é em HTML. Mas sugeres que desenvolva um script para isso? Eu estava à espera que houvesse um plugin para esse tipo de coisas, mesmo porque depois de saber os termos mais usados, ainda tenho de gerar a cloud. Talvez vá ter mesmo de criar um script para contar os termos e depois usar um dos plugins que vi para gerar a tag cloud. Implica uma implementação em dois passos, mas se tiver der...

CSS 3D Text - Partilha mensagens em 3D com os teus amigos no Facebook!

Portal de Informática it4life - Emprego, notícias, fórum, comunidade.

Link to comment
Share on other sites

Eu fazia desta forma: construía uma função sobre o que o @Happy indicou na sua última frase. Depois disso colocava todas as palavras num array, definia um mínimo de length (de, da, os, etc não são aconselháveis) e por fim verificava quais as palavras mais utilizadas e atribuía-lhes uma percentagem. Sendo que as percentagens maiores obtinham um font-size maior.

Edit: simples procura no google e encontrei links porreiros.

https://sheriframadan.com/2012/05/creating-a-word-cloud-with-php/

http://lotsofcode.com/tag-cloud/

Edited by bioshock
  • Vote 1
Link to comment
Share on other sites

   function createTags(tagid, minlength, max) {
     minlength = minlength ? minlength : 3;
     max       = max       ? max       : 20;

     // strip HTML and empty lines
     var tokens = [];
     $.each($('#'+tagid).html()
                        .replace(/(<([^>]+)>)/ig, ' ')
                        .split(' '),
            function(index, value) {
              value = value.trim();
              value && value.length >= minlength && tokens.push(value.trim());
            });

     // create tag list and entry count
     var tags = {};
     $.each(tokens, function(index, value) {
       if (!tags[value]) tags[value] = 1;
       else              tags[value] += 1;
     });

     // sort the tags by greater hit to lower hit
     var sorted = [];
     for (var tag in tags)
       sorted.push([tag, tags[tag]])
     sorted.sort(function(a, b) {return b[1] - a[1]})

     return sorted.slice(0, max);
   }

agora é só apresentação ...

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Mas eu repito a dúvida:

Eu tenho uma página que carrega registos dinamicamente. Ou seja, carrega texto. Preciso de uma solução (server-side ou client-side, tanto faz) que analise o texto que é carregado na página e verifique quais os termos mais repetidos, para depois gerar uma tag cloud. Eu preferia um plugin em jQuery, já que seria mais fácil e rápido de implementar, mas se for uma solução server-side também serve.

Muito mais claro assim, em vez de se usar palavras que se conhecem ambíguas.

Link to comment
Share on other sites

Tendo em conta as ajudas do Hippo e do Bio, eis a minha solução:

function createTags(el, minlength, words_limit) {
 var $pane = $('div.tags_pane');
 minlength = minlength ? minlength : 3;
 words_limit = words_limit ? words_limit : 20;

 // strip HTML and empty lines
 var tokens = [], words = [];
 $.each($(el), function() {
   words = $(this).html().replace(/(<([^>]+)>)/ig, ' ').replace(/([;,.!?]+)/ig, ' ').split(' ');
   $.each(words, function(i, val){
     val = val.trim();
     val && val.length >= minlength && tokens.push(val.trim());
   });
 });

 // create tag list and entry count
 var tags = {};
 $.each(tokens, function(index, value){
   if(!tags[value])tags[value] = 1;
   else tags[value] += 1;
 });

 // sort the tags by greater hit to lower hit
 var sorted = [];
 for(var tag in tags)
   sorted.push([tag, tags[tag]])

 sorted.sort(function(a, b){return b[1] - a[1]});
 sorted = sorted.slice(0, words_limit);
 sorted.sort(function() { return 0.5 - Math.random() });

 for(var i = 0; i < sorted.length; i++){
   size = (sorted[i][1] + 6) * 2.6;
   $pane.append('<span style="font-size:' + size + 'px;">' + sorted[i][0] + '</span> ');
 }
}

Aproveitei o código do Hippo e fiz algumas adaptações, de forma a atribuir um tamanho a cada tag (conforme o Bio disse) e "colar" logo no elemento HTML.

Obrigado pela ajuda.

  • Vote 1

CSS 3D Text - Partilha mensagens em 3D com os teus amigos no Facebook!

Portal de Informática it4life - Emprego, notícias, fórum, comunidade.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.