R語言SVM和LDA文本挖掘分類開源軟件存儲庫標(biāo)簽數(shù)據(jù)和詞云可視化
全文鏈接:http://tecdat.cn/?p=30413
原文出處:拓端數(shù)據(jù)部落公眾號
開源軟件存儲庫上有數(shù)千個開源軟件,可以從中免費使用該軟件。為了能夠有效和高效地識別用戶所需的軟件,已根據(jù)軟件的功能和屬性向軟件判斷了標(biāo)記。因此,標(biāo)簽分配成為開源軟件存儲庫軟件維護成功的關(guān)鍵。手動分配需要專家判斷軟件的功能和性能,并從軟件的大型標(biāo)簽池中選擇適當(dāng)?shù)念A(yù)定義標(biāo)簽,這顯然很耗時。因此,此任務(wù)上的軟件挖掘的目的是利用數(shù)據(jù)挖掘的進步,為新上傳的軟件項目啟用自動標(biāo)記分配(重新推薦)。
為了降低數(shù)據(jù)預(yù)處理(特別是網(wǎng)頁解析)的難度,在知名開源軟件倉庫中介紹不同開源軟件的網(wǎng)頁的主要內(nèi)容被提取并按照以下格式妥善存儲。
要挖掘的數(shù)據(jù)
數(shù)據(jù)以 txt 格式存儲。每行對應(yīng)于一個以該項目的 id 開頭的軟件項目。在id之后,有“#$#”引用的該軟件項目的提取文本描述。在此行的末尾,將附加標(biāo)記(用“,”分隔)。所有數(shù)據(jù)被拆分為兩個不相交的數(shù)據(jù)集。一個被命名為“train.data”(包含4465個軟件項目),而另一個被命名為“test.data”(包含大約1000個新軟件項目)。這兩個文件之間的唯一格式區(qū)別是所有標(biāo)簽都替換為單個未知標(biāo)記“?”??梢苑峙浣o任何軟件項目的標(biāo)簽集在“allTags.txt”中提供,其中每行對應(yīng)于一個標(biāo)簽。
你應(yīng)該使用“train”來構(gòu)建一個模型。data“(將隨文件一起提供給您,該文件指定了可以分配給軟件項目的標(biāo)記集),然后使用構(gòu)建的模型在評估階段為”test.data“中的每個軟件項目的標(biāo)記提供預(yù)測。
問題剖析
本次項目本質(zhì)上屬于數(shù)據(jù)挖掘中的分類問題,那總體的思路就是在提供的訓(xùn)練集上采用分類算法構(gòu)造出分類模型, 然后將分類模型應(yīng)用在測試集上, 得出測試集中所有記錄的分類結(jié)果。
從項目背景上就可以看出數(shù)據(jù)集在特征上的取值是稀疏的,文本信息中會出現(xiàn)大量的單詞,而一些常用的單詞,如 a ,an , and等是不具有分類特征的詞匯,屬于常用詞匯,因此在文本挖掘的過程中必須剔除這些詞匯。因此我們首先要做的就是對數(shù)據(jù)文本挖掘,然后對得到的詞頻進行預(yù)處理,剔除標(biāo)點,常用詞等,同時降低其稀疏性,也就是剔除出現(xiàn)頻率特別低的詞匯。其中注意的是在預(yù)處理過程中我們應(yīng)該保證訓(xùn)練集和測試集在形式上的一致,比如他們的屬性個數(shù)、類別應(yīng)該一致。
在數(shù)據(jù)預(yù)處理完成的基礎(chǔ)上,就應(yīng)該進行選擇分類算法,利用訓(xùn)練集構(gòu)造模型了。
最后就是應(yīng)用模型,得出測試集中結(jié)果。
數(shù)據(jù)挖掘過程
經(jīng)過問題分析后就開始進行各項工作了, 那首先就是平臺的選擇, 經(jīng)過比較后我最終采用了 R工具,因為此工具中功能比較健全,有助于我們分析。
文件導(dǎo)入
由于訓(xùn)練數(shù)據(jù)是文本數(shù)據(jù),因此不能用讀取excel或者讀取table的方式讀取數(shù)據(jù),只能通過readlines對數(shù)據(jù)的每一行文本進行讀取,主要思路就是讀文件到r,保存為訓(xùn)練數(shù)據(jù),然后讀取標(biāo)簽數(shù)據(jù)。因為標(biāo)簽數(shù)據(jù)是文檔格式數(shù)據(jù),可以直接用read.table讀取到r。
數(shù)據(jù)預(yù)處理
A、分割:
因為讀取后數(shù)據(jù)并不是格式化的,因此第一步就是對他進行分割處理,原有的數(shù)據(jù)每一行都包含了序號,文本和標(biāo)簽并用"#$#"隔開,因此,我們可以利用這個分割符號來對每個樣本進行處理。這里用到的是strsplit語句。分割后得到的標(biāo)簽數(shù)據(jù)仍然是混合在一起的,同樣可以找到分隔符號為“,”,因此再次對標(biāo)簽數(shù)據(jù)進行分割。得到每個樣本的標(biāo)簽數(shù)據(jù)。
B .格式化
由于得到的每個樣本的標(biāo)簽數(shù)據(jù)是一個集合,對于后面的分類問題來說,不是理想的數(shù)據(jù)格式,因此需要將標(biāo)簽數(shù)據(jù)轉(zhuǎn)化成二維矩陣的格式,每一行為一個樣本,每一列代表一個標(biāo)簽,所有列就是所有出現(xiàn)過的標(biāo)簽。如果該樣本中包含一個或多個標(biāo)簽,就將這些標(biāo)簽所對應(yīng)的元素標(biāo)為1,沒有出現(xiàn)的元素為0.最后生成一個標(biāo)簽矩陣。
算法選擇
?
分類算法無窮無盡, 針對不同的數(shù)據(jù)集, 算法的效率也不一樣, 因此選擇合適的算法是很重要的工作。
決策樹易于理解和解釋.人們在通過解釋后都有能力去理解決策樹所表達的意義。但由于本項目中樣本屬性較多,因此可能會出現(xiàn)較多的分支和較大的樹,從而很難得到有效的判斷。人工神經(jīng)網(wǎng)絡(luò)雖然分類的準(zhǔn)確度高,并行分布處理能力強,不能觀察之間的學(xué)習(xí)過程,輸出結(jié)果難以解釋。
Knn算法雖然原理簡單有效,但是計算量較大,對于數(shù)據(jù)量較大的數(shù)據(jù)不太合適,對高維數(shù)據(jù)進行分類時會而且導(dǎo)致其準(zhǔn)確率下降。
而SVM可以解決高維問題,同時可以避免神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)選擇和局部極小點問題。因此,最終選用該算法來建立分類模型。
支持向量機
SVM 是支持向量機的簡稱, 是統(tǒng)計學(xué)習(xí)理論中 最年輕的內(nèi)容, 也是最實用的部分。其核心內(nèi)容是在 1992 到 1995 年間提出的, 目前仍處在不斷發(fā)展階段。支持向量機可用 于模式識別、回歸分析 、主成分分析等.下面以模式 分類為例來介紹支持向量機的含義 .
給定一組訓(xùn)練數(shù)據(jù)(x 1 , y 1), … ,(x l , y l), xi ∈ R n , yi ∈{ +1 , -1} , i =1 , 2 , …, l,我們要尋找一 個分類規(guī)則 I(x),使它能對未知類別的新樣本(新 樣本與訓(xùn)練樣本獨立同分布)作盡可能正確的劃分 。支持向量機用于分類問題其實就是尋找一個最 優(yōu)分類超平面, 把此平面作為分類決策面.同時它還 通過引進核函數(shù)巧妙地解決了在將低維空間向量映 射到高維空間向量時帶來的“維數(shù)災(zāi)難”問題。
基于LDA的文本主題挖掘
對于文本處理過程首先要擁有分析的語料(text corpus),比如報告、出版物、網(wǎng)頁文章等。而后根據(jù)這些語料建立半結(jié)構(gòu)化的文本庫(text database),生成包含詞頻的結(jié)構(gòu)化的詞條 -文檔矩陣(term-document matrix)。

