KnowledgePicker.WordCloud
est une bibliothèque moderne (.NET Standard 2.0) et rapide pour organiser et dessiner des nuages de mots (alias nuages de tags ou wordle). Il utilise Quadtrees pour des performances ultra-rapides. Il est maintenu par l’équipe KnowledgePicker.
Installez le package NuGet KnowledgePicker.WordCloud
.
Remarque Il n'existe actuellement qu'un seul moteur de dessin basé sur SkiaSharp. Sur certaines plateformes, des dépendances supplémentaires doivent être installées pour que SkiaSharp fonctionne correctement. Par exemple, sous Linux, ajoutez SkiaSharp.NativeAssets.Linux ; pour Blazor WebAssembly, ajoutez SkiaSharp.Views.Blazor.
Obtenez une collection de WordCloudEntry
s. Par exemple, supposons que nous ayons un dictionnaire de fréquences de mots :
var fréquences = new Dictionary<string, int>();// ... collecter les fréquences de mots d'une manière ou d'une autre... IEnumerable<WordCloudEntry> wordEntries = fréquences.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
Créez une configuration cloud mondiale :
var wordCloud = new WordCloudInput(wordEntries){Largeur = 1024, Hauteur = 256, MinFontSize = 8, MaxFontSize = 32} ;
Nous devons créer un moteur de dessin, un dimensionneur de police et une mise en page. Actuellement, nous utilisons SkiaSharp pour mesurer (et dessiner) rapidement des polices multiplateformes. Nous ne prenons également en charge que les tailles de police logarithmiques et la disposition en spirale. Toutes ces choses sont implémentées de manière générique et peuvent être facilement étendues (les contributions sont les bienvenues).
var sizer = new LogSizer(wordCloud);en utilisant var engine = new SkGraphicEngine(sizer, wordCloud);var layout = new SpiralLayout(wordCloud);var colorizer = new RandomColorizer(); // optionnelvar wcg = new WordCloudGenerator<SKBitmap>(wordCloud, moteur, mise en page, coloriseur) ;
Vous pouvez également utiliser SpecificColorizer
pour coloriser des mots spécifiques avec les couleurs choisies :
var colorizer = new SpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)},fallback: new RandomColorizer()); // l'argument de secours est facultatif
Vous pouvez également éventuellement transmettre une police dans le moteur graphique :
var typeface = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal);en utilisant var engine = new SkGraphicEngine(sizer, wordCloud, police);
Nous pouvons maintenant organiser le nuage de sujets :
IEnumerable<(LayoutItem Item, double FontSize)> items = wcg.Arrange();
Et si on est dans une vue Razor d'une application ASP.NET Core par exemple, on peut générer du SVG à partir items
:
<svg viewBox="0,0,@wordCloud.Width,@wordCloud.Height">@foreach (var (item, fontSize) in items){const string format = "0.##"; // Utilisez au plus 2 décimales. var x = (item.Location.X - item.Measuré.Left).ToString(format);var y = (item.Location.Y - item.Measuré.Top).ToString(format);var fs = fontSize.ToString (format);var color = wcg.GetColorHexString(item); <text transform="translate(@x, @y)" font-size="@fs" fill="@color">@item.Entry.Word</text>></svg>
Alternativement, nous pouvons dessiner le nuage de sujets (voir aussi l'exemple WordFrequencies.ConsoleApp
) :
en utilisant var final = new SKBitmap(wordCloud.Width, wordCloud.Height);en utilisant var canvas = new SKCanvas(final);// Dessiner sur fond blanc.canvas.Clear(SKColors.White);en utilisant var bitmap = wcg.Draw( );canvas.DrawBitmap(bitmap, 0, 0);// Enregistrer au format PNG.using var data = final.Encode(SKEncodedImageFormat.Png, 100);en utilisant varwriter = File.Create("output.png");data.SaveTo(writer);
L'algorithme du cloud mondial a été initialement porté depuis SourceCodeCloud. Il utilise Quadtrees, il devrait donc être raisonnablement rapide. Il s'inspire de l'implémentation de Wordle (un algorithme autrefois célèbre utilisé sur le site wordle.net, aujourd'hui disparu).
L'application console simple qui dessine un nuage de mots PNG pour les mots donnés sur son entrée standard est WordFrequencies.ConsoleApp
.
Cette bibliothèque est également utilisée en production par KnowledgePicker. Ils l'utilisent pour dessiner des nuages de sujets pour les profils d'utilisateurs.
Comme mentionné ci-dessus, seul un sous-ensemble de fonctionnalités est désormais implémenté, mais toutes les contributions sont les bienvenues. N'hésitez pas à ouvrir des tickets et à tirer des demandes.
Les tests ne sont actuellement pris en charge que sous Linux, car il s'agit de tests d'instantanés (générant une image de nuage de mots et la comparant octet par octet avec un instantané) et des travaux supplémentaires sont nécessaires pour garantir qu'ils sont multiplateformes (par exemple, utiliser exactement le même fonte). Sous Windows, les tests peuvent être exécutés en WSL (Visual Studio le prend directement en charge). Les tests sont également automatiquement exécutés dans GitHub Actions.
Après avoir poussé une balise, le workflow GitHub release.yml
est déclenché, ce qui crée et publie le package NuGet.