KnowledgePicker.WordCloud
es una biblioteca moderna (.NET Standard 2.0) y rápida para organizar y dibujar nubes de palabras (también conocidas como nubes de etiquetas o wordle). Utiliza Quadtrees para un rendimiento increíblemente rápido. Lo mantiene el equipo de KnowledgePicker.
Instale el paquete NuGet KnowledgePicker.WordCloud
.
Nota Actualmente sólo existe un motor de dibujo basado en SkiaSharp. En algunas plataformas, es necesario instalar dependencias adicionales para que SkiaSharp funcione correctamente. Por ejemplo, en Linux, agregue SkiaSharp.NativeAssets.Linux; para Blazor WebAssembly, agregue SkiaSharp.Views.Blazor.
Obtenga una colección de WordCloudEntry
. Por ejemplo, supongamos que tenemos un diccionario de frecuencias de palabras:
var frecuencias = new Dictionary<string, int>();// ...recopila frecuencias de palabras de alguna manera...IEnumerable<WordCloudEntry> wordEntries = frecuencias.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
Crear configuración de nube mundial:
var wordCloud = new WordCloudInput(wordEntries){Ancho = 1024, Alto = 256, MinFontSize = 8, MaxFontSize = 32};
Necesitamos crear un motor de dibujo, un tamaño de fuente y un diseño. Actualmente, utilizamos SkiaSharp para medir (y dibujar) fuentes multiplataforma rápidamente. Además, solo admitimos tamaños de fuente logarítmicos y diseños en espiral. Todas estas cosas se implementan de forma genérica y se pueden ampliar fácilmente (las contribuciones son bienvenidas).
var sizer = nuevo LogSizer(wordCloud);usando el motor var = nuevo SkGraphicEngine(sizer, wordCloud);var diseño = nuevo SpiralLayout(wordCloud);var colorizer = nuevo RandomColorizer(); // opcionalvar wcg = new WordCloudGenerator<SKBitmap>(wordCloud, motor, diseño, colorizador);
También puedes usar SpecificColorizer
para colorear palabras específicas con los colores elegidos:
var colorizer = new SpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)},fallback: new RandomColorizer()); // el argumento alternativo es opcional
Opcionalmente, también puedes pasar una fuente al motor gráfico:
tipo de letra var = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal);usando el motor var = new SkGraphicEngine(sizer, wordCloud, tipo de letra);
Ahora podemos organizar la nube de temas:
IEnumerable<(Elemento LayoutItem, doble Tamaño de fuente)> elementos = wcg.Arrange();
Y si estamos en una vista Razor de una aplicación ASP.NET Core, por ejemplo, podemos generar SVG a partir de items
:
<svg viewBox="0,0,@wordCloud.Width,@wordCloud.Height">@foreach (var (elemento, tamaño de fuente) en elementos){const string format = "0.##"; // Utilice como máximo 2 decimales. 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 color = wcg.GetColorHexString(elemento); <text transform="translate(@x, @y)" font-size="@fs" fill="@color">@item.Entry.Word</text>}</svg>
Alternativamente, podemos dibujar la nube de temas (ver también el ejemplo WordFrequencies.ConsoleApp
):
usando var final = new SKBitmap(wordCloud.Width, wordCloud.Height);usando var canvas = new SKCanvas(final);// Dibujar sobre fondo blanco.canvas.Clear(SKColors.White);usando var bitmap = wcg.Draw( );canvas.DrawBitmap(mapa de bits, 0, 0);// Guardar en PNG.usando var data = final.Encode(SKEncodedImageFormat.Png, 100);usando var escritor = File.Create("output.png");data.SaveTo(escritor);
El algoritmo de la nube mundial fue inicialmente portado desde SourceCodeCloud. Utiliza Quadtrees, por lo que debería ser razonablemente rápido. Está inspirado en la implementación de Wordle (algoritmo alguna vez famoso utilizado en el sitio ahora desaparecido wordle.net).
La aplicación de consola simple que dibuja una nube de palabras PNG para las palabras dadas en su entrada estándar es WordFrequencies.ConsoleApp
.
KnowledgePicker también utiliza esta biblioteca en producción. Lo utilizan para dibujar nubes de temas para perfiles de usuarios.
Como se mencionó anteriormente, ahora solo se implementa un subconjunto de funciones, pero todas las contribuciones son bienvenidas. No dudes en abrir incidencias y realizar solicitudes.
Actualmente, las pruebas solo se admiten en Linux, porque son pruebas instantáneas (generar una imagen de nube de palabras y compararla byte a byte con una instantánea) y se necesita más trabajo para garantizar que sea multiplataforma (por ejemplo, usar exactamente el mismo fuente). En Windows, las pruebas se pueden ejecutar en WSL (Visual Studio lo admite directamente). Las pruebas también se ejecutan automáticamente en GitHub Actions.
Después de insertar una etiqueta, se activa el flujo de trabajo de GitHub release.yml
, que compila y publica el paquete NuGet.