LDA是一種非監(jiān)督機器學(xué)習(xí)技術(shù),可以用來識別大規(guī)模文檔集(document collection)或語料庫(corpus)中潛藏的主題信息。它采用了詞袋(bag of words)的方法,這種方法將每一篇文檔視為一個詞頻向量,從而將文本信息轉(zhuǎn)化為了易于建模的數(shù)字信息。但是詞袋方法沒有考慮詞與詞之間的順序,這簡化了問題的復(fù)雜性,同時也為模型的改進提供了契機。每一篇文檔代表了一些主題所構(gòu)成的一個概率分布,而每一個主題又代表了很多單詞所構(gòu)成的一個概率分布。由于 Dirichlet分布隨機向量各分量間的弱相關(guān)性(之所以還有點“相關(guān)”,是因為各分量之和必須為1),使得我們假想的潛在主題之間也幾乎是不相關(guān)的,這與很多實際問題并不相符,從而造成了LDA的又一個遺留問題。
對于語料庫中的每篇文檔,LDA定義了如下生成過程(generative process):
對每一篇文檔,從主題分布中抽取一個主題;
從上述被抽到的主題所對應(yīng)的單詞分布中抽取一個單詞;
重復(fù)上述過程直至遍歷文檔中的每一個單詞。
更形式化一點說,語料庫中的每一篇文檔與?T(通過反復(fù)試驗等方法事先給定)個主題的一個多項分布相對應(yīng),將該多項分布記為?θ。每個主題又與詞匯表(vocabulary)中的 ?V個單詞的一個多項分布相對應(yīng),將這個多項分布記為??。上述詞匯表是由語料庫中所有文檔中的所有互異單詞組成,但實際建模的時候要剔除一些停用詞(stopword),還要進行一些詞干化(stemming)處理等。θ?和?分別有一個帶有超參數(shù)(hyperparameter)α和β的Dirichlet先驗分布。對于一篇文檔d中的每一個單詞,我們從該文檔所對應(yīng)的多項分布θ中抽取一個主題z,然后我們再從主題z所對應(yīng)的多項分布?中抽取一個單詞w。將這個過程重復(fù)Nd次,就產(chǎn)生了文檔d,這里的Nd是文檔d的單詞總數(shù)。這個生成過程可以用如下的圖模型表示:

