R案例操作:RQDA和tm包結合進行文字挖掘
應用定性資料分析包RQDA(Qualitative Data Analysis)和文挖掘框架包tm結合進行文字挖掘。
在對訪談內容或劇本、小說部分內容進行文字挖掘時,如果用不斷的剪粘儲存的方法非常繁瑣而且容易漏掉一些內容。好在黃榮貴開發的RQDA包可以進行文件管理和內容編碼及提取,大大方便了利用tm包進行文字挖掘,既提高了效率又提高了準確性,下面舉一個小例子:
1、安裝RQDA包、tm包和中文分詞軟體(分詞軟體見下面連結); http://www.pinggu.org/bbs/thread-853290-1-1.html
注:現在中文分詞軟體已經直接放到RQDAtm程式包中(https://r-forge.r-project.org/R/?group_id=137
2、裝載RQDA包並建立一個新的工程專案;
3、輸入相關文字檔案;
4、進行編碼和作標記;
5、雙擊想要提取的編碼即可提取相關文字;
6、執行下面下載的程式進行文字提取、轉換、分詞、文字挖掘工作。
> gg <- RQDA2tm("記者" ,mf = FALSE) > gg A corpus with 55 text documents > ------------------------------------------------ > ### 去掉多餘空格 ####> reuters <- tm_map(gg, stripWhitespace) > reuters[[1]] 這個也是臨時改的?這兒應該放一個那樣的桌子。 > ------------------------------------------------ > ## 全文搜尋 ##> searchFullText(gg[[1]], "是臨[時]?改") [1] TRUE> ------------------------------------------------ > ### 查詢以某字開頭、結尾等的詞條 ###> stemCompletion(gg, c("財", "政", "部")) 財 政 部"財政部就是替政府花錢的" "" ""------------------------------------------------ > ### 元資料管理 ###> DublinCore(reuters[[2]], "title") <- "建國60週年"> meta(reuters[[2]]) Available meta data pairs are: Author : DateTimeStamp: 2010-07-15 02:06:27 Description : Heading : 建國60週年 ID : 2 Language : eng Origin : > ------------------------------------------------ > ### 建立詞條-檔案矩陣> > dtm <- DocumentTermMatrix(reuters,control = list(minWordLength=2))##最短詞兩個字> inspect(dtm[1:2, 3:6]) A document-term matrix (2 documents, 4 terms) Non-/sparse entries: 0/8Sparsity : 100% Maximal term length: 5Weighting : term frequency (tf) Terms Docs 10000 12 120 1966 1 0 0 0 0 2 0 0 0 0------------------------------------------------ > ## 操作詞條-檔案矩陣 ##> ## 1、找出最少出現過3次的詞條 ##> findFreqTerms(dtm, 3) [1] "政策"------------------------------------------------ > ## 2、找出與"應該"相關度到少達0.6的詞條 ###> findAssocs(dtm, "應該", 0.6)0.11 應該 桌子 臨時1.0 1.0 1.0 0.7>
其他看上面的連結中的內容,其實生成詞條-檔案矩陣後還有許多工作可以做,比如用支援向量機進行檔案分類、話題分類、根據話題用詞頻率分析作者所熟悉的行業等等……
民網 >> 時政 >> 時政專題 >> 網友進言
http://politics.people.com.cn/GB/8198/138817/index.html
MetaID fname fid 1 0 公安部答覆本網網友關於輕微交通違法處罰等4問題 1 2 0 公安部答覆本網網友關於駕齡計算、異地購車上牌、老人駕車等8問題 2 3 0 公安部答覆本網網友關於如何轉回農業戶口等3問題 3 4 0 公安部回覆本網網友關於駕駛證年檢被登出等3問題 4 5 0 公安部回覆人民網網友關於異地繳交通罰款等4問題 5 6 0 公安部回覆人民網網友關於身份證重號錯號等4問題 6
一、出現5次以上的詞條 —————————————————————————- 1、根據編碼“網友”分析:
gg <- RQDA2tm("網友" ,mf = TRUE)
> findFreqTerms(dtm, 5)
[1] "駕駛" "身份證" "問題"
—————————————————————————- 2、根據編碼“公安部迴應”分析:
gg <- RQDA2tm("公安部迴應" ,mf = TRUE)
> findFreqTerms(dtm, 5)
[1] "辦理" "部門" "公安" "管理" "規定" "機動車" "機關" "交通"[9] "安全" "不得" "車輛" "道路" "駕駛" "駕駛證" "汽車" "實施"[17] "使用" "小型" "營運" "載貨" "載客" "證明" "工作" "法律"[25] "公民" "居民" "社會" "身份" "身份證" "條件" "相關" "行為"[33] "證件" "措施" "違法" "應當" "公安部" "資訊"
************************************************************** 二、找出與“駕駛”相關達70%以上的詞條 —————————————————————————- 1、根據編碼“網友”分析:
> findAssocs(dtm, "駕駛", 0.7)
駕駛 公安部 能否 規定 駕照 汽車 1.00 0.87 0.80 0.79 0.78 0.72
—————————————————————————- 2、根據編碼“公安部迴應”分析:
> findAssocs(dtm, "駕駛", 0.7)
駕駛 需要 期限 證明 小型 法律 使用 中型 駕駛證 依法 檢查 1.00 0.95 0.90 0.86 0.84 0.83 0.80 0.79 0.77 0.77 0.75
有效 超過 0.75 0.72
************************************************************** MetaID fname fid 1 0 公安部答覆本網網友關於輕微交通違法處罰等4問題 1 2 0 公安部答覆本網網友關於駕齡計算、異地購車上牌、老人駕車等8問題 2 3 0 公安部答覆本網網友關於如何轉回農業戶口等3問題 3 4 0 公安部回覆本網網友關於駕駛證年檢被登出等3問題 4 5 0 公安部回覆人民網網友關於異地繳交通罰款等4問題 5 6 0 公安部回覆人民網網友關於身份證重號錯號等4問題 6
對上面的資料改為將每條迴應為研究物件進行文件聚類分析,結果如下:
綜合上面兩種聚類分析可以判斷:公安部負責對人民網網民進行迴應的工作人員有兩名,因為每個人的寫作用詞習慣是比較固定的。
對三位房地產大佬在搜房網部落格近期文章的分析:
搜房網部落格連結: 潘石屹 http://blog.soufun.com/blog_132261.htm 王石 http://blog.soufun.com/blog_1525150.htm 任志強 http://blog.soufun.com/blog_1796106.htm
標題:
> txt
MetaID fname fid ID
1 0 穿越“鬼門關”登山者視界4(王) 3 1
2 0 美麗的建築網友交流42(王) 7 2
3 0 如何瞭解日本民族網上交流43(王) 8 3
> txt
MetaID fname fid ID
1 0 從發改委的檔案看政策的變化(任) 4 1
2 0 該不該降價(任) 6 2
3 0 聽老柳侃管理(任) 11 3
4 0 穩定、明確的政策預期更為重要(任) 12 4
5 0 先拆還是先建,這是一門藝術(任) 13 5
6 0 幸福指數——再次寫給八零後(任) 16 6
> txt
MetaID fname fid ID
1 0 IPAD現象預示了社會結構的變化(潘) 1 1
2 0 SOHO中國進駐上海外灘(潘) 2 2
3 0 房地產業要做受人尊重的行業(潘) 5 3
4 0 商業地產與住房是兩個完全不同的市場(潘) 9 4
5 0 世界正經歷分娩之陣痛(潘) 10 5
6 0 現在中國房地產市場上“尖叫”聲一片(潘) 14 6
7 0 信仰改變了我的生命(潘) 15 7
8 0 銀河SOHO和光華路SOHO2通過LEED預認證(潘) 17 8
9 0 銀河SOHO開盤三天銷售46.75億元(潘) 18 9
10 0 致《酥油》作者: 你的愛和我們的感受構成世界的力量(潘) 19 10
>
結果:
> ## 任志強最喜歡的用詞:> inspect(dtm_rzq[,j])
A document-term matrix (6 documents, 10 terms)
Non-/sparse entries: 41/19Sparsity : 32%
Maximal term length: 2Weighting : term frequency (tf)
Terms
Docs 價格 企業 租賃 發展 改革 沒有 社會 一代 知道 中國 1 0 1 5 4 7 0 3 0 0 6
2 31 2 0 3 1 7 4 0 4 15
3 0 42 0 4 0 5 4 0 0 2
4 9 1 0 0 0 7 4 0 3 4
5 1 0 25 3 0 6 4 0 2 4
6 1 5 0 25 48 30 55 41 35 51> ## 潘石屹最喜歡的用詞:> inspect(dtm_psy[,j])
A document-term matrix (10 documents, 9 terms)
Non-/sparse entries: 49/41Sparsity : 46%
Maximal term length: 4Weighting : term frequency (tf)
Terms
Docs 一個 商業 上海 外灘 專案 房地產 市場 土地 soho 1 17 12 0 0 0 4 4 1 1
2 6 17 15 27 21 1 2 2 6
3 8 0 0 0 2 11 2 10 0
4 6 16 0 0 2 0 5 0 13
5 10 2 0 0 6 0 0 0 9
6 5 4 3 0 1 17 37 15 0
7 5 0 0 0 1 0 1 0 0
8 1 0 0 0 8 0 0 0 7
9 1 15 0 0 4 0 9 0 18
10 7 0 0 0 0 0 0 1 0> ## 王石最喜歡的用詞> inspect(dtm_ws[,j])
A document-term matrix (3 documents, 16 terms)
Non-/sparse entries: 17/31Sparsity : 65%
Maximal term length: 2Weighting : term frequency (tf)
Terms
Docs 冰川 穿越 攀登 融化 珠峰 處理 東京 焚燒 垃圾 等級 瞭解 日本 喜歡 相撲 1 18 6 4 8 4 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 4 4 8 11 0 0 1 0 0
3 0 0 0 0 0 0 0 0 0 4 4 7 4 10
Terms
Docs 運動 秩序 1 0 0
2 0 0
3 4 6
由此看來王石仍然在到處玩兒,怪不得從萬科A到萬科B,再到萬科債券08G1、08G2都跌的一塌糊塗。任志強的興趣仍在研究國家政策,憂國憂民啊! 老潘的工作重點已經轉到上海的商業地產了。
現在再用支援向量機的方法對上面的資料建模,看是否能分辨出某些話是誰說的:
> library(e1071)
> ## 生成訓練用的資料 ##………………
> tt <- rbind(tt,tt1)
>
> tt[is.na(tt)]<-0> tt[,"作者"] <- factor(tt[,"作者"])
> model <- svm(作者 ~ ., data = tt[c(1:4,7:14,17:18),], kernel = "sigmoid")
> summary(model)
Call:
svm(formula = 作者 ~ ., data = tt[c(1:4, 7:14, 17:18), ], kernel = "sigmoid")
Parameters:
SVM-Type: C-classification
SVM-Kernel: sigmoid
cost: 1
gamma: 0.01666667
coef.0: 0Number of Support Vectors: 10( 4 4 2 )
Number of Classes: 3Levels:
潘石屹 任志強 王石
> ## 模型擬合測試 ##> ## 訓練集(樣本內)擬合 ##> pred <- predict(model, tt[c(1:4,7:14,17:18),1:length(hh)])
> table(pred, tt[c(1:4,7:14,17:18),"作者"])
pred 潘石屹 任志強 王石
潘石屹 7 0 0
任志強 1 4 0
王石 0 0 2> ## 測試集(樣本外)預測 ##> pred <- predict(model, tt[c(5:6,15:16,19),1:length(hh)])
> table(pred, tt[c(5:6,15:16,19),"作者"])
pred 潘石屹 任志強 王石
潘石屹 2 0 0
任志強 0 2 0
王石 0 0 1
訓練集中有一個錯的,但預測集中全中。 ******************************************************* 哪麼隨機找兩段他們的話看能判斷出嗎?
>
> test <- c("昨天休息了一天,駐地村子現在很大,二年前很小,自首位成功登上珠穆朗瑪峰的探險家埃德蒙.希拉里組織義工建立學校醫療診所,當地條件開始顯著改善,目前這裡三分之一的當地人已經移民國外,境外一些人士建立了一些家庭小旅館,衛生條件不錯,紐西蘭獅子會建立了一家小衛生所,以改善當地的醫療條件。這些讓我體會到登山這項運動對當地生活條件改善的有益影響。")
>………………
> tt1[,c(test_h)] <- test_tt[,c(test_h)]
> tt1[is.na(tt1)]<-0> predict(model, tt1)
1
王石
Levels: 潘石屹 任志強 王石
>
對了,是《珠峰零公里口述之四 (2010-4-9 16:06:22)》中的一段話。 ++++++++++++++++++++++++++++++++++++++++
> test <- c("2007年出臺的“第二套住房的信貸”新政,讓中國的房地產市場調頭直下,在“兩防”的政策推力和美國的金融危機雙重作用之下,讓中國的巨集觀經濟也隨之調頭直下,GDP快速下降到6.3%,從而讓中國政府不得不用四萬億元投資、放量的貨幣信貸和解封“第二套住房信貸”改為0.7倍信貸降息和對改善性住房(實際的第二套)信貸給以支援,才讓中國的房地產和巨集觀經濟從谷底翻轉恢復到保八之上。
+ ")
……………………
> tt1[,c(test_h)] <- test_tt[,c(test_h)]
> tt1[is.na(tt1)]<-0> predict(model, tt1)
1
任志強
Levels: 潘石屹 任志強 王石
>
也對了,是《何需分清幾套房 (2010-4-29 9:38:52) 》中的一段話
那麼下面這段文字是誰寫的呢?
test <- c("經常有人問我第一桶金怎麼來的,從哪裡得到的,有多少。其實每次有人問我這個問題時,我都想說,人的第一桶金是自信。即使你沒錢也不要怕,自信就是你的資本。也有人在自信前面加了一個不好的修飾語,叫盲目自信,我不太愛聽。我說過很多次自我的害處,但我認為與自我有點關係的不多的好東西之一,就是自信。自信當然有自我意識,還有信,相信的信。相信,是正面的、健康的。要相信自己。一個相信自己的人才會相信他人,相信未來。")
> predict(model, tt1) 1潘石屹
Levels: 潘石屹 任志強 王石
太神奇了!潘石屹——《自信是人生第一桶金》的一段。見下面的連結:
http://www.pinggu.org/bbs/thread-863705-1-1.html
再根據他們所用的詞頻看看他們三人之關係誰更近一點:
> dist(tt_s)
..........潘石屹 任志強
任志強 243.6945
王石 161.1552 204.2890