R 實現及相關文本挖掘 English participle
@[TOC](R實現及相關文本挖掘 English participle)
1 案例背景
目前樸素貝葉斯已經成功運用于垃圾郵件的過濾,也可用于垃圾短信的過濾,但是會有額外的挑戰
短信文本量減少了
短信口語化:縮寫,新興詞匯
數據:網上收集的帶有標簽的中英文短信數據
英文數據(sms_spam.csv):5559條數據,垃圾短信標記為spam,非垃圾短信標記為ham
文本處理:將數據轉化成一種詞袋(bag-of-words)的表示方法,忽略詞序,只提供簡單的變量查看單詞是否出現
2 準備數據
英文文本處理中,需要考慮去除數字和標點符號,去除沒有意義的單詞,將句子分解成單個的單詞
中文文本處理中,需要考慮去掉非中文字符或者非中英文字符,利用結巴分詞需要用到的包:jiebaR,tm
library(jiebaR,quietly = T) ##read and clean sms1<-read.csv("sms_spam.csv",encoding = "UTF-8") View(sms1) sms1$type<-as.factor(sms1$type) table(sms1$type)
加載包tm,創建一個語料庫(文本文件的集合)
Corpus創建一個語料庫存儲文本文檔,讀入的格式是VectorSource函數生成的向量信息
使用inspect查看語料庫前三條信息
##clean use tm install.packages("tm") install.packages("jiebaR") install.packages("wordcloud") library(tm) smsC<-Corpus(VectorSource(sms1$text)) class(smsC) # print(smsC) inspect(smsC[1:10])
tm_map()提供了一種用來轉換(處理)語料庫的方法,可以使用一系列轉換函數(?getTransformations查看)來清理語料庫,也可以是自定義函數
# remove characters that not letters remove_NP<-function(x){ gsub("[^a-zA-Z]"," ",x) } corpus1<-tm_map(smsC,function(x) stripWhitespace(removeWords(tolower(remove_NP(x)),stopwords()))) #stopwords 把停用詞去掉(默認英文) stripwhitespeace 去掉多余空格 inspect(corpus1[1:10])
3 建立訓練數據和測試數據
set.seed(21) index<-sample(1:nrow(sms1),nrow(sms1)*0.75) sms1_tr<-sms1[index,] sms1_te<-sms1[-index,] prop.table(table(sms1_tr$type)) prop.table(table(sms1_te$type)) smscor_tr<-corpus1[index] smscor_te<-corpus1[-index]
4 生成詞云圖表
需要用到的包wordcloud,也可以用wordcloud2(如用wordcloud2,一般需要裝生成頻數的包qdap)
min.freq:單詞在語料庫中出現的最小次數(一般為文檔總數目的10%);random.order指明詞云是否以隨機的順序排列;max.words指明最多出現多少單詞,scale表示單詞的最大和最小字體
##word cloud library(wordcloud) pal<-brewer.pal(6,"Dark2") wordcloud(smscor_tr,min.freq=40,random.order=T,colors=pal)#min.freq最小頻率,order排序 indsp<-sms1_tr$type=="spam" wordcloud(smscor_tr[indsp],max.words=40,random.order=F,scale=c(4,0.5),colors=pal)#max.words詞云最多出現多少單詞,scale詞云大小 wordcloud(smscor_tr[!indsp],max.words=40,random.order=F,scale=c(4,0.5),colors=pal)
5 選取頻繁詞為特征
創建文檔詞矩陣(行為文檔,列為詞,較大的稀疏矩陣):DocumentTermMatrix()
剔除訓練數據中出現在少于10封郵件中或少于記錄總數的0.1%的所有單詞,即找出所有頻繁詞:findFreqTerms()
按照頻繁詞重新生成文檔詞矩陣
稀疏矩陣中的元素表示單詞在文檔中出現的次數,需要轉化成因子變量:出現yes,沒出現no
##freq words smstr<-DocumentTermMatrix(smscor_tr)#語料庫對象生成詞文檔矩陣 inspect(smstr) dict<-findFreqTerms(smstr,10)#認為出現10以上的為高頻詞 smste<-DocumentTermMatrix(smscor_te,list(dictionary=dict)) inspect(smste) train<-apply(smstr[,dict],2,function(x) ifelse(x,"yes","no"))#把1,0轉換為yes,no,這步沒什么意義,主要支持naiveBayes函數 test<-apply(smste,2,function(x) ifelse(x,"yes","no"))
6 貝葉斯建模
需要用到的包e1017,gmodels
建模,預測分類,評估
其中的參數:type值為class(預測的類別)和raw(原始的預測概率)
其中的參數:prop.chisq表卡方貢獻值,prop.t表示表格占比,dnn表示行列總名稱
##model library(e1071) library(gmodels) smsclass<-naiveBayes(train,sms1_tr$type,laplace = 0)#laplace估計 test_pre<-predict(smsclass,test,type="class") CrossTable(sms1_te$type,test_pre,prop.chisq = F,prop.t=F,dnn=c("actual","predicted"))
AI R 語言 大數據 智能數據 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。