這個圖模型表示法也稱作“盤子表示法”(plate notation)。圖中的陰影圓圈表示可觀測變量(observed variable),非陰影圓圈表示潛在變量(latent variable),箭頭表示兩變量間的條件依賴性(conditional dependency),方框表示重復(fù)抽樣,重復(fù)次數(shù)在方框的右下角。
該模型有兩個參數(shù)需要推斷(infer):一個是“文檔-主題”分布θ,另外是T個“主題-單詞”分布?。通過學(xué)習(xí)(learn)這兩個參數(shù),我們可以知道文檔作者感興趣的主題,以及每篇文檔所涵蓋的主題比例等。推斷方法主要有LDA模型作者提出的變分-EM算法,還有現(xiàn)在常用的Gibbs抽樣法。
LDA模型現(xiàn)在已經(jīng)成為了主題建模中的一個標(biāo)準(zhǔn)。如前所述,LDA模型自從誕生之后有了蓬勃的擴展,特別是在社會網(wǎng)絡(luò)和社會媒體研究領(lǐng)域最為常見。
算法實現(xiàn)
根據(jù)SVM和LDA文本挖掘的原理,通過r語言可以做出以下的代碼實現(xiàn):
for(j in 1:length(colindex))tagmatrix[j,colindex[[j]]]=1; ####建立語料庫 reuters <- Corpus(VectorSource(traindata)) #下一步用tm_map命令對語料庫文件進行預(yù)處理,將其轉(zhuǎn)為純文本并去除多余空格,轉(zhuǎn)換小寫,去除常用詞匯、合并異形同意詞匯 reuters <- tm_map(reuters, as.PlainTextDocument)
再之后就可以利用R語言中任何工具加以研究了,下面用層次聚類試試看: 先進行標(biāo)準(zhǔn)化處理,再生成距離矩陣,再用層次聚類.
d <- dist(data.scale, method = "euclidean")

繪制詞匯圖
wordcloud(names(d),d,random.order=FALSE,random.color=FALSE,colors=mycolors,family="my

建立分類器
tagmod=tagmatrix[,1]#每個樣本的第一個分類標(biāo)簽
SVM分類
preds <- predict(model.svm, trainmod,type="class") tab=table(preds,trainmod[,ncol(trainmod)])#分類混淆矩陣 k=10#設(shè)置為10折交叉驗證 for(kk in 1:k){ ? index=sample(1:dim(trainmod)[1],floor(dim(trainmod)[1]*(1/k)),replace=F)#篩選樣本 ? test=as.data.frame(trainmod[index,])#訓(xùn)練集 ? ? ?

結(jié)果分析
經(jīng)過算法的實現(xiàn),我們已經(jīng)通過訓(xùn)練集得到了分類模型,經(jīng)過十折交叉驗證發(fā)現(xiàn)其準(zhǔn)確率能達到 99.8%,接下來就是將測試集導(dǎo)入并且運用剛剛生成的模型產(chǎn)生結(jié)果了, 同樣的是運用 R工具。 其中需要注意的是測試集中缺失的類別值用?來代替。 將生成的結(jié)果保存下來發(fā)現(xiàn)?前面出現(xiàn)了數(shù)字,這就是我們所要尋找的類別值。
雖然前面訓(xùn)練集產(chǎn)生的模型的準(zhǔn)確率能達到99.8%,但是實際測試集的準(zhǔn)確率又是不確定的, 不一定比他高還是比他低, 但幅度肯定不會很大。 同時從算法本身來看就存在著一定的缺陷, 因為經(jīng)典的SVM分類算法要求分類屬性是二元變量,而對于多元變量來說,必須組合多個SVM模型,從而可能是算法的準(zhǔn)確度下降,對本項目的數(shù)據(jù)來說,每一個樣本可能屬于多個類別,因此使用svm分類的時候,可能導(dǎo)致算法的準(zhǔn)確度下降。
誤差肯定還不止以上的方面, 但是總體來說這個分類器還是可以的, 經(jīng)過十折交叉驗證準(zhǔn)確率還是有保證的。

最受歡迎的見解
1.Python主題建模LDA模型、t-SNE 降維聚類、詞云可視化文本挖掘新聞組
2.R語言文本挖掘、情感分析和可視化哈利波特小說文本數(shù)據(jù)
3.r語言文本挖掘tf-idf主題建模,情感分析n-gram建模研究
4.游記數(shù)據(jù)感知旅游目的地形象
5.疫情下的新聞數(shù)據(jù)觀察
6.python主題lda建模和t-sne可視化
7.r語言中對文本數(shù)據(jù)進行主題模型topic-modeling分析
8.主題模型:數(shù)據(jù)聆聽人民網(wǎng)留言板的那些“網(wǎng)事”
9.python爬蟲進行web抓取lda主題語義數(shù)據(jù)分析