C#中使用jieba.NET、WordCloudSharp制作詞云圖的步驟
詞云簡(jiǎn)介
“詞云”由美國(guó)西北大學(xué)新聞學(xué)副教授、新媒體專業(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.NET、WordCloudSharp的引用,使用方法可以參考以下鏈接:
- 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
/// <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類統(tǒng)計(jì)詞頻,其實(shí)現(xiàn)來(lái)自Python標(biāo)準(zhǔn)庫(kù)的Counter類(具體接口和實(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))
到此這篇關(guān)于C#中使用jieba.NET、WordCloudSharp制作詞云圖的文章就介紹到這了,更多相關(guān)C#制作詞云圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#實(shí)現(xiàn)萬(wàn)年歷示例分享 萬(wàn)年歷農(nóng)歷查詢
這篇文章主要介紹了c#實(shí)現(xiàn)萬(wàn)年歷的方法,可以顯示農(nóng)歷、節(jié)氣、節(jié)日、星座、星宿、屬相、生肖、閏年月、時(shí)辰,大家參考使用吧2014-01-01C#中判斷本地系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài)的方法
C#中一般通過(guò)InternetGetConnectedState函數(shù)返回本地系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài),下面簡(jiǎn)單介紹下,需要的朋友可以參考下2013-10-10Unity實(shí)現(xiàn)3D貪吃蛇的移動(dòng)代碼
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)3D貪吃蛇的移動(dòng)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法
這篇文章主要介紹了winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法,以實(shí)例分析了C#中WinForm操作窗體及文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C#中調(diào)用命令行cmd開(kāi)啟wifi熱點(diǎn)的實(shí)例代碼
最近想在win7上開(kāi)啟wifi熱點(diǎn),于是就弄出下面這個(gè)小東西,里面涉及如何在控制臺(tái)上輸入命令,分享一下。首先在VS中創(chuàng)建一個(gè)window窗口,然后創(chuàng)建兩個(gè)四個(gè)button,兩個(gè)輸入框2013-04-04詳解WPF如何顯示具有層級(jí)關(guān)系的數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了在WPF中如何顯示具有層級(jí)關(guān)系的數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04通過(guò)實(shí)例解析c# yield關(guān)鍵字使用方法
這篇文章主要介紹了通過(guò)實(shí)例解析c# yield關(guān)鍵字使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09