KnowledgePicker.WordCloud
は、ワード クラウド (別名タグ クラウドまたは Wordle) を配置および描画するための最新 (.NET Standard 2.0) の高速ライブラリです。クアッドツリーを使用して超高速のパフォーマンスを実現します。これは、KnowledgePicker チームによって保守されています。
NuGet パッケージKnowledgePicker.WordCloud
をインストールします。
注:現在、SkiaSharp に基づく描画エンジンは 1 つだけです。一部のプラットフォームでは、SkiaSharp を正しく動作させるために追加の依存関係をインストールする必要があります。たとえば、Linux では、SkiaSharp.NativeAssets.Linux を追加します。 Blazor WebAssembly の場合は、SkiaSharp.Views.Blazor を追加します。
WordCloudEntry
のコレクションを取得します。たとえば、単語の出現頻度の辞書があるとします。
varfrequency = new Dictionary<string, int>();// ...何らかの方法で単語の出現頻度を収集...IEnumerable<WordCloudEntry> wordEntries =frequency.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
ワールド クラウド構成を作成します。
var wordCloud = new WordCloudInput(wordEntries){幅 = 1024、高さ = 256、最小フォント サイズ = 8、最大フォント サイズ = 32};
描画エンジン、フォントサイザー、レイアウトを作成する必要があります。現在、私たちは高速クロスプラットフォームフォント測定 (および描画) に SkiaSharp を使用しています。また、対数フォント サイズとスパイラル レイアウトのみをサポートします。これらはすべて汎用的な方法で実装されており、簡単に拡張できます (貢献は歓迎です)。
var sizer = new LogSizer(wordCloud);var エンジンを使用 = new SkGraphicEngine(sizer, wordCloud);varlayout = new SpiralLayout(wordCloud);var colorizer = new RandomColorizer(); //Optionalvar wcg = new WordCloudGenerator<SKBitmap>(wordCloud, エンジン, レイアウト, カラーライザー);
SpecificColorizer
使用して、特定の単語を選択した色で色付けすることもできます。
var colorizer = new SpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)},fallback: new RandomColorizer()); // フォールバック引数はオプションです
オプションでフォントをグラフィック エンジンに渡すこともできます。
var typeface = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal);using var Engine = new SkGraphicEngine(sizer, wordCloud, typeface);
これで、トピック クラウドを配置できます。
IEnumerable<(LayoutItem item, double FontSize)> items = wcg.Arrange();
たとえば、ASP.NET Core アプリケーションの Razor ビューにいる場合は、 items
から SVG を生成できます。
<svg viewBox="0,0,@wordCloud.Width,@wordCloud.Height">@foreach (var (item, fontSize) in items){const string format = "0.##"; // 小数点以下 2 桁までを使用します。 var x = (item.Location.X - item.Measured.Left).ToString(format);var y = (item.Location.Y - item.Measured.Top).ToString(format);var fs = fontSize.ToString (フォーマット);var color = wcg.GetColorHexString(item); <textTransform="translate(@x, @y)" font-size="@fs" fill="@color">@item.Entry.Word</text>}</svg>
あるいは、トピック クラウドを描画することもできます ( WordFrequencies.ConsoleApp
の例も参照)。
using var Final = new SKBitmap(wordCloud.Width, wordCloud.Height);using var Canvas = new SKCanvas(final);// 白い背景に描画します。background.canvas.Clear(SKColors.White);using var bitmap = wcg.Draw( );canvas.DrawBitmap(bitmap, 0, 0);// PNG に保存します。using var data = Final.Encode(SKEncodedImageFormat.Png, 100);using var Writer = File.Create("output.png");data.SaveTo(writer);
ワールド クラウド アルゴリズムは、最初は SourceCodeCloud から移植されました。 Quadtree を使用しているため、かなり高速になるはずです。これは、Wordle (かつては今はなきサイト wordle.net で使用されていた有名なアルゴリズム) の実装からインスピレーションを得ています。
標準入力で指定された単語のワード クラウド PNG を描画する単純なコンソール アプリケーションは、 WordFrequencies.ConsoleApp
です。
このライブラリは、KnowledgePicker によって運用環境でも使用されます。ユーザー プロファイルのトピック クラウドを描画するためにそれを使用します。
上で述べたように、現在実装されているのは機能のサブセットのみですが、あらゆる貢献を歓迎します。気軽にイシューを開いてリクエストをプルしてください。
テストは現在 Linux でのみサポートされています。これは、テストがスナップショット テスト (ワード クラウド イメージを生成し、それをスナップショットとバイト単位で比較する) であり、これがクロスプラットフォームであることを確認するにはさらに多くの作業が必要であるためです (たとえば、まったく同じものを使用するなど)。フォント)。 Windows では、テストは WSL で実行できます (Visual Studio はこれを直接サポートしています)。テストは GitHub Actions でも自動的に実行されます。
タグをプッシュした後、GitHub ワークフローrelease.yml
がトリガーされ、NuGet パッケージをビルドして公開します。