如何用R包做词频统计图(词云)?
詞頻是什么?
詞頻是一篇文章中每個單詞的出現頻數統計量
為什么要統計詞頻?
大體而言,一篇文章的主要內容可以從其中出現次數較多中的詞語獲知,大致內容也就類似一篇論文中的“關鍵字”吧,可以讓人預先了解到文章的主要內容方向
詞頻該如何表現?
用表格表現?不,文字和數字在視覺上并不能有很好的表現。所以這就引出了我這篇博客的主要內容“詞云”
怎么制作一個詞云?
問題一: 要安裝哪些包?
對于英文我們可以很好的通過空格將每個單詞拆分開來,比如說“Hi , i’m steven. nice to meet you ”,學過一點點編程的朋友都會將其拆成HI 、i‘m 、steven、nice 、to 、meet 、you,然而中文就行不通了。“你好,我是史蒂芬,很高興見到你”,你是一個字一個字的拆開(那樣就失去了我們原本的目的意義)?還是拆成 “我是史 蒂芬 很高 興見到 你”?如何正確的將語句拆分成我們日常習慣的詞語是一大難點。因此這里我們用了一個名叫Rwordseg的包,當然安裝此包時還得提前安裝rJava包,此外我們還需安裝wordcloud2包進行詞云圖繪制。
rJava鏈接: https://cran.r-project.org/web/packages/rJava/index.html 這個直接在R中install可能會出錯,所以最好下下來本地安裝
Rwordseg鏈接: http://jianl.org/cn/R/Rwordseg.html 也可直接在R中install
wordcloud2鏈接: 直接在R中install就好啦
問題二: 安裝rJava包時有問題?
必要1:因為rJava是R與java之間的通道,所以你的電腦上必須要有jdk,且jdk位數、R的位數與電腦操作系統位數一致
必要2:保證java的環境變量配置正確,這里我就不詳解,相信編程人員都會java的環境配置
必要3:在R中配置java_home環境變量:Sys.setenv(JAVA_HOME=’路徑’)
問題三: 如何分詞?
對于英文:
英文的話就不需要去特殊分詞了,直接以空格為基準拆分文本就好了
對于中文:
這里使用Rwordseg包中的segmentCN函數
segmentCN(strwords =數據)
如果strwords是一個文件路徑的話,則在相應路徑下生成一個名字添加.segments的文件,該文件為分詞后的數據文件。例如:strwords=“f:/text.txt”,則運行函數后會生成“f:/text.segments.txt”。輸出文件的路徑也可以通過參數outfile來重定向。
如果strwords是一串帶分詞的字符的話,那么函數直接返回分詞后的內容。
問題四: 分詞后數據該轉化為什么格式呢?
當然是data.frame啊,其主要形式為:
其一列為詞,一列為該詞的出現頻數
問題五: 怎么畫詞云?
這里使用wordcloud2包中的wordcloud2函數
wordcloud2(data,size,color,backgroundColor,shape,figPath)
1)data即為我們問題四中的data.frame
2)size可以控制繪畫出來的詞云的大小
3)color為詞云中詞語的顏色,可為某特定顏色,也可為包中自帶的“random-dark”(隨機暗色)或者“random-light”(隨機亮色)。這里應注意,在暗色背景中前景應為亮色,反之亦反。
4)backgroudColor為詞云中的背景顏色
5)shape為詞云的大致形狀:默認為‘circle’,也可以為‘cardioid’、‘diamond’、‘triangle-forward’、‘’triangle’、 ‘pentagon’、’star’。
6)figPath為詞云的自定義形狀:可以自己繪制一張以黑色為主要區域其他地方透明的圖片為詞云形狀,在使用自定義形狀時需將圖片反置在wordcloud2包中的examples文件夾中,然后:
figPath<-system.file(“examples/×××.png”,package = “wordcloud2”)即可在博客的最后我提供了幾張自己制作的圖片,朋友們任意使用也可以自行創造:
問題六: 博主,看起好麻煩呀,能不能爽快的給個函數?
of course~本著博主一向偉大的精神,只要能夠幫助到大家,代碼什么的好說好說(中英文本通用)
wordCloud<-function(file , encoding = 'ANSI' , language = 'chinese', filter = filterWords, ...){composition<-readLines(con = file,encoding = encoding)#讀取文本composition<-paste0(composition,collapse = ' ')#粘合每一行if (tolower(language) == 'chinese'){composition<-segmentCN(strwords = composition)#進行分詞wordsFreq<-data.frame(table(composition))#建立data.framewordsFreq[,1]<-as.character(wordsFreq[,1])#轉化為character類型wordsFreq<-wordsFreq[-which(nchar(wordsFreq[,1])<2),]#過濾單個字的詞頻}else if(tolower(language) == 'english'){composition<-gsub("[^a-zA-Z]"," ",composition)#除去非字母字符composition<-tolower(composition)#轉化為小寫composition<-strsplit(x = composition,split = ' ')#以空格為參考拆分wordsFreq<-data.frame(table(composition))#建立data.framewordsFreq[,1]<-as.character(wordsFreq[,1])#轉化為character類型wordsFreq<-wordsFreq[-which(nchar(wordsFreq[,1])<3),]#過濾詞頻temp<-apply(wordsFreq, 1, function(x){if (length(grep(pattern = x[1],x = filter)) == 1)return(FALSE)elsereturn(TRUE)})wordsFreq<-wordsFreq[temp,]}else{return(0)}wordsFreq<-wordsFreq[order(wordsFreq[,2],decreasing = T),]#給詞頻排序wordcloud2(data = wordsFreq , ...) }問題七: 博主你丫的說了半天,能不能來點樣品效果展示啊?
瞧你們一個個急的~好嘞,這就來:
針對本篇博客的詞云圖
針對2000年到2016年國內研究生英語考試的所有真題試卷的詞云圖
針對天宮二號百度百科的詞云圖
問題八: 畫出來的詞云老是顯示一些沒有意義的詞咋辦?
對于英文:
由于英文中存在大量的虛詞(連詞、介詞、冠詞、語氣詞),所以在對英文文本進行詞頻統計時本人會針對這些虛詞進行過濾,以下是我選出來的過濾參考文本
a about above across after ahead all along also although am among an and any are arong as at because been before begin behind below beneath besid beside besides best between beyond but by can close could down due during each even except far finally first firstly for fore form from front further furthermore get had has have he hence her hers him his how however in into is it its just last like likewise made make many may me means mine more moreover most my near neither nevertheless next nor not now of off on one only or other otherwise our ours out over owing own past rather result second secondly she should since so some still such take than that the their theirs them then there therefore therfore these they third thirdly this those though through thus to too under until upon us use very was we well were what when which while who will with within without would yet you your yours few much
在問題六中function有一個參數為filterWords,其中我默認為以上這個過濾參考文本
對于中文:
中文就比較好過濾啦,僅僅只需要將一個字的詞給過濾掉就OK了,因為大部分一個字的詞對詞云都沒有太大意義嘛
一些本人制作的詞云背景圖,請隨意使用
總結
以上是生活随笔為你收集整理的如何用R包做词频统计图(词云)?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php adodb类库下载,PHP中 A
- 下一篇: 《算法帝国》