KnowledgePicker.WordCloud
é uma biblioteca moderna (.NET Standard 2.0) e rápida para organizar e desenhar nuvens de palavras (também conhecidas como nuvens de tags ou wordle). Ele usa Quadtrees para um desempenho extremamente rápido. Ele é mantido pela equipe KnowledgePicker.
Instale o pacote NuGet KnowledgePicker.WordCloud
.
Nota Atualmente existe apenas um mecanismo de desenho baseado no SkiaSharp. Em algumas plataformas, dependências adicionais precisam ser instaladas para que o SkiaSharp funcione corretamente. Por exemplo, no Linux, adicione SkiaSharp.NativeAssets.Linux; para Blazor WebAssembly, adicione SkiaSharp.Views.Blazor.
Obtenha uma coleção de WordCloudEntry
s. Por exemplo, suponha que temos um dicionário de frequências de palavras:
var frequências = new Dictionary<string, int>();// ...coletar frequências de palavras de alguma forma...IEnumerable<WordCloudEntry> wordEntries =frequências.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
Crie a configuração da nuvem mundial:
var wordCloud = new WordCloudInput(wordEntries){Largura = 1024,Altura = 256,MinFontSize = 8,MaxFontSize = 32};
Precisamos criar mecanismo de desenho, dimensionador de fonte e layout. Atualmente, usamos SkiaSharp para medição (e desenho) rápida de fontes em várias plataformas. Também oferecemos suporte apenas a tamanhos de fonte logarítmicos e layout em espiral. Todas essas coisas são implementadas de forma genérica e podem ser facilmente estendidas (contribuições são bem-vindas).
var sizer = new LogSizer(wordCloud);usando var engine = new SkGraphicEngine(sizer, wordCloud);var layout = new SpiralLayout(wordCloud);var colorizer = new RandomColorizer(); // opcionalvar wcg = new WordCloudGenerator<SKBitmap>(wordCloud, mecanismo, layout, colorizador);
Você também pode usar SpecificColorizer
para colorir palavras específicas com as cores escolhidas:
var colorizer = new SpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)},fallback: new RandomColorizer()); // argumento de fallback é opcional
Você também pode, opcionalmente, passar uma fonte para o mecanismo gráfico:
var typeface = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal);usando var engine = new SkGraphicEngine(sizer, wordCloud, typeface);
Agora podemos organizar a nuvem de tópicos:
IEnumerable<(LayoutItem Item, double FontSize)> itens = wcg.Arrange();
E se estivermos em uma view Razor de uma aplicação ASP.NET Core, por exemplo, podemos gerar SVG a partir de items
:
<svg viewBox="0,0,@wordCloud.Width,@wordCloud.Height">@foreach (var (item, fontSize) em itens){const string format = "0.##"; // Use no máximo 2 casas decimais. var x = (item.Location.X - item.Measured.Left).ToString(formato);var y = (item.Location.Y - item.Measured.Top).ToString(formato);var fs = fontSize.ToString (formato);var cor = wcg.GetColorHexString(item); <text transform="translate(@x, @y)" font-size="@fs" fill="@color">@item.Entry.Word</text>}</svg>
Alternativamente, podemos desenhar a nuvem de tópicos (veja também o exemplo WordFrequencies.ConsoleApp
):
usando var final = new SKBitmap(wordCloud.Width, wordCloud.Height);usando var canvas = new SKCanvas(final);// Desenha em fundo branco.canvas.Clear(SKColors.White);usando var bitmap = wcg.Draw( );canvas.DrawBitmap(bitmap, 0, 0);// Salvar em PNG.usando var data = final.Encode(SKEncodedImageFormat.Png, 100);usando var escritor = File.Create("output.png");data.SaveTo(writer);
O algoritmo de nuvem mundial foi inicialmente portado do SourceCodeCloud. Ele usa Quadtrees, portanto deve ser razoavelmente rápido. É inspirado na implementação do Wordle (algoritmo outrora famoso usado no extinto site wordle.net).
Um aplicativo de console simples que desenha PNG de nuvem de palavras para palavras fornecidas em sua entrada padrão é WordFrequencies.ConsoleApp
.
Esta biblioteca também é usada na produção pelo KnowledgePicker. Eles o usam para desenhar nuvens de tópicos para perfis de usuários.
Conforme mencionado acima, apenas um subconjunto de funcionalidades é implementado agora, mas todas as contribuições são bem-vindas. Sinta-se à vontade para abrir problemas e receber solicitações.
Atualmente, os testes são suportados apenas no Linux, porque são testes de instantâneo (gerando uma imagem de nuvem de palavras e comparando-a byte a byte com um instantâneo) e é necessário mais trabalho para garantir que seja multiplataforma (por exemplo, use exatamente o mesmo fonte). No Windows, os testes podem ser executados em WSL (o Visual Studio suporta isso diretamente). Os testes também são executados automaticamente no GitHub Actions.
Depois de enviar uma tag, o fluxo de trabalho do GitHub release.yml
é acionado, o que cria e publica o pacote NuGet.