KnowledgePicker.WordCloud
는 단어 구름(태그 구름 또는 단어라고도 함)을 정렬하고 그리기 위한 최신(.NET Standard 2.0) 빠른 라이브러리입니다. 엄청나게 빠른 성능을 위해 Quadtrees를 사용합니다. KnowledgePicker 팀에서 관리합니다.
NuGet 패키지 KnowledgePicker.WordCloud
를 설치합니다.
참고 현재 SkiaSharp를 기반으로 하는 드로잉 엔진은 하나만 있습니다. 일부 플랫폼에서는 SkiaSharp가 올바르게 작동하려면 추가 종속성을 설치해야 합니다. 예를 들어 Linux에서는 SkiaSharp.NativeAssets.Linux를 추가합니다. Blazor WebAssembly의 경우 SkiaSharp.Views.Blazor를 추가합니다.
WordCloudEntry
컬렉션을 가져옵니다. 예를 들어, 단어 빈도 사전이 있다고 가정합니다.
var Frequency = new Dictionary<string, int>();// ...어떻게든 단어 빈도를 수집합니다...IEnumerable<WordCloudEntry> wordEntries = 빈도.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
월드 클라우드 구성 생성:
var wordCloud = new WordCloudInput(wordEntries){Width = 1024,Height = 256,MinFontSize = 8,MaxFontSize = 32};
그리기 엔진, 글꼴 크기 조정기, 레이아웃을 만들어야 합니다. 현재 우리는 빠른 크로스 플랫폼 글꼴 측정(및 그리기)을 위해 SkiaSharp를 사용합니다. 또한 로그 글꼴 크기와 나선형 레이아웃만 지원됩니다. 이 모든 것들은 일반적인 방식으로 구현되며 쉽게 확장될 수 있습니다(기여를 환영합니다).
var sizer = 새 LogSizer(wordCloud);사용 var 엔진 = 새 SkGraphicEngine(sizer, wordCloud);var 레이아웃 = 새 SpiralLayout(wordCloud);var colorizer = 새 RandomColorizer(); // 선택사항var wcg = new WordCloudGenerator<SKBitmap>(wordCloud, 엔진, 레이아웃, 컬러라이저);
SpecificColorizer
사용하여 특정 단어를 선택한 색상으로 채색할 수도 있습니다.
var colorizer = newSpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)},fallback: new RandomColorizer()); // 대체 인수는 선택 사항입니다.
선택적으로 그래픽 엔진에 글꼴을 전달할 수도 있습니다.
var typeface = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal);using varengine = 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 (항목, 글꼴 크기)){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
참조).
var final = new SKBitmap(wordCloud.Width, wordCloud.Height) 사용; var canvas = new SKCanvas(final) 사용;// 흰색 background.canvas.Clear(SKColors.White) 사용; var bitmap = wcg.Draw( );canvas.DrawBitmap(bitmap, 0, 0);// var data =를 사용하여 PNG에 저장 final.Encode(SKEncodedImageFormat.Png, 100);사용 varwriter = File.Create("output.png");data.SaveTo(writer);
월드 클라우드 알고리즘은 처음에 SourceCodeCloud에서 이식되었습니다. Quadtree를 사용하므로 상당히 빠릅니다. 이는 Wordle(한때 현재는 없어진 사이트 wordle.net에서 사용된 유명한 알고리즘)의 구현에서 영감을 받았습니다.
표준 입력에 제공된 단어에 대해 단어 구름 PNG를 그리는 간단한 콘솔 애플리케이션은 WordFrequencies.ConsoleApp
입니다.
이 라이브러리는 KnowledgePicker의 프로덕션에도 사용됩니다. 그들은 이를 사용하여 사용자 프로필에 대한 주제 클라우드를 그립니다.
위에서 언급했듯이 현재 기능의 하위 집합만 구현되어 있지만 모든 기여를 환영합니다. 자유롭게 이슈를 열고 요청을 가져오세요.
테스트는 현재 Linux에서만 지원됩니다. 왜냐하면 이는 스냅샷 테스트(단어 클라우드 이미지를 생성하고 이를 스냅샷과 바이트별로 비교)이기 때문입니다. 크로스 플랫폼인지 확인하려면 더 많은 작업이 필요합니다(예: 정확히 동일한 것을 사용). 세례반). Windows에서는 WSL에서 테스트를 실행할 수 있습니다(Visual Studio는 이를 직접 지원합니다). 테스트는 GitHub Actions에서도 자동으로 실행됩니다.
태그를 푸시하면 NuGet 패키지를 빌드하고 게시하는 GitHub 워크플로 release.yml
트리거됩니다.