KnowledgePicker.WordCloud
— это современная (.NET Standard 2.0) и быстрая библиотека для организации и рисования облаков слов (также известных как облака тегов или wordle). Он использует Quadtrees для невероятно быстрой производительности. Он поддерживается командой KnowledgePicker.
Установите пакет NuGet KnowledgePicker.WordCloud
.
Примечание. В настоящее время существует только один механизм рисования, основанный на SkiaSharp. На некоторых платформах для правильной работы SkiaSharp необходимо установить дополнительные зависимости. Например, в Linux добавьте SkiaSharp.NativeAssets.Linux; для Blazor WebAssembly добавьте SkiaSharp.Views.Blazor.
Получите коллекцию WordCloudEntry
s. Например, предположим, что у нас есть словарь частотности слов:
var Frequencys = new Dictionary<string, int>();// ...каким-то образом собираем частоты слов...IEnumerable<WordCloudEntry> wordEntries = Frequency.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
Создайте конфигурацию мирового облака:
вар wordCloud = новый WordCloudInput (wordEntries) {Ширина = 1024, Высота = 256, MinFontSize = 8, MaxFontSize = 32};
Нам нужно создать механизм рисования, размер шрифта и макет. В настоящее время мы используем SkiaSharp для быстрого кроссплатформенного измерения (и рисования) шрифтов. Мы также поддерживаем только логарифмические размеры шрифтов и спиральную раскладку. Все эти вещи реализованы в общем виде и могут быть легко расширены (вклад приветствуется).
var sizer = новый LogSizer (wordCloud); использование var engine = новый SkGraphicEngine (sizer, wordCloud); var макет = новый SpiralLayout (wordCloud); var colorizer = новый RandomColorizer (); // необязательный var wcg = новый WordCloudGenerator<SKBitmap>(wordCloud, движок, макет, раскрасщик);
Вы также можете SpecificColorizer
, чтобы раскрасить определенные слова выбранными цветами:
var colorizer = newSpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)}, запасной вариант: новый RandomColorizer()); // запасной аргумент не является обязательным
Вы также можете дополнительно передать шрифт в графический движок:
var typeface = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal); используя var engine = new SkGraphicEngine(sizer, wordCloud, typeface);
Теперь мы можем организовать облако тем:
IEnumerable<(LayoutItem Item, double FontSize)> items = wcg.Arrange();
И если мы, например, находимся в представлении Razor приложения ASP.NET Core, мы можем генерировать SVG из items
:
<svg viewBox="0,0,@wordCloud.Width,@wordCloud.Height">@foreach (var (item, fontSize) в элементах){const string format = "0.##"; // Используйте не более 2 знаков после запятой. var x = (item.Location.X - item.Measured.Left).ToString(формат);var y = (item.Location.Y - item.Measured.Top).ToString(format);var fs = fontSize.ToString (формат);var color = wcg.GetColorHexString(item); <text Transform="translate(@x, @y)" font-size="@fs" fill="@color">@item.Entry.Word</text></svg>
Альтернативно мы можем нарисовать облако тем (см. также пример WordFrequencies.ConsoleApp
):
используя var Final = new SKBitmap(wordCloud.Width, wordCloud.Height); используя var Canvas = new SKCanvas(final); // Рисуем на белом фоне.canvas.Clear(SKColors.White); используя var bitmap = wcg.Draw( );canvas.DrawBitmap(bitmap, 0, 0); // Сохранить в PNG. Используя var data = Final.Encode(SKEncodedImageFormat.Png, 100); использование var Writer = File.Create("output.png");data.SaveTo(writer);
Алгоритм мирового облака изначально был перенесен из SourceCodeCloud. Он использует Quadtrees, поэтому должен быть достаточно быстрым. Он вдохновлен реализацией Wordle (некогда известного алгоритма, использовавшегося на ныне несуществующем сайте wordle.net).
Простое консольное приложение, которое рисует облако слов PNG для слов, заданных на стандартном вводе, — это WordFrequencies.ConsoleApp
.
Эта библиотека также используется в производстве KnowledgePicker. Они используют его для рисования облаков тем для профилей пользователей.
Как упоминалось выше, сейчас реализована только часть функциональности, но любой вклад приветствуется. Не стесняйтесь открывать проблемы и запросы на извлечение.
Тесты в настоящее время поддерживаются только в Linux, поскольку они представляют собой тесты моментальных снимков (генерируют изображение облака слов и побайтно сравнивают его со снимком), и требуется дополнительная работа, чтобы обеспечить кроссплатформенность (например, использовать точно такой же шрифт). В Windows тесты можно запускать в WSL (Visual Studio поддерживает это напрямую). Тесты также автоматически запускаются в GitHub Actions.
После отправки тега запускается рабочий процесс GitHub release.yml
, который собирает и публикует пакет NuGet.