KnowledgePicker.WordCloud
ist eine moderne (.NET Standard 2.0) und schnelle Bibliothek zum Anordnen und Zeichnen von Wortwolken (auch bekannt als Tag Clouds oder Wordle). Es verwendet Quadtrees für eine blitzschnelle Leistung. Es wird vom KnowledgePicker-Team gepflegt.
Installieren Sie das NuGet-Paket KnowledgePicker.WordCloud
.
Hinweis: Derzeit gibt es nur eine Zeichen-Engine, die auf SkiaSharp basiert. Auf einigen Plattformen müssen zusätzliche Abhängigkeiten installiert werden, damit SkiaSharp ordnungsgemäß funktioniert. Fügen Sie unter Linux beispielsweise SkiaSharp.NativeAssets.Linux hinzu; Fügen Sie für Blazor WebAssembly SkiaSharp.Views.Blazor hinzu.
Holen Sie sich eine Sammlung von WordCloudEntry
s. Angenommen, wir haben ein Wörterbuch mit Worthäufigkeiten:
var Frequency = new Dictionary<string, int>();// ...Worthäufigkeiten irgendwie sammeln...IEnumerable<WordCloudEntry> wordEntries = Frequency.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
Erstellen Sie eine Welt-Cloud-Konfiguration:
var wordCloud = new WordCloudInput(wordEntries){Width = 1024,Height = 256,MinFontSize = 8,MaxFontSize = 32};
Wir müssen eine Zeichen-Engine, eine Schriftgröße und ein Layout erstellen. Derzeit verwenden wir SkiaSharp zum schnellen plattformübergreifenden Messen (und Zeichnen) von Schriftarten. Wir unterstützen außerdem nur logarithmische Schriftgrößen und Spirallayout. All diese Dinge sind generisch implementiert und können leicht erweitert werden (Beiträge sind willkommen).
var sizer = new LogSizer(wordCloud);using var engine = new SkGraphicEngine(sizer, wordCloud);var layout = new SpiralLayout(wordCloud);var colorizer = new RandomColorizer(); // optionalvar wcg = new WordCloudGenerator<SKBitmap>(wordCloud, engine, layout, colorizer);
Sie können SpecificColorizer
auch verwenden, um bestimmte Wörter mit ausgewählten Farben einzufärben:
var colorizer = new SpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)},fallback: new RandomColorizer()); // Fallback-Argument ist optional
Optional können Sie auch eine Schriftart an die Grafik-Engine übergeben:
var typeface = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal);using var engine = new SkGraphicEngine(sizer, wordCloud, typeface);
Jetzt können wir die Themenwolke anordnen :
IEnumerable<(LayoutItem Item, double FontSize)> items = wcg.Arrange();
Und wenn wir uns beispielsweise in einer Razor-Ansicht einer ASP.NET Core-Anwendung befinden, können wir SVG aus items
generieren:
<svg viewBox="0,0,@wordCloud.Width,@wordCloud.Height">@foreach (var (item, fontSize) in items){const string format = "0.##"; // Maximal 2 Dezimalstellen verwenden. var x = (item.Location.X - item.Measured.Left).ToString(format);var y = (item.Location.Y - item.Measured.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>
Alternativ können wir die Themenwolke zeichnen (siehe auch Beispiel WordFrequencies.ConsoleApp
):
using var final = new SKBitmap(wordCloud.Width, wordCloud.Height);using var canvas = new SKCanvas(final);// Auf weißem Hintergrund zeichnen.canvas.Clear(SKColors.White);using var bitmap = wcg.Draw( );canvas.DrawBitmap(bitmap, 0, 0);// Speichern in PNG.using var data = final.Encode(SKEncodedImageFormat.Png, 100);using varwriter = File.Create("output.png");data.SaveTo(writer);
Der World-Cloud-Algorithmus wurde ursprünglich von SourceCodeCloud portiert. Es verwendet Quadtrees und sollte daher einigermaßen schnell sein. Es ist von der Implementierung von Wordle inspiriert (einst berühmter Algorithmus, der auf der inzwischen nicht mehr existierenden Website wordle.net verwendet wurde).
Eine einfache Konsolenanwendung, die Wortwolken-PNG für Wörter zeichnet, die in ihrer Standardeingabe eingegeben werden, ist WordFrequencies.ConsoleApp
.
Diese Bibliothek wird auch in der Produktion von KnowledgePicker verwendet. Sie zeichnen damit Themenwolken für Benutzerprofile.
Wie oben erwähnt, ist derzeit nur ein Teil der Funktionalität implementiert, aber alle Beiträge sind willkommen. Fühlen Sie sich frei, Issues zu öffnen und Anfragen zu stellen.
Tests werden derzeit nur unter Linux unterstützt, da es sich um Snapshot-Tests handelt (Erzeugung eines Wortwolkenbilds und dessen Byte-für-Byte-Vergleich mit einem Snapshot) und mehr Arbeit erforderlich ist, um sicherzustellen, dass dies plattformübergreifend ist (z. B. genau das Gleiche verwenden). Schriftart). Unter Windows können Tests in WSL ausgeführt werden (Visual Studio unterstützt dies direkt). Tests werden auch automatisch in GitHub Actions ausgeführt.
Nach dem Pushen eines Tags wird der GitHub-Workflow release.yml
ausgelöst, der das NuGet-Paket erstellt und veröffentlicht.