日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#中使用jieba.NET、WordCloudSharp制作词云图

發(fā)布時(shí)間:2023/12/4 C# 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中使用jieba.NET、WordCloudSharp制作词云图 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

詞云簡(jiǎn)介

“詞云”由美國(guó)西北大學(xué)新聞學(xué)副教授、新媒體專(zhuān)業(yè)主任里奇·戈登(Rich Gordon)于2006年最先使用,是通過(guò)形成“關(guān)鍵詞云層”或“關(guān)鍵詞渲染”,對(duì)文本中出現(xiàn)頻率較高的“關(guān)鍵詞”的視覺(jué)上的突出
網(wǎng)上大部分文章介紹的是使用Python的jieba、wordcloud的庫(kù)生成詞云圖,本文則介紹在C#中如何使用jieba.NET、WordCloudSharp庫(kù)生成詞云圖,后者是前者的.NET實(shí)現(xiàn)。

準(zhǔn)備工作

創(chuàng)建一個(gè)C#的控制臺(tái)項(xiàng)目,通過(guò)NuGet添加引用對(duì)jieba.NETWordCloudSharp的引用,使用方法可以參考以下鏈接:

  • jieba.NET:https://github.com/anderscui/jieba.NET

  • WordCloudSharp:https://github.com/AmmRage/WordCloudSharp

安裝之后,在packages\jieba.NET目錄下找到Resources目錄,將整個(gè)Resources目錄拷貝到程序集所在目錄,這里面是jieba.NET運(yùn)行所需的詞典及其它數(shù)據(jù)文件。

基本算法

算法主要步驟如下:

  • 提取關(guān)鍵詞:基于TF-IDF算法、TextRank算法提取文本的關(guān)鍵詞,按權(quán)重大小選取部分關(guān)鍵詞。

  • 統(tǒng)計(jì)關(guān)鍵詞詞頻:先將文本分詞,統(tǒng)計(jì)每個(gè)詞的詞頻,再篩選出關(guān)鍵詞的詞頻。

  • 生成詞云圖:根據(jù)關(guān)鍵詞及其詞頻信息在蒙版圖片的基礎(chǔ)上生成詞圖。

注:本文采用TF-IDF算法提取關(guān)鍵詞,蒙版圖目前只支持黑白圖片

TF-IDF(詞頻-逆文檔頻率)算法是一種統(tǒng)計(jì)方法,用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降

算法實(shí)現(xiàn)

使用JiebaNet.Analyser.TfidfExtractor.ExtractTagsWithWeight(string text, int count = 20, IEnumerable?allowPos = null)從指定文本中抽取關(guān)鍵詞的同時(shí)得到其權(quán)重,代碼如下:

/// <summary> /// 從指定文本中抽取關(guān)鍵詞的同時(shí)得到其權(quán)重 /// </summary> /// <param name="text"></param> /// <returns></returns> static WordWeightPair[] ExtractTagsWithWeight(string text) {var extractor = new TfidfExtractor();var wordWeight = extractor.ExtractTagsWithWeight(text, 50);StringBuilder sbr = new StringBuilder();sbr.Append("詞語(yǔ)");sbr.Append(",");sbr.Append("權(quán)重");sbr.AppendLine(",");foreach (var item in wordWeight){sbr.Append(item.Word);sbr.Append(",");sbr.Append(item.Weight);sbr.AppendLine(",");}string filename = "關(guān)鍵詞權(quán)重統(tǒng)計(jì).csv";File.WriteAllText(filename, sbr.ToString(), Encoding.UTF8);Console.WriteLine("關(guān)鍵詞提取完成:" + filename);return wordWeight.ToArray(); }

使用JiebaNet.Segmenter.Common下的Counter類(lèi)統(tǒng)計(jì)詞頻,其實(shí)現(xiàn)來(lái)自Python標(biāo)準(zhǔn)庫(kù)的Counter類(lèi)(具體接口和實(shí)現(xiàn)細(xì)節(jié)略有不同),代碼如下:

/// <summary> /// 分詞并統(tǒng)計(jì)詞頻:默認(rèn)為精確模式,同時(shí)也使用HMM模型 /// </summary> /// <param name="text"></param> /// <param name="wordWeightAry"></param> /// <returns></returns> static KeyValuePair<string, int>[] Counter(string text, WordWeightPair[] wordWeightAry) {var segmenter = new JiebaSegmenter();var segments = segmenter.Cut(text);var freqs = new Counter<string>(segments);KeyValuePair<string, int>[] countAry = new KeyValuePair<string, int>[wordWeightAry.Length];for (int i = 0; i < wordWeightAry.Length; i++){string key = wordWeightAry[i].Word;countAry[i] = new KeyValuePair<string, int>(key, freqs[key]);}StringBuilder sbr = new StringBuilder();sbr.Append("詞語(yǔ)");sbr.Append(",");sbr.Append("詞頻");sbr.AppendLine(",");foreach (var pair in countAry){sbr.Append(pair.Key);sbr.Append(",");sbr.Append(pair.Value);sbr.AppendLine(",");}string filename = "詞頻統(tǒng)計(jì)結(jié)果.csv";File.WriteAllText(filename, sbr.ToString(), Encoding.UTF8);Console.WriteLine("詞頻統(tǒng)計(jì)完成:" + filename);return countAry; }

使用WordCloudSharp生成詞云圖,蒙版圖必須使用黑白圖片,記得手動(dòng)引用System.Drawing,代碼如下:

/// <summary> /// 創(chuàng)建詞云圖 /// </summary> /// <param name="countAry"></param> static void CreateWordCloud(KeyValuePair<string, int>[] countAry) { string markPath = "mask.jpg";string resultPath = "result.jpg";Console.WriteLine("開(kāi)始生成圖片,讀取蒙版:" + markPath);Image mask = Image.FromFile(markPath);//使用蒙版圖片var wordCloud = new WordCloud(mask.Width, mask.Height, mask: mask, allowVerical: true, fontname: "YouYuan");//不使用蒙版圖片//var wordCloud = new WordCloud(1000, 1000,false, null,-1,1,null, false);var result = wordCloud.Draw(countAry.Select(it => it.Key).ToList(), countAry.Select(it => it.Value).ToList());result.Save(resultPath);Console.WriteLine("圖片生成完成,保存圖片:" + resultPath); }

運(yùn)行測(cè)試

以本文為分析文本生成詞云圖,代碼如下:

static void Main(string[] args) {string text = File.ReadAllText("待處理數(shù)據(jù).txt");var wordWeight = ExtractTagsWithWeight(text);var wordFreqs = Counter(text, wordWeight);CreateWordCloud(wordFreqs);Console.Read(); }

蒙版圖如下:

詞云圖如下(使用蒙版):

詞云圖如下(不使用蒙版):

在得到關(guān)鍵詞的詞頻信息后,通過(guò)在線工具網(wǎng)站生成詞云圖片會(huì)更加方便一點(diǎn),如詞云文字、圖悅等。

參考資料

  • jieba.NET是jieba中文分詞的.NET版本(C#實(shí)現(xiàn))

  • TF-IDF算法和TextRank算法的分析比較

  • Python生成詞云圖

總結(jié)

以上是生活随笔為你收集整理的C#中使用jieba.NET、WordCloudSharp制作词云图